From 687807062c5bec501f432398113694f9a1fd7951 Mon Sep 17 00:00:00 2001 From: shannentan <86601208+shannentan@users.noreply.github.com> Date: Thu, 2 Mar 2023 15:15:02 +0800 Subject: [PATCH 001/207] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f82e2494b7..fef1850dcc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Duke project template +# BagPacker project template This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. From eea988251421cc44ceba42a164f68089c5dd5441 Mon Sep 17 00:00:00 2001 From: Sophie Date: Thu, 2 Mar 2023 15:36:37 +0800 Subject: [PATCH 002/207] Add name --- docs/AboutUs.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..733c2a5ccc 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:---------------------:|:--------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Yinxuan (Sophie) Tang | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From c3e9bfef04b0cd1900b11abdbf11bb825908dab9 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 2 Mar 2023 20:20:46 +0800 Subject: [PATCH 003/207] Added Linus' Profile to About Us file --- docs/AboutUs.md | 14 +++++++------- docs/DeveloperGuide.md | 2 +- docs/team/LinusPortfolio.md | 11 +++++++++++ docs/team/johndoe.md | 1 - 4 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 docs/team/LinusPortfolio.md diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..822c119648 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:----------:|:--------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://i.ibb.co/FHBJtW7/myface.png) | Linus Puah | [Github](https://github.com/linuspuah) | [Portfolio](docs/team/LinusPortfolio.md) +![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 64e1f0ed2b..a9cccc14b2 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,4 +1,4 @@ -# Developer Guide +[DeveloperGuide.md](DeveloperGuide.md)# Developer Guide ## Acknowledgements diff --git a/docs/team/LinusPortfolio.md b/docs/team/LinusPortfolio.md new file mode 100644 index 0000000000..425b2536e9 --- /dev/null +++ b/docs/team/LinusPortfolio.md @@ -0,0 +1,11 @@ +[LinusPortfolio.md](LinusPortfolio.md) # portfolio + +# Linus Puah Jia He - Project Portfolio Page + +## Overview + +### Summary of Contributions + + + + diff --git a/docs/team/johndoe.md b/docs/team/johndoe.md index ab75b391b8..3f71e55207 100644 --- a/docs/team/johndoe.md +++ b/docs/team/johndoe.md @@ -1,4 +1,3 @@ -# John Doe - Project Portfolio Page ## Overview From 95a56a4e307644bfc290a4e5b92a16e6f0c385b5 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 8 Mar 2023 17:25:30 +0800 Subject: [PATCH 004/207] Add io and parser functions --- src/main/java/bagPacker/BagPacker.java | 50 ++++++++++++++ .../exception/emptyInputException.java | 4 ++ src/main/java/bagPacker/ioHandler/Parser.java | 65 +++++++++++++++++++ .../java/bagPacker/ioHandler/Storage.java | 6 ++ src/main/java/bagPacker/ioHandler/Ui.java | 64 ++++++++++++++++++ .../java/bagPacker/listFunction/Commands.java | 6 ++ .../java/bagPacker/listFunction/Item.java | 7 ++ .../bagPacker/listFunction/PackingList.java | 6 ++ src/main/java/seedu/duke/Duke.java | 21 ------ .../BagPackerTest.java} | 8 ++- .../bagPacker/ioHandlerTest/ParserTest.java | 17 +++++ .../bagPacker/ioHandlerTest/StorageTest.java | 15 +++++ .../listFunctionTest/CommandsTest.java | 15 +++++ .../bagPacker/listFunctionTest/ItemTest.java | 15 +++++ .../listFunctionTest/PackingListTest.java | 15 +++++ 15 files changed, 290 insertions(+), 24 deletions(-) create mode 100644 src/main/java/bagPacker/BagPacker.java create mode 100644 src/main/java/bagPacker/exception/emptyInputException.java create mode 100644 src/main/java/bagPacker/ioHandler/Parser.java create mode 100644 src/main/java/bagPacker/ioHandler/Storage.java create mode 100644 src/main/java/bagPacker/ioHandler/Ui.java create mode 100644 src/main/java/bagPacker/listFunction/Commands.java create mode 100644 src/main/java/bagPacker/listFunction/Item.java create mode 100644 src/main/java/bagPacker/listFunction/PackingList.java delete mode 100644 src/main/java/seedu/duke/Duke.java rename src/test/java/{seedu/duke/DukeTest.java => bagPacker/BagPackerTest.java} (64%) create mode 100644 src/test/java/bagPacker/ioHandlerTest/ParserTest.java create mode 100644 src/test/java/bagPacker/ioHandlerTest/StorageTest.java create mode 100644 src/test/java/bagPacker/listFunctionTest/CommandsTest.java create mode 100644 src/test/java/bagPacker/listFunctionTest/ItemTest.java create mode 100644 src/test/java/bagPacker/listFunctionTest/PackingListTest.java diff --git a/src/main/java/bagPacker/BagPacker.java b/src/main/java/bagPacker/BagPacker.java new file mode 100644 index 0000000000..548cd398d0 --- /dev/null +++ b/src/main/java/bagPacker/BagPacker.java @@ -0,0 +1,50 @@ +package bagPacker; + +import bagPacker.ioHandler.Ui; +import bagPacker.ioHandler.Parser; + +public class BagPacker { + /** + * Main entry-point for the java.BagPacker application. + */ + public static void main(String[] args) { + //initialise BagPacker program + Ui.initialMessage(); + + //run main program + runBagPacker(); + + //Close program + Ui.goodbyeMessage(); + } + + public static void runBagPacker() { + Parser.receiveInput(); + while (!Parser.getCommand().equals("bye")) { + switch (Parser.getCommand()) { + case "add": + //Add add function + break; + case "remove": + //Add remove function + break; + case "pack": + //Add pack function + break; + case "unpack": + //Add unpack function + break; + case "list": + //Add list function + break; + case "help": + Ui.helpMessage(); + break; + default: + Ui.errorMessage("'" + Parser.getCommand() + "' is an invalid User Command", "input 'help' to receive all valid commands"); + break; + } + Parser.receiveInput(); + } + } +} \ No newline at end of file diff --git a/src/main/java/bagPacker/exception/emptyInputException.java b/src/main/java/bagPacker/exception/emptyInputException.java new file mode 100644 index 0000000000..949059121e --- /dev/null +++ b/src/main/java/bagPacker/exception/emptyInputException.java @@ -0,0 +1,4 @@ +package bagPacker.exception; + +public class emptyInputException extends Exception { +} diff --git a/src/main/java/bagPacker/ioHandler/Parser.java b/src/main/java/bagPacker/ioHandler/Parser.java new file mode 100644 index 0000000000..960b1bb111 --- /dev/null +++ b/src/main/java/bagPacker/ioHandler/Parser.java @@ -0,0 +1,65 @@ +package bagPacker.ioHandler; + +import bagPacker.exception.emptyInputException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Scanner; + +/** + * Parser class contains methods to manipulate user input + */ +public class Parser { + private static ArrayList inputStringArray; + private static String fullInput; + public static void setFullInput(String fullInput) { + Parser.fullInput = fullInput; + } + /** + * Returns the user input as in ArrayList format + */ + public static ArrayList getInputStringArray() { + return inputStringArray; + } + public static void setInputStringArray(ArrayList inputStringArray) { + Parser.inputStringArray = inputStringArray; + } + /** + * Returns the user input in String format + */ + public static String getFullInput() { + return fullInput; + } + public static ArrayList receiveInput() { + String inputLine = ""; + while(inputLine.isEmpty()){ + try { + inputLine = readLine(); + } catch (emptyInputException e) { + Ui.errorMessage("Empty input received", "try to input a command, to view all commands input \'help\'"); + } + } + setFullInput(inputLine); + String[] inputStringList = inputLine.split(" "); + setInputStringArray(new ArrayList(Arrays.asList(inputStringList))); + return getInputStringArray(); + } + + private static String readLine() throws emptyInputException { + String inputLine; + Scanner in = new Scanner(System.in); + inputLine = in.nextLine().trim(); + if(inputLine.isEmpty()){ + throw new emptyInputException(); + } + return inputLine; + } + + /** + * Returns the user command in lower case + */ + public static String getCommand() { + return getInputStringArray().get(0).toLowerCase(); + } + + +} diff --git a/src/main/java/bagPacker/ioHandler/Storage.java b/src/main/java/bagPacker/ioHandler/Storage.java new file mode 100644 index 0000000000..c735fc543c --- /dev/null +++ b/src/main/java/bagPacker/ioHandler/Storage.java @@ -0,0 +1,6 @@ +package bagPacker.ioHandler; +/** + * Storage class contains methods to save and retrieve saved packing list in txt file + */ +public class Storage { +} diff --git a/src/main/java/bagPacker/ioHandler/Ui.java b/src/main/java/bagPacker/ioHandler/Ui.java new file mode 100644 index 0000000000..9c873ad278 --- /dev/null +++ b/src/main/java/bagPacker/ioHandler/Ui.java @@ -0,0 +1,64 @@ +package bagPacker.ioHandler; +/** + * Ui class contains methods to print messages to user interface on Command Line Interface + */ +public class Ui { + public static void printErrorLine() { + System.out.println("/////////////////////////////////////////////////////////////"); + } + public static void printLine() { + System.out.println("____________________________________________________________"); + } + public static String logo = " ____ _____ _\n" + + "| _ \\ | __ \\ | | \n" + + "| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __\n" + + "| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \\ '__|\n" + + "| |_) | (_| | (_| | | | (_| | (__| < __/ |\n" + + "|____/ \\__,_|\\__, |_| \\__,_|\\___|_|\\_\\___|_|\n" + + " __/ | \n" + + " |___/\n"; + /** + * Prints initialising Message + */ + public static void initialMessage(){ + printLine(); + System.out.println("Hi this is,\n" + logo); + System.out.println("Enter \"help\" to find out how to use BagPacker"); + printLine(); + } + /** + * Prints goodbye Message + */ + public static void goodbyeMessage(){ + printLine(); + System.out.println("Bye thanks for using,\n" + logo); + printLine(); + } + + /** + * Prints Error Message with the type of error and a helping message + * + * @param ErrorType the type of error (e.g. invalid integer input) + * @param helpMessage a message to help the user (e.g. try to input a whole number digit) + */ + public static void errorMessage(String ErrorType, String helpMessage) { + printErrorLine(); + System.out.print("Error " + ErrorType); + System.out.println(":\n" + helpMessage); + printErrorLine(); + } + + /** + * Prints help message + */ + public static void helpMessage() { + printLine(); + System.out.println("All Commands:"); + System.out.println("1. \'add n/ITEM\'"); + System.out.println("2. \'remove n/ITEM_INDEX\'"); + System.out.println("2. \'list\'"); + System.out.println("3. \'pack n/ITEM_INDEX\' "); + System.out.println("4. \'unpack n/ITEM_INDEX\'"); + printLine(); + } +} diff --git a/src/main/java/bagPacker/listFunction/Commands.java b/src/main/java/bagPacker/listFunction/Commands.java new file mode 100644 index 0000000000..07d53a73ca --- /dev/null +++ b/src/main/java/bagPacker/listFunction/Commands.java @@ -0,0 +1,6 @@ +package bagPacker.listFunction; +/** + * Commands class used to execute given commands from user + */ +public class Commands { +} diff --git a/src/main/java/bagPacker/listFunction/Item.java b/src/main/java/bagPacker/listFunction/Item.java new file mode 100644 index 0000000000..dbbdf6186f --- /dev/null +++ b/src/main/java/bagPacker/listFunction/Item.java @@ -0,0 +1,7 @@ +package bagPacker.listFunction; +/** + * Item class used to store information about item + * Items to be packed can be saved in PackingList class + */ +public class Item { +} diff --git a/src/main/java/bagPacker/listFunction/PackingList.java b/src/main/java/bagPacker/listFunction/PackingList.java new file mode 100644 index 0000000000..022a7bf3f3 --- /dev/null +++ b/src/main/java/bagPacker/listFunction/PackingList.java @@ -0,0 +1,6 @@ +package bagPacker.listFunction; +/** + * PackingList class contains methods to manipulate the users packing list + */ +public class PackingList { +} diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java deleted file mode 100644 index 5c74e68d59..0000000000 --- a/src/main/java/seedu/duke/Duke.java +++ /dev/null @@ -1,21 +0,0 @@ -package seedu.duke; - -import java.util.Scanner; - -public class Duke { - /** - * Main entry-point for the java.duke.Duke application. - */ - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - System.out.println("What is your name?"); - - Scanner in = new Scanner(System.in); - System.out.println("Hello " + in.nextLine()); - } -} diff --git a/src/test/java/seedu/duke/DukeTest.java b/src/test/java/bagPacker/BagPackerTest.java similarity index 64% rename from src/test/java/seedu/duke/DukeTest.java rename to src/test/java/bagPacker/BagPackerTest.java index 2dda5fd651..db037a8fae 100644 --- a/src/test/java/seedu/duke/DukeTest.java +++ b/src/test/java/bagPacker/BagPackerTest.java @@ -1,10 +1,12 @@ -package seedu.duke; +package bagPacker; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; - -class DukeTest { +/** + * BagPackerTest class test BagPacker methods + */ +class BagPackerTest { @Test public void sampleTest() { assertTrue(true); diff --git a/src/test/java/bagPacker/ioHandlerTest/ParserTest.java b/src/test/java/bagPacker/ioHandlerTest/ParserTest.java new file mode 100644 index 0000000000..6940d6984d --- /dev/null +++ b/src/test/java/bagPacker/ioHandlerTest/ParserTest.java @@ -0,0 +1,17 @@ +package bagPacker.ioHandlerTest; +import org.junit.jupiter.api.Test; + + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * ParserTest to test Parser Class + */ +public class ParserTest { + @Test + public void sampleTest() { + assertTrue(true); + } + +} diff --git a/src/test/java/bagPacker/ioHandlerTest/StorageTest.java b/src/test/java/bagPacker/ioHandlerTest/StorageTest.java new file mode 100644 index 0000000000..379ad20c15 --- /dev/null +++ b/src/test/java/bagPacker/ioHandlerTest/StorageTest.java @@ -0,0 +1,15 @@ +package bagPacker.ioHandlerTest; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * StorageTest class test Storage methods + */ +public class StorageTest { + @Test + public void sampleTest() { + assertTrue(true); + } +} diff --git a/src/test/java/bagPacker/listFunctionTest/CommandsTest.java b/src/test/java/bagPacker/listFunctionTest/CommandsTest.java new file mode 100644 index 0000000000..4900a45218 --- /dev/null +++ b/src/test/java/bagPacker/listFunctionTest/CommandsTest.java @@ -0,0 +1,15 @@ +package bagPacker.listFunctionTest; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * CommandsTest to test methods in Commands class + */ +public class CommandsTest { + @Test + public void sampleTest() { + assertTrue(true); + } +} diff --git a/src/test/java/bagPacker/listFunctionTest/ItemTest.java b/src/test/java/bagPacker/listFunctionTest/ItemTest.java new file mode 100644 index 0000000000..fae81c1762 --- /dev/null +++ b/src/test/java/bagPacker/listFunctionTest/ItemTest.java @@ -0,0 +1,15 @@ +package bagPacker.listFunctionTest; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * ItemTest to test methods in Item Class + */ +public class ItemTest { + @Test + public void sampleTest() { + assertTrue(true); + } +} diff --git a/src/test/java/bagPacker/listFunctionTest/PackingListTest.java b/src/test/java/bagPacker/listFunctionTest/PackingListTest.java new file mode 100644 index 0000000000..e5c539dde5 --- /dev/null +++ b/src/test/java/bagPacker/listFunctionTest/PackingListTest.java @@ -0,0 +1,15 @@ +package bagPacker.listFunctionTest; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * PackingListTest to test methods in PackingList class + */ +public class PackingListTest { + @Test + public void sampleTest() { + assertTrue(true); + } +} From 5625c513cec56db84103b98329748c3dae91c464 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 8 Mar 2023 17:29:15 +0800 Subject: [PATCH 005/207] Clean up ioHandler code style --- src/main/java/bagPacker/ioHandler/Parser.java | 7 +++---- src/main/java/bagPacker/ioHandler/Ui.java | 10 +++++----- src/test/java/bagPacker/ioHandlerTest/ParserTest.java | 3 --- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/main/java/bagPacker/ioHandler/Parser.java b/src/main/java/bagPacker/ioHandler/Parser.java index 960b1bb111..6f943c0d0c 100644 --- a/src/main/java/bagPacker/ioHandler/Parser.java +++ b/src/main/java/bagPacker/ioHandler/Parser.java @@ -29,19 +29,18 @@ public static void setInputStringArray(ArrayList inputStringArray) { public static String getFullInput() { return fullInput; } - public static ArrayList receiveInput() { + public static void receiveInput() { String inputLine = ""; while(inputLine.isEmpty()){ try { inputLine = readLine(); } catch (emptyInputException e) { - Ui.errorMessage("Empty input received", "try to input a command, to view all commands input \'help\'"); + Ui.errorMessage("Empty input received", "try to input a command, to view all commands input 'help'"); } } setFullInput(inputLine); String[] inputStringList = inputLine.split(" "); - setInputStringArray(new ArrayList(Arrays.asList(inputStringList))); - return getInputStringArray(); + setInputStringArray(new ArrayList<>(Arrays.asList(inputStringList))); } private static String readLine() throws emptyInputException { diff --git a/src/main/java/bagPacker/ioHandler/Ui.java b/src/main/java/bagPacker/ioHandler/Ui.java index 9c873ad278..e109735663 100644 --- a/src/main/java/bagPacker/ioHandler/Ui.java +++ b/src/main/java/bagPacker/ioHandler/Ui.java @@ -54,11 +54,11 @@ public static void errorMessage(String ErrorType, String helpMessage) { public static void helpMessage() { printLine(); System.out.println("All Commands:"); - System.out.println("1. \'add n/ITEM\'"); - System.out.println("2. \'remove n/ITEM_INDEX\'"); - System.out.println("2. \'list\'"); - System.out.println("3. \'pack n/ITEM_INDEX\' "); - System.out.println("4. \'unpack n/ITEM_INDEX\'"); + System.out.println("1. 'add n/ITEM'"); + System.out.println("2. 'remove n/ITEM_INDEX'"); + System.out.println("2. 'list'"); + System.out.println("3. 'pack n/ITEM_INDEX' "); + System.out.println("4. 'unpack n/ITEM_INDEX'"); printLine(); } } diff --git a/src/test/java/bagPacker/ioHandlerTest/ParserTest.java b/src/test/java/bagPacker/ioHandlerTest/ParserTest.java index 6940d6984d..4389589d26 100644 --- a/src/test/java/bagPacker/ioHandlerTest/ParserTest.java +++ b/src/test/java/bagPacker/ioHandlerTest/ParserTest.java @@ -1,8 +1,5 @@ package bagPacker.ioHandlerTest; import org.junit.jupiter.api.Test; - - -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; /** From 6febdffbc5fc3cfc820535db9242fb98f5f38421 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 8 Mar 2023 17:51:15 +0800 Subject: [PATCH 006/207] Refactor code to match code style --- .../exception/emptyInputException.java | 4 ---- .../{bagPacker => bagpacker}/BagPacker.java | 11 +++++----- .../exception/EmptyInputException.java | 4 ++++ .../iohandler}/Parser.java | 12 +++++------ .../iohandler}/Storage.java | 2 +- .../ioHandler => bagpacker/iohandler}/Ui.java | 20 +++++++++---------- .../packingfunc}/Commands.java | 2 +- .../packingfunc}/Item.java | 2 +- .../packingfunc}/PackingList.java | 2 +- .../BagPackerTest.java | 2 +- .../iohandlertest}/ParserTest.java | 2 +- .../iohandlertest}/StorageTest.java | 2 +- .../packingfunctest}/CommandsTest.java | 2 +- .../packingfunctest}/ItemTest.java | 2 +- .../packingfunctest}/PackingListTest.java | 2 +- 15 files changed, 36 insertions(+), 35 deletions(-) delete mode 100644 src/main/java/bagPacker/exception/emptyInputException.java rename src/main/java/{bagPacker => bagpacker}/BagPacker.java (86%) create mode 100644 src/main/java/bagpacker/exception/EmptyInputException.java rename src/main/java/{bagPacker/ioHandler => bagpacker/iohandler}/Parser.java (84%) rename src/main/java/{bagPacker/ioHandler => bagpacker/iohandler}/Storage.java (80%) rename src/main/java/{bagPacker/ioHandler => bagpacker/iohandler}/Ui.java (91%) rename src/main/java/{bagPacker/listFunction => bagpacker/packingfunc}/Commands.java (74%) rename src/main/java/{bagPacker/listFunction => bagpacker/packingfunc}/Item.java (81%) rename src/main/java/{bagPacker/listFunction => bagpacker/packingfunc}/PackingList.java (77%) rename src/test/java/{bagPacker => bagpacker}/BagPackerTest.java (92%) rename src/test/java/{bagPacker/ioHandlerTest => bagpacker/iohandlertest}/ParserTest.java (87%) rename src/test/java/{bagPacker/ioHandlerTest => bagpacker/iohandlertest}/StorageTest.java (88%) rename src/test/java/{bagPacker/listFunctionTest => bagpacker/packingfunctest}/CommandsTest.java (87%) rename src/test/java/{bagPacker/listFunctionTest => bagpacker/packingfunctest}/ItemTest.java (87%) rename src/test/java/{bagPacker/listFunctionTest => bagpacker/packingfunctest}/PackingListTest.java (88%) diff --git a/src/main/java/bagPacker/exception/emptyInputException.java b/src/main/java/bagPacker/exception/emptyInputException.java deleted file mode 100644 index 949059121e..0000000000 --- a/src/main/java/bagPacker/exception/emptyInputException.java +++ /dev/null @@ -1,4 +0,0 @@ -package bagPacker.exception; - -public class emptyInputException extends Exception { -} diff --git a/src/main/java/bagPacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java similarity index 86% rename from src/main/java/bagPacker/BagPacker.java rename to src/main/java/bagpacker/BagPacker.java index 548cd398d0..77215db256 100644 --- a/src/main/java/bagPacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -1,7 +1,7 @@ -package bagPacker; +package bagpacker; -import bagPacker.ioHandler.Ui; -import bagPacker.ioHandler.Parser; +import bagpacker.iohandler.Ui; +import bagpacker.iohandler.Parser; public class BagPacker { /** @@ -41,10 +41,11 @@ public static void runBagPacker() { Ui.helpMessage(); break; default: - Ui.errorMessage("'" + Parser.getCommand() + "' is an invalid User Command", "input 'help' to receive all valid commands"); + Ui.errorMessage("'" + Parser.getCommand() + "' is an invalid User Command", + "input 'help' to receive all valid commands"); break; } Parser.receiveInput(); } } -} \ No newline at end of file +} diff --git a/src/main/java/bagpacker/exception/EmptyInputException.java b/src/main/java/bagpacker/exception/EmptyInputException.java new file mode 100644 index 0000000000..cd89a52e85 --- /dev/null +++ b/src/main/java/bagpacker/exception/EmptyInputException.java @@ -0,0 +1,4 @@ +package bagpacker.exception; + +public class EmptyInputException extends Exception { +} diff --git a/src/main/java/bagPacker/ioHandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java similarity index 84% rename from src/main/java/bagPacker/ioHandler/Parser.java rename to src/main/java/bagpacker/iohandler/Parser.java index 6f943c0d0c..55fb9c2d66 100644 --- a/src/main/java/bagPacker/ioHandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -1,6 +1,6 @@ -package bagPacker.ioHandler; +package bagpacker.iohandler; -import bagPacker.exception.emptyInputException; +import bagpacker.exception.EmptyInputException; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; @@ -15,7 +15,7 @@ public static void setFullInput(String fullInput) { Parser.fullInput = fullInput; } /** - * Returns the user input as in ArrayList format + * Returns the user input as in array list format */ public static ArrayList getInputStringArray() { return inputStringArray; @@ -34,7 +34,7 @@ public static void receiveInput() { while(inputLine.isEmpty()){ try { inputLine = readLine(); - } catch (emptyInputException e) { + } catch (EmptyInputException e) { Ui.errorMessage("Empty input received", "try to input a command, to view all commands input 'help'"); } } @@ -43,12 +43,12 @@ public static void receiveInput() { setInputStringArray(new ArrayList<>(Arrays.asList(inputStringList))); } - private static String readLine() throws emptyInputException { + private static String readLine() throws EmptyInputException { String inputLine; Scanner in = new Scanner(System.in); inputLine = in.nextLine().trim(); if(inputLine.isEmpty()){ - throw new emptyInputException(); + throw new EmptyInputException(); } return inputLine; } diff --git a/src/main/java/bagPacker/ioHandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java similarity index 80% rename from src/main/java/bagPacker/ioHandler/Storage.java rename to src/main/java/bagpacker/iohandler/Storage.java index c735fc543c..ae671df15b 100644 --- a/src/main/java/bagPacker/ioHandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -1,4 +1,4 @@ -package bagPacker.ioHandler; +package bagpacker.iohandler; /** * Storage class contains methods to save and retrieve saved packing list in txt file */ diff --git a/src/main/java/bagPacker/ioHandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java similarity index 91% rename from src/main/java/bagPacker/ioHandler/Ui.java rename to src/main/java/bagpacker/iohandler/Ui.java index e109735663..aa73847e48 100644 --- a/src/main/java/bagPacker/ioHandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -1,14 +1,8 @@ -package bagPacker.ioHandler; +package bagpacker.iohandler; /** * Ui class contains methods to print messages to user interface on Command Line Interface */ public class Ui { - public static void printErrorLine() { - System.out.println("/////////////////////////////////////////////////////////////"); - } - public static void printLine() { - System.out.println("____________________________________________________________"); - } public static String logo = " ____ _____ _\n" + "| _ \\ | __ \\ | | \n" + "| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __\n" @@ -17,6 +11,12 @@ public static void printLine() { + "|____/ \\__,_|\\__, |_| \\__,_|\\___|_|\\_\\___|_|\n" + " __/ | \n" + " |___/\n"; + public static void printErrorLine() { + System.out.println("/////////////////////////////////////////////////////////////"); + } + public static void printLine() { + System.out.println("____________________________________________________________"); + } /** * Prints initialising Message */ @@ -38,12 +38,12 @@ public static void goodbyeMessage(){ /** * Prints Error Message with the type of error and a helping message * - * @param ErrorType the type of error (e.g. invalid integer input) + * @param errorType the type of error (e.g. invalid integer input) * @param helpMessage a message to help the user (e.g. try to input a whole number digit) */ - public static void errorMessage(String ErrorType, String helpMessage) { + public static void errorMessage(String errorType, String helpMessage) { printErrorLine(); - System.out.print("Error " + ErrorType); + System.out.print("Error " + errorType); System.out.println(":\n" + helpMessage); printErrorLine(); } diff --git a/src/main/java/bagPacker/listFunction/Commands.java b/src/main/java/bagpacker/packingfunc/Commands.java similarity index 74% rename from src/main/java/bagPacker/listFunction/Commands.java rename to src/main/java/bagpacker/packingfunc/Commands.java index 07d53a73ca..fb34cdd733 100644 --- a/src/main/java/bagPacker/listFunction/Commands.java +++ b/src/main/java/bagpacker/packingfunc/Commands.java @@ -1,4 +1,4 @@ -package bagPacker.listFunction; +package bagpacker.packingfunc; /** * Commands class used to execute given commands from user */ diff --git a/src/main/java/bagPacker/listFunction/Item.java b/src/main/java/bagpacker/packingfunc/Item.java similarity index 81% rename from src/main/java/bagPacker/listFunction/Item.java rename to src/main/java/bagpacker/packingfunc/Item.java index dbbdf6186f..34911cb8ef 100644 --- a/src/main/java/bagPacker/listFunction/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -1,4 +1,4 @@ -package bagPacker.listFunction; +package bagpacker.packingfunc; /** * Item class used to store information about item * Items to be packed can be saved in PackingList class diff --git a/src/main/java/bagPacker/listFunction/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java similarity index 77% rename from src/main/java/bagPacker/listFunction/PackingList.java rename to src/main/java/bagpacker/packingfunc/PackingList.java index 022a7bf3f3..f65d1b2e62 100644 --- a/src/main/java/bagPacker/listFunction/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -1,4 +1,4 @@ -package bagPacker.listFunction; +package bagpacker.packingfunc; /** * PackingList class contains methods to manipulate the users packing list */ diff --git a/src/test/java/bagPacker/BagPackerTest.java b/src/test/java/bagpacker/BagPackerTest.java similarity index 92% rename from src/test/java/bagPacker/BagPackerTest.java rename to src/test/java/bagpacker/BagPackerTest.java index db037a8fae..dc074577b8 100644 --- a/src/test/java/bagPacker/BagPackerTest.java +++ b/src/test/java/bagpacker/BagPackerTest.java @@ -1,4 +1,4 @@ -package bagPacker; +package bagpacker; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/src/test/java/bagPacker/ioHandlerTest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java similarity index 87% rename from src/test/java/bagPacker/ioHandlerTest/ParserTest.java rename to src/test/java/bagpacker/iohandlertest/ParserTest.java index 4389589d26..2f28ce9495 100644 --- a/src/test/java/bagPacker/ioHandlerTest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -1,4 +1,4 @@ -package bagPacker.ioHandlerTest; +package bagpacker.iohandlertest; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/src/test/java/bagPacker/ioHandlerTest/StorageTest.java b/src/test/java/bagpacker/iohandlertest/StorageTest.java similarity index 88% rename from src/test/java/bagPacker/ioHandlerTest/StorageTest.java rename to src/test/java/bagpacker/iohandlertest/StorageTest.java index 379ad20c15..b98926bd9b 100644 --- a/src/test/java/bagPacker/ioHandlerTest/StorageTest.java +++ b/src/test/java/bagpacker/iohandlertest/StorageTest.java @@ -1,4 +1,4 @@ -package bagPacker.ioHandlerTest; +package bagpacker.iohandlertest; import org.junit.jupiter.api.Test; diff --git a/src/test/java/bagPacker/listFunctionTest/CommandsTest.java b/src/test/java/bagpacker/packingfunctest/CommandsTest.java similarity index 87% rename from src/test/java/bagPacker/listFunctionTest/CommandsTest.java rename to src/test/java/bagpacker/packingfunctest/CommandsTest.java index 4900a45218..01cab9459a 100644 --- a/src/test/java/bagPacker/listFunctionTest/CommandsTest.java +++ b/src/test/java/bagpacker/packingfunctest/CommandsTest.java @@ -1,4 +1,4 @@ -package bagPacker.listFunctionTest; +package bagpacker.packingfunctest; import org.junit.jupiter.api.Test; diff --git a/src/test/java/bagPacker/listFunctionTest/ItemTest.java b/src/test/java/bagpacker/packingfunctest/ItemTest.java similarity index 87% rename from src/test/java/bagPacker/listFunctionTest/ItemTest.java rename to src/test/java/bagpacker/packingfunctest/ItemTest.java index fae81c1762..e45e50c156 100644 --- a/src/test/java/bagPacker/listFunctionTest/ItemTest.java +++ b/src/test/java/bagpacker/packingfunctest/ItemTest.java @@ -1,4 +1,4 @@ -package bagPacker.listFunctionTest; +package bagpacker.packingfunctest; import org.junit.jupiter.api.Test; diff --git a/src/test/java/bagPacker/listFunctionTest/PackingListTest.java b/src/test/java/bagpacker/packingfunctest/PackingListTest.java similarity index 88% rename from src/test/java/bagPacker/listFunctionTest/PackingListTest.java rename to src/test/java/bagpacker/packingfunctest/PackingListTest.java index e5c539dde5..46f883b104 100644 --- a/src/test/java/bagPacker/listFunctionTest/PackingListTest.java +++ b/src/test/java/bagpacker/packingfunctest/PackingListTest.java @@ -1,4 +1,4 @@ -package bagPacker.listFunctionTest; +package bagpacker.packingfunctest; import org.junit.jupiter.api.Test; From 4fc0027dce7867afa4e203baeee87f2c40960a4b Mon Sep 17 00:00:00 2001 From: coregano Date: Thu, 9 Mar 2023 13:29:25 +0800 Subject: [PATCH 007/207] Add subclasses of class Commands: AddCommand, DeleteComamnd, PackCommand, ListCommand, HelpCommand Add package bag.packer.commands for class Commands and relevant subclasses Move Commands class from package bagpacker.packingfunc to package pagpacker.commands Add code for classes Storage, Commands, AddCommand Add new method printToUser in class Ui, prints param Add goodbyeMessage and Storage.save methods in Main Let's, * apply JavaDocs to more important methods * finish runtest file --- src/main/java/bagpacker/BagPacker.java | 6 +++ .../java/bagpacker/commands/AddCommand.java | 24 ++++++++++ .../java/bagpacker/commands/Commands.java | 47 +++++++++++++++++++ .../bagpacker/commands/DeleteCommand.java | 10 ++++ .../java/bagpacker/commands/HelpCommand.java | 10 ++++ .../java/bagpacker/commands/ListCommand.java | 10 ++++ .../java/bagpacker/commands/PackCommand.java | 10 ++++ src/main/java/bagpacker/iohandler/Parser.java | 1 + .../java/bagpacker/iohandler/Storage.java | 40 ++++++++++++++++ src/main/java/bagpacker/iohandler/Ui.java | 12 +++++ .../java/bagpacker/packingfunc/Commands.java | 6 --- src/main/java/bagpacker/packingfunc/Item.java | 23 +++++++++ .../bagpacker/packingfunc/PackingList.java | 26 ++++++++++ 13 files changed, 219 insertions(+), 6 deletions(-) create mode 100644 src/main/java/bagpacker/commands/AddCommand.java create mode 100644 src/main/java/bagpacker/commands/Commands.java create mode 100644 src/main/java/bagpacker/commands/DeleteCommand.java create mode 100644 src/main/java/bagpacker/commands/HelpCommand.java create mode 100644 src/main/java/bagpacker/commands/ListCommand.java create mode 100644 src/main/java/bagpacker/commands/PackCommand.java delete mode 100644 src/main/java/bagpacker/packingfunc/Commands.java diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index 77215db256..224287591b 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -1,9 +1,12 @@ package bagpacker; +import bagpacker.iohandler.Storage; import bagpacker.iohandler.Ui; import bagpacker.iohandler.Parser; +import bagpacker.packingfunc.PackingList; public class BagPacker { + private static PackingList packingList; /** * Main entry-point for the java.BagPacker application. */ @@ -47,5 +50,8 @@ public static void runBagPacker() { } Parser.receiveInput(); } + + Storage.save(packingList); + Ui.goodbyeMessage(); } } diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java new file mode 100644 index 0000000000..e4c59fce05 --- /dev/null +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -0,0 +1,24 @@ +package bagpacker.commands; + +import bagpacker.iohandler.Ui; +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; + +public class AddCommand extends Commands { + public static final String MSG_SUCCESS_ADD = "New item added: %s"; + public static final String MSG_USAGE_ADD = "add : Adds an item to the packing list.\n" + + "Example: add toothbrush"; + + private final Item item; + + public AddCommand(Item item) { + this.item = item; + } + + @Override + public void execute(PackingList packingList) { + this.packingList = packingList; + packingList.addItem(item); + Ui.printToUser(String.format(MSG_SUCCESS_ADD, item)); + } +} diff --git a/src/main/java/bagpacker/commands/Commands.java b/src/main/java/bagpacker/commands/Commands.java new file mode 100644 index 0000000000..0164f62f6f --- /dev/null +++ b/src/main/java/bagpacker/commands/Commands.java @@ -0,0 +1,47 @@ +package bagpacker.commands; + +import bagpacker.iohandler.Ui; +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; + +/** + * Commands class used to execute given commands from user + */ +public abstract class Commands { + protected PackingList packingList; + private int targetIndex = -1; + + /** + * @param targetIndex listing index of the target item + */ + public Commands(int targetIndex) { + this.setTargetIndex(targetIndex); + } + + protected Commands() { + } + + /** + * Executes the command. + */ + public void execute(Item item, Ui ui) { + }; + + public void setTargetIndex(int targetIndex) { + this.targetIndex = targetIndex; + } + public int getTargetIndex() { + return targetIndex; + } + + /** + * Extracts the target item in the list. + * + * @throws IndexOutOfBoundsException if the target index is out of bounds + */ + protected Item getTargetItem() throws IndexOutOfBoundsException { + return packingList.get(getTargetIndex() - 1); + } + + public abstract void execute(PackingList packingList); +} \ No newline at end of file diff --git a/src/main/java/bagpacker/commands/DeleteCommand.java b/src/main/java/bagpacker/commands/DeleteCommand.java new file mode 100644 index 0000000000..d685464ab6 --- /dev/null +++ b/src/main/java/bagpacker/commands/DeleteCommand.java @@ -0,0 +1,10 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.PackingList; + +public class DeleteCommand extends Commands{ + @Override + public void execute(PackingList packingList) { + + } +} diff --git a/src/main/java/bagpacker/commands/HelpCommand.java b/src/main/java/bagpacker/commands/HelpCommand.java new file mode 100644 index 0000000000..739b87d568 --- /dev/null +++ b/src/main/java/bagpacker/commands/HelpCommand.java @@ -0,0 +1,10 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.PackingList; + +public class HelpCommand extends Commands{ + @Override + public void execute(PackingList packingList) { + + } +} diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java new file mode 100644 index 0000000000..49ba1c4c02 --- /dev/null +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -0,0 +1,10 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.PackingList; + +public class ListCommand extends Commands{ + @Override + public void execute(PackingList packingList) { + + } +} diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java new file mode 100644 index 0000000000..10a06ba8c1 --- /dev/null +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -0,0 +1,10 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.PackingList; + +public class PackCommand extends Commands{ + @Override + public void execute(PackingList packingList) { + + } +} diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 55fb9c2d66..e5c229a315 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -14,6 +14,7 @@ public class Parser { public static void setFullInput(String fullInput) { Parser.fullInput = fullInput; } + /** * Returns the user input as in array list format */ diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java index ae671df15b..bb7493a4bc 100644 --- a/src/main/java/bagpacker/iohandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -1,6 +1,46 @@ package bagpacker.iohandler; + +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Scanner; + /** * Storage class contains methods to save and retrieve saved packing list in txt file */ public class Storage { + private static String FILE_PATH = null; + public static ArrayList packingList = new ArrayList<>(); + public static ArrayList load() throws FileNotFoundException { + Scanner reader = new Scanner(new File(FILE_PATH)); + String line; + while (reader.hasNext()) { + line = reader.nextLine(); + boolean isPacked = line.charAt(1) == 'X'; + String itemDesc = line.substring(4); + Item item = new Item(itemDesc, isPacked); + packingList.add(item); + } + return packingList; + } + + public static void save(PackingList packingList) { + try { + writeToFile(packingList); + } catch (IOException e) { + System.out.println("Something went wrong: " + e.getMessage()); + } + } + + public static void writeToFile(PackingList packingList) throws IOException { + FileWriter fw = new FileWriter(FILE_PATH); + for (int i = 0; i < packingList.size(); i++) { + fw.write(packingList.get(i).toString() + "\n"); + } + } } diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index aa73847e48..823b14751c 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -61,4 +61,16 @@ public static void helpMessage() { System.out.println("4. 'unpack n/ITEM_INDEX'"); printLine(); } + + /** + * Prints messages(s) to the user + * @param message + */ + public static void printToUser(String... message) { + printLine(); + for (String m : message) { + System.out.println(m); + } + printLine(); + } } diff --git a/src/main/java/bagpacker/packingfunc/Commands.java b/src/main/java/bagpacker/packingfunc/Commands.java deleted file mode 100644 index fb34cdd733..0000000000 --- a/src/main/java/bagpacker/packingfunc/Commands.java +++ /dev/null @@ -1,6 +0,0 @@ -package bagpacker.packingfunc; -/** - * Commands class used to execute given commands from user - */ -public class Commands { -} diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index 34911cb8ef..c764e7781d 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -4,4 +4,27 @@ * Items to be packed can be saved in PackingList class */ public class Item { + private String itemName; + private boolean isPacked; + public Item(String description) { + this.itemName = description; + isPacked = false; + } + public Item(String description, boolean isPacked) { + this.itemName = description; + this.isPacked = isPacked; + } + public String getItemName() { + return itemName; + } + public boolean isPacked() { + return isPacked; + } + public void setPacked(boolean packed) { + isPacked = packed; + } + + public String toString() { + return "[" + this.isPacked() + "] " + this.getItemName(); + } } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index f65d1b2e62..46ef7a469b 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -1,6 +1,32 @@ package bagpacker.packingfunc; + +import java.util.ArrayList; +import java.util.List; + /** * PackingList class contains methods to manipulate the users packing list */ public class PackingList { + private static List allItems = new ArrayList<>(); + + /** + * Adds a task to the list. + */ + public void addItem(Item toAdd) { + allItems.add(toAdd); + } + + public Item get(int itemIndex) { + return allItems.get(itemIndex); + } + + /** + * Returns the number of {@link Item}s in the packing list. + * @return int of packing list size + */ + public int size() { + return allItems.size(); + } + + } From 279e0f6106efeda0225b12cafdb8a7a50b5e9dea Mon Sep 17 00:00:00 2001 From: coregano Date: Thu, 9 Mar 2023 17:10:21 +0800 Subject: [PATCH 008/207] Edit code to pass CheckStyle test in classes: AddCommad, Commands, DeleteCommand, HelpCommand, ListCommand, PackCommand, Storage --- src/main/java/bagpacker/commands/AddCommand.java | 2 +- src/main/java/bagpacker/commands/Commands.java | 16 ++++++---------- .../java/bagpacker/commands/DeleteCommand.java | 3 ++- .../java/bagpacker/commands/HelpCommand.java | 3 ++- .../java/bagpacker/commands/ListCommand.java | 3 ++- .../java/bagpacker/commands/PackCommand.java | 3 ++- src/main/java/bagpacker/iohandler/Storage.java | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index e4c59fce05..89e01f2dac 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -16,7 +16,7 @@ public AddCommand(Item item) { } @Override - public void execute(PackingList packingList) { + public void execute(PackingList packingList, Ui ui) { this.packingList = packingList; packingList.addItem(item); Ui.printToUser(String.format(MSG_SUCCESS_ADD, item)); diff --git a/src/main/java/bagpacker/commands/Commands.java b/src/main/java/bagpacker/commands/Commands.java index 0164f62f6f..27062b8e9c 100644 --- a/src/main/java/bagpacker/commands/Commands.java +++ b/src/main/java/bagpacker/commands/Commands.java @@ -20,13 +20,6 @@ public Commands(int targetIndex) { protected Commands() { } - - /** - * Executes the command. - */ - public void execute(Item item, Ui ui) { - }; - public void setTargetIndex(int targetIndex) { this.targetIndex = targetIndex; } @@ -42,6 +35,9 @@ public int getTargetIndex() { protected Item getTargetItem() throws IndexOutOfBoundsException { return packingList.get(getTargetIndex() - 1); } - - public abstract void execute(PackingList packingList); -} \ No newline at end of file + /** + * Executes the command. + */ + public void execute(PackingList packingList, Ui ui) { + }; +} diff --git a/src/main/java/bagpacker/commands/DeleteCommand.java b/src/main/java/bagpacker/commands/DeleteCommand.java index d685464ab6..3e7edb0393 100644 --- a/src/main/java/bagpacker/commands/DeleteCommand.java +++ b/src/main/java/bagpacker/commands/DeleteCommand.java @@ -1,10 +1,11 @@ package bagpacker.commands; +import bagpacker.iohandler.Ui; import bagpacker.packingfunc.PackingList; public class DeleteCommand extends Commands{ @Override - public void execute(PackingList packingList) { + public void execute(PackingList packingList, Ui ui) { } } diff --git a/src/main/java/bagpacker/commands/HelpCommand.java b/src/main/java/bagpacker/commands/HelpCommand.java index 739b87d568..bf185edfbd 100644 --- a/src/main/java/bagpacker/commands/HelpCommand.java +++ b/src/main/java/bagpacker/commands/HelpCommand.java @@ -1,10 +1,11 @@ package bagpacker.commands; +import bagpacker.iohandler.Ui; import bagpacker.packingfunc.PackingList; public class HelpCommand extends Commands{ @Override - public void execute(PackingList packingList) { + public void execute(PackingList packingList, Ui ui) { } } diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index 49ba1c4c02..2bed4bf0fa 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -1,10 +1,11 @@ package bagpacker.commands; +import bagpacker.iohandler.Ui; import bagpacker.packingfunc.PackingList; public class ListCommand extends Commands{ @Override - public void execute(PackingList packingList) { + public void execute(PackingList packingList, Ui ui) { } } diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 10a06ba8c1..7c79e87ccf 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -1,10 +1,11 @@ package bagpacker.commands; +import bagpacker.iohandler.Ui; import bagpacker.packingfunc.PackingList; public class PackCommand extends Commands{ @Override - public void execute(PackingList packingList) { + public void execute(PackingList packingList, Ui ui) { } } diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java index bb7493a4bc..6fe799e167 100644 --- a/src/main/java/bagpacker/iohandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -14,8 +14,8 @@ * Storage class contains methods to save and retrieve saved packing list in txt file */ public class Storage { - private static String FILE_PATH = null; public static ArrayList packingList = new ArrayList<>(); + private static final String FILE_PATH = "packingList.txt"; public static ArrayList load() throws FileNotFoundException { Scanner reader = new Scanner(new File(FILE_PATH)); String line; From 522e2ac45c61e6c541980f5efe4e147824f645b5 Mon Sep 17 00:00:00 2001 From: coregano Date: Sat, 11 Mar 2023 15:33:26 +0800 Subject: [PATCH 009/207] Update input.txt and EXPECTED.TXT for testing --- src/main/java/bagpacker/BagPacker.java | 4 +-- .../java/bagpacker/commands/Commands.java | 14 ++++---- .../java/bagpacker/iohandler/Storage.java | 16 +++++----- .../bagpacker/packingfunc/PackingList.java | 28 ++++++++-------- text-ui-test/EXPECTED.TXT | 32 ++++++++++++++----- text-ui-test/input.txt | 2 +- 6 files changed, 56 insertions(+), 40 deletions(-) diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index 224287591b..ef0c15f413 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -50,8 +50,6 @@ public static void runBagPacker() { } Parser.receiveInput(); } - - Storage.save(packingList); - Ui.goodbyeMessage(); + Storage.save(); } } diff --git a/src/main/java/bagpacker/commands/Commands.java b/src/main/java/bagpacker/commands/Commands.java index 0164f62f6f..52409ddad8 100644 --- a/src/main/java/bagpacker/commands/Commands.java +++ b/src/main/java/bagpacker/commands/Commands.java @@ -21,11 +21,8 @@ public Commands(int targetIndex) { protected Commands() { } - /** - * Executes the command. - */ - public void execute(Item item, Ui ui) { - }; + + public void setTargetIndex(int targetIndex) { this.targetIndex = targetIndex; @@ -43,5 +40,8 @@ protected Item getTargetItem() throws IndexOutOfBoundsException { return packingList.get(getTargetIndex() - 1); } - public abstract void execute(PackingList packingList); -} \ No newline at end of file + /** + * Executes the command. + */ + public void execute(PackingList packingList){}; +} diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java index bb7493a4bc..e20246acf0 100644 --- a/src/main/java/bagpacker/iohandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -14,9 +14,9 @@ * Storage class contains methods to save and retrieve saved packing list in txt file */ public class Storage { - private static String FILE_PATH = null; - public static ArrayList packingList = new ArrayList<>(); - public static ArrayList load() throws FileNotFoundException { + private static final String FILE_PATH = "packList.txt"; + + public static void load() throws FileNotFoundException { Scanner reader = new Scanner(new File(FILE_PATH)); String line; while (reader.hasNext()) { @@ -24,21 +24,21 @@ public static ArrayList load() throws FileNotFoundException { boolean isPacked = line.charAt(1) == 'X'; String itemDesc = line.substring(4); Item item = new Item(itemDesc, isPacked); - packingList.add(item); + PackingList.getItemList().add(item); } - return packingList; } - public static void save(PackingList packingList) { + public static void save() { try { - writeToFile(packingList); + writeToFile(); } catch (IOException e) { System.out.println("Something went wrong: " + e.getMessage()); } } - public static void writeToFile(PackingList packingList) throws IOException { + public static void writeToFile() throws IOException { FileWriter fw = new FileWriter(FILE_PATH); + ArrayList packingList = PackingList.getItemList(); for (int i = 0; i < packingList.size(); i++) { fw.write(packingList.get(i).toString() + "\n"); } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index 46ef7a469b..325f92703c 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -7,26 +7,28 @@ * PackingList class contains methods to manipulate the users packing list */ public class PackingList { - private static List allItems = new ArrayList<>(); + + + private static ArrayList itemList = new ArrayList<>(); + private static int targetIndex = -1; /** - * Adds a task to the list. + * Getter for itemList + * + * @return list of items */ - public void addItem(Item toAdd) { - allItems.add(toAdd); - } - - public Item get(int itemIndex) { - return allItems.get(itemIndex); + public static ArrayList getItemList() { + return itemList; } - /** - * Returns the number of {@link Item}s in the packing list. - * @return int of packing list size + * Adds a task to the list. */ - public int size() { - return allItems.size(); + public void addItem(Item toAdd) { + itemList.add(toAdd); } + public static Item get(int targetIndex) { + return itemList.get(targetIndex); + } } diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 892cb6cae7..e555e99a30 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,9 +1,25 @@ -Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| +____________________________________________________________ +Hi this is, + ____ _____ _ +| _ \ | __ \ | | +| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ +| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| +| |_) | (_| | (_| | | | (_| | (__| < __/ | +|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ -What is your name? -Hello James Gosling +Enter "help" to find out how to use BagPacker +____________________________________________________________ +____________________________________________________________ +Bye thanks for using, + ____ _____ _ +| _ \ | __ \ | | +| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ +| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| +| |_) | (_| | (_| | | | (_| | (__| < __/ | +|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ + +____________________________________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index f6ec2e9f95..0abaeaa993 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +1 @@ -James Gosling \ No newline at end of file +bye \ No newline at end of file From deb9e60541497f884520519c4c84fae5dbd53159 Mon Sep 17 00:00:00 2001 From: coregano Date: Sat, 11 Mar 2023 15:50:41 +0800 Subject: [PATCH 010/207] Update git.ignore file top ignore packList.txt --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2873e189e1..cd1bd65f36 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT +packList.txt From 61fbb6aef08772f0ac0d0ad2c383e6043de73aa5 Mon Sep 17 00:00:00 2001 From: coregano Date: Sat, 11 Mar 2023 16:00:25 +0800 Subject: [PATCH 011/207] Remove unused imports --- .gitignore | 1 + src/main/java/bagpacker/commands/DeleteCommand.java | 1 - src/main/java/bagpacker/commands/HelpCommand.java | 1 - src/main/java/bagpacker/commands/ListCommand.java | 1 - src/main/java/bagpacker/commands/PackCommand.java | 1 - src/main/java/bagpacker/packingfunc/PackingList.java | 1 - 6 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index cd1bd65f36..2cb3c8ab2c 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT packList.txt +packingList.txt diff --git a/src/main/java/bagpacker/commands/DeleteCommand.java b/src/main/java/bagpacker/commands/DeleteCommand.java index 99ec3f5885..d685464ab6 100644 --- a/src/main/java/bagpacker/commands/DeleteCommand.java +++ b/src/main/java/bagpacker/commands/DeleteCommand.java @@ -1,6 +1,5 @@ package bagpacker.commands; -import bagpacker.iohandler.Ui; import bagpacker.packingfunc.PackingList; public class DeleteCommand extends Commands{ diff --git a/src/main/java/bagpacker/commands/HelpCommand.java b/src/main/java/bagpacker/commands/HelpCommand.java index f7efe61207..739b87d568 100644 --- a/src/main/java/bagpacker/commands/HelpCommand.java +++ b/src/main/java/bagpacker/commands/HelpCommand.java @@ -1,6 +1,5 @@ package bagpacker.commands; -import bagpacker.iohandler.Ui; import bagpacker.packingfunc.PackingList; public class HelpCommand extends Commands{ diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index ee61926721..49ba1c4c02 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -1,6 +1,5 @@ package bagpacker.commands; -import bagpacker.iohandler.Ui; import bagpacker.packingfunc.PackingList; public class ListCommand extends Commands{ diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 3514072b27..10a06ba8c1 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -1,6 +1,5 @@ package bagpacker.commands; -import bagpacker.iohandler.Ui; import bagpacker.packingfunc.PackingList; public class PackCommand extends Commands{ diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index 325f92703c..3700b325a4 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -1,7 +1,6 @@ package bagpacker.packingfunc; import java.util.ArrayList; -import java.util.List; /** * PackingList class contains methods to manipulate the users packing list From c4384d60e446f8f8a0e357fef28a12c725a89679 Mon Sep 17 00:00:00 2001 From: coregano Date: Sat, 11 Mar 2023 16:06:42 +0800 Subject: [PATCH 012/207] Update main class in build.gradle --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index d5e548e85f..2166549d0a 100644 --- a/build.gradle +++ b/build.gradle @@ -29,11 +29,11 @@ test { } application { - mainClass = "seedu.duke.Duke" + mainClass = "bagpacker.BagPacker" } shadowJar { - archiveBaseName = "duke" + archiveBaseName = "BagPacker" archiveClassifier = null } From a844759c50748cd7972d41b39e1e3b0ecfd52d82 Mon Sep 17 00:00:00 2001 From: coregano Date: Sat, 11 Mar 2023 16:21:36 +0800 Subject: [PATCH 013/207] Edit runtest.sh to fix Cl system bug Ref: https://github.com/nus-cs2113-AY2021S1/forum/issues/48 --- text-ui-test/runtest.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index 1dcbd12021..01d5e4ef1b 100755 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -10,8 +10,7 @@ cd text-ui-test java -jar $(find ../build/libs/ -mindepth 1 -print -quit) < input.txt > ACTUAL.TXT -cp EXPECTED.TXT EXPECTED-UNIX.TXT -dos2unix EXPECTED-UNIX.TXT ACTUAL.TXT + diff EXPECTED-UNIX.TXT ACTUAL.TXT if [ $? -eq 0 ] then From 44e1ac955bbc84184250528bbf130c51e703e8b0 Mon Sep 17 00:00:00 2001 From: coregano Date: Sat, 11 Mar 2023 16:24:35 +0800 Subject: [PATCH 014/207] Edit git.ignore to allow EXPECTED-UNIX.TXT to be pushed into repo --- .gitignore | 1 - text-ui-test/EXPECTED-UNIX.TXT | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 text-ui-test/EXPECTED-UNIX.TXT diff --git a/.gitignore b/.gitignore index 2cb3c8ab2c..c8079eadd6 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,5 @@ src/main/resources/docs/ bin/ /text-ui-test/ACTUAL.TXT -text-ui-test/EXPECTED-UNIX.TXT packList.txt packingList.txt diff --git a/text-ui-test/EXPECTED-UNIX.TXT b/text-ui-test/EXPECTED-UNIX.TXT new file mode 100644 index 0000000000..fc0bc1aa50 --- /dev/null +++ b/text-ui-test/EXPECTED-UNIX.TXT @@ -0,0 +1 @@ +____________________________________________________________ Hi this is, ____ _____ _ | _ \ | __ \ | | | |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ | _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| | |_) | (_| | (_| | | | (_| | (__| < __/ | |____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| __/ | |___/ Enter "help" to find out how to use BagPacker ____________________________________________________________ ____________________________________________________________ Bye thanks for using, ____ _____ _ | _ \ | __ \ | | | |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ | _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| | |_) | (_| | (_| | | | (_| | (__| < __/ | |____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| __/ | |___/ ____________________________________________________________ \ No newline at end of file From 0a61e1dbf84dab445c1979101d62004d4bdd4451 Mon Sep 17 00:00:00 2001 From: coregano Date: Sat, 11 Mar 2023 16:45:36 +0800 Subject: [PATCH 015/207] Fix bug - extra whitespace in BagPacker Logo --- src/main/java/bagpacker/iohandler/Ui.java | 4 ++-- text-ui-test/EXPECTED-UNIX.TXT | 26 ++++++++++++++++++++++- text-ui-test/input.txt | 2 +- text-ui-test/runtest.sh | 1 - 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index 823b14751c..b872a57eec 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -4,12 +4,12 @@ */ public class Ui { public static String logo = " ____ _____ _\n" - + "| _ \\ | __ \\ | | \n" + + "| _ \\ | __ \\ | |\n" + "| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __\n" + "| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \\ '__|\n" + "| |_) | (_| | (_| | | | (_| | (__| < __/ |\n" + "|____/ \\__,_|\\__, |_| \\__,_|\\___|_|\\_\\___|_|\n" - + " __/ | \n" + + " __/ |\n" + " |___/\n"; public static void printErrorLine() { System.out.println("/////////////////////////////////////////////////////////////"); diff --git a/text-ui-test/EXPECTED-UNIX.TXT b/text-ui-test/EXPECTED-UNIX.TXT index fc0bc1aa50..e555e99a30 100644 --- a/text-ui-test/EXPECTED-UNIX.TXT +++ b/text-ui-test/EXPECTED-UNIX.TXT @@ -1 +1,25 @@ -____________________________________________________________ Hi this is, ____ _____ _ | _ \ | __ \ | | | |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ | _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| | |_) | (_| | (_| | | | (_| | (__| < __/ | |____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| __/ | |___/ Enter "help" to find out how to use BagPacker ____________________________________________________________ ____________________________________________________________ Bye thanks for using, ____ _____ _ | _ \ | __ \ | | | |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ | _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| | |_) | (_| | (_| | | | (_| | (__| < __/ | |____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| __/ | |___/ ____________________________________________________________ \ No newline at end of file +____________________________________________________________ +Hi this is, + ____ _____ _ +| _ \ | __ \ | | +| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ +| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| +| |_) | (_| | (_| | | | (_| | (__| < __/ | +|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ + +Enter "help" to find out how to use BagPacker +____________________________________________________________ +____________________________________________________________ +Bye thanks for using, + ____ _____ _ +| _ \ | __ \ | | +| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ +| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| +| |_) | (_| | (_| | | | (_| | (__| < __/ | +|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ + +____________________________________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 0abaeaa993..b023018cab 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +1 @@ -bye \ No newline at end of file +bye diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index 01d5e4ef1b..276ec340be 100755 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -10,7 +10,6 @@ cd text-ui-test java -jar $(find ../build/libs/ -mindepth 1 -print -quit) < input.txt > ACTUAL.TXT - diff EXPECTED-UNIX.TXT ACTUAL.TXT if [ $? -eq 0 ] then From 6be124431d55083e89548f346a8b80b6cca9f89f Mon Sep 17 00:00:00 2001 From: Sophie Date: Sun, 12 Mar 2023 21:50:21 +0800 Subject: [PATCH 016/207] Add functionality to add item to packing list --- src/main/java/bagpacker/BagPacker.java | 9 +++- .../java/bagpacker/commands/AddCommand.java | 2 +- .../commands/{Commands.java => Command.java} | 6 +-- .../bagpacker/commands/DeleteCommand.java | 2 +- .../java/bagpacker/commands/HelpCommand.java | 2 +- .../java/bagpacker/commands/ListCommand.java | 2 +- .../java/bagpacker/commands/PackCommand.java | 2 +- src/main/java/bagpacker/iohandler/Parser.java | 42 ++++++++++++++++--- 8 files changed, 52 insertions(+), 15 deletions(-) rename src/main/java/bagpacker/commands/{Commands.java => Command.java} (90%) diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index ef0c15f413..3df895edd7 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -1,16 +1,22 @@ package bagpacker; +import bagpacker.commands.Command; import bagpacker.iohandler.Storage; import bagpacker.iohandler.Ui; import bagpacker.iohandler.Parser; import bagpacker.packingfunc.PackingList; +import java.util.ArrayList; + public class BagPacker { private static PackingList packingList; /** * Main entry-point for the java.BagPacker application. */ public static void main(String[] args) { + // intialise variables + PackingList packingList = new PackingList(); + BagPacker.packingList = packingList; //initialise BagPacker program Ui.initialMessage(); @@ -26,7 +32,8 @@ public static void runBagPacker() { while (!Parser.getCommand().equals("bye")) { switch (Parser.getCommand()) { case "add": - //Add add function + String itemDescrip = Parser.getItemDescrip(); + Parser.addItem(itemDescrip, packingList); break; case "remove": //Add remove function diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index e4c59fce05..6aa5b0d926 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -4,7 +4,7 @@ import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; -public class AddCommand extends Commands { +public class AddCommand extends Command { public static final String MSG_SUCCESS_ADD = "New item added: %s"; public static final String MSG_USAGE_ADD = "add : Adds an item to the packing list.\n" + "Example: add toothbrush"; diff --git a/src/main/java/bagpacker/commands/Commands.java b/src/main/java/bagpacker/commands/Command.java similarity index 90% rename from src/main/java/bagpacker/commands/Commands.java rename to src/main/java/bagpacker/commands/Command.java index e5ccc88172..b5947a8b7c 100644 --- a/src/main/java/bagpacker/commands/Commands.java +++ b/src/main/java/bagpacker/commands/Command.java @@ -6,18 +6,18 @@ /** * Commands class used to execute given commands from user */ -public abstract class Commands { +public abstract class Command { protected PackingList packingList; private int targetIndex = -1; /** * @param targetIndex listing index of the target item */ - public Commands(int targetIndex) { + public Command(int targetIndex) { this.setTargetIndex(targetIndex); } - protected Commands() { + protected Command() { } public void setTargetIndex(int targetIndex) { diff --git a/src/main/java/bagpacker/commands/DeleteCommand.java b/src/main/java/bagpacker/commands/DeleteCommand.java index d685464ab6..ee9898cc5b 100644 --- a/src/main/java/bagpacker/commands/DeleteCommand.java +++ b/src/main/java/bagpacker/commands/DeleteCommand.java @@ -2,7 +2,7 @@ import bagpacker.packingfunc.PackingList; -public class DeleteCommand extends Commands{ +public class DeleteCommand extends Command { @Override public void execute(PackingList packingList) { diff --git a/src/main/java/bagpacker/commands/HelpCommand.java b/src/main/java/bagpacker/commands/HelpCommand.java index 739b87d568..4e2c298d16 100644 --- a/src/main/java/bagpacker/commands/HelpCommand.java +++ b/src/main/java/bagpacker/commands/HelpCommand.java @@ -2,7 +2,7 @@ import bagpacker.packingfunc.PackingList; -public class HelpCommand extends Commands{ +public class HelpCommand extends Command { @Override public void execute(PackingList packingList) { diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index 49ba1c4c02..6f487ba086 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -2,7 +2,7 @@ import bagpacker.packingfunc.PackingList; -public class ListCommand extends Commands{ +public class ListCommand extends Command { @Override public void execute(PackingList packingList) { diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 10a06ba8c1..852fa8a459 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -2,7 +2,7 @@ import bagpacker.packingfunc.PackingList; -public class PackCommand extends Commands{ +public class PackCommand extends Command { @Override public void execute(PackingList packingList) { diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index e5c229a315..cdf1ccdd23 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -1,6 +1,11 @@ package bagpacker.iohandler; +import bagpacker.commands.AddCommand; import bagpacker.exception.EmptyInputException; +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; + +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; @@ -9,19 +14,19 @@ * Parser class contains methods to manipulate user input */ public class Parser { - private static ArrayList inputStringArray; + private static String[] inputStringArray; private static String fullInput; public static void setFullInput(String fullInput) { Parser.fullInput = fullInput; } /** - * Returns the user input as in array list format + * Returns the user input as in array format */ - public static ArrayList getInputStringArray() { + public static String[] getInputStringArray() { return inputStringArray; } - public static void setInputStringArray(ArrayList inputStringArray) { + public static void setInputStringArray(String[] inputStringArray) { Parser.inputStringArray = inputStringArray; } /** @@ -41,7 +46,8 @@ public static void receiveInput() { } setFullInput(inputLine); String[] inputStringList = inputLine.split(" "); - setInputStringArray(new ArrayList<>(Arrays.asList(inputStringList))); + setInputStringArray(inputStringList); + } private static String readLine() throws EmptyInputException { @@ -58,8 +64,32 @@ private static String readLine() throws EmptyInputException { * Returns the user command in lower case */ public static String getCommand() { - return getInputStringArray().get(0).toLowerCase(); + return getInputStringArray()[0].toLowerCase(); + } + + /** + * Returns the user item description + */ + public static String getItemDescrip() { + String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length); + + return String.join(" ", itemArray); + } + + /** + * Calls the AddCommand.execute() method to add an item to the packing list + */ + + public static void addItem(String itemDescrip, PackingList packingList) { + // Create item object + Item item = new Item(itemDescrip,false); + + AddCommand addCommand = new AddCommand(item); + + addCommand.execute(packingList); + } + } From 4117842f9cca5a0462495bc37ffa81cd3ef57c6e Mon Sep 17 00:00:00 2001 From: Sophie Date: Sun, 12 Mar 2023 22:59:37 +0800 Subject: [PATCH 017/207] Add remove item from packing list functionality --- src/main/java/bagpacker/BagPacker.java | 6 +++++- .../bagpacker/commands/DeleteCommand.java | 18 ++++++++++++++++++ src/main/java/bagpacker/iohandler/Parser.java | 19 +++++++++++++++++++ src/main/java/bagpacker/packingfunc/Item.java | 1 + .../bagpacker/packingfunc/PackingList.java | 15 +++++++++++++++ 5 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index 3df895edd7..ab0bafcd49 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -32,11 +32,15 @@ public static void runBagPacker() { while (!Parser.getCommand().equals("bye")) { switch (Parser.getCommand()) { case "add": - String itemDescrip = Parser.getItemDescrip(); + String itemDescrip; + //Add add function + itemDescrip = Parser.getItemDescrip(); Parser.addItem(itemDescrip, packingList); break; case "remove": //Add remove function + itemDescrip = Parser.getItemDescrip(); + Parser.removeItem(itemDescrip, packingList); break; case "pack": //Add pack function diff --git a/src/main/java/bagpacker/commands/DeleteCommand.java b/src/main/java/bagpacker/commands/DeleteCommand.java index ee9898cc5b..222036286c 100644 --- a/src/main/java/bagpacker/commands/DeleteCommand.java +++ b/src/main/java/bagpacker/commands/DeleteCommand.java @@ -1,10 +1,28 @@ package bagpacker.commands; +import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; +import bagpacker.iohandler.Ui; + public class DeleteCommand extends Command { + + public static final String MSG_SUCCESS_DELETE = "%s removed from the list"; + + public static final String MSG_USAGE_DELETE = "delete : Deletes an item from the packing list.\n" + + "Example: delete toothbrush"; + + private final Item item; + + public DeleteCommand(Item item) { + this.item = item; + } + @Override public void execute(PackingList packingList) { + this.packingList = packingList; + packingList.deleteItem(item); + Ui.printToUser(String.format(MSG_SUCCESS_DELETE, item)); } } diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index cdf1ccdd23..5648baed41 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -1,6 +1,7 @@ package bagpacker.iohandler; import bagpacker.commands.AddCommand; +import bagpacker.commands.DeleteCommand; import bagpacker.exception.EmptyInputException; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; @@ -81,6 +82,8 @@ public static String getItemDescrip() { */ public static void addItem(String itemDescrip, PackingList packingList) { + + // Todo try, catch exception handling // Create item object Item item = new Item(itemDescrip,false); @@ -90,6 +93,22 @@ public static void addItem(String itemDescrip, PackingList packingList) { } + /** + * Calls the DeleteCommand.execute() method to add an item to the packing list + */ + + public static void removeItem(String itemDescrip, PackingList packingList) { + + for (int i = 0; i < packingList.size(); i++) { + if (packingList.get(i).getItemName().equalsIgnoreCase(itemDescrip)) { + DeleteCommand deleteCommand = new DeleteCommand(packingList.get(i)); + deleteCommand.execute(packingList); + } + + } + + } + } diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index c764e7781d..2a429dbda2 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -17,6 +17,7 @@ public Item(String description, boolean isPacked) { public String getItemName() { return itemName; } + public boolean isPacked() { return isPacked; } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index 3700b325a4..4ce67a0422 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -26,8 +26,23 @@ public void addItem(Item toAdd) { itemList.add(toAdd); } + /** + * Removes a task from the list. + */ + public void deleteItem(Item toDelete) { + itemList.remove(toDelete); + } + public static Item get(int targetIndex) { return itemList.get(targetIndex); } + /** + * Returns size of packing list + */ + public int size(){ + return itemList.size(); + } + + } From 5c1a8eeb45fa967081ed42abd2b74400749e380c Mon Sep 17 00:00:00 2001 From: Sophie Date: Sun, 12 Mar 2023 23:00:28 +0800 Subject: [PATCH 018/207] Add functionality to mark an item as packed in the packing list --- src/main/java/bagpacker/BagPacker.java | 2 ++ .../java/bagpacker/commands/PackCommand.java | 18 +++++++++++++++++- src/main/java/bagpacker/iohandler/Parser.java | 16 ++++++++++++++++ .../bagpacker/packingfunc/PackingList.java | 11 +++++++++-- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index ab0bafcd49..3df39bfcb5 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -44,6 +44,8 @@ public static void runBagPacker() { break; case "pack": //Add pack function + itemDescrip = Parser.getItemDescrip(); + Parser.packItem(itemDescrip, packingList); break; case "unpack": //Add unpack function diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 852fa8a459..4894d10be6 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -1,10 +1,26 @@ package bagpacker.commands; +import bagpacker.iohandler.Ui; +import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; public class PackCommand extends Command { + + public static final String MSG_SUCCESS_PACK = "Item packed: %s"; + public static final String MSG_USAGE_PACK = "pack : Marks an item to as packed in the packing list.\n" + + "Example: pack toothbrush"; + + private final Item item; + + public PackCommand(Item item) { + this.item = item; + } + @Override public void execute(PackingList packingList) { - + this.packingList = packingList; + packingList.packItem(item); + Ui.printToUser(String.format(MSG_SUCCESS_PACK, item)); } + } diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 5648baed41..fe9c8369bf 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -2,6 +2,7 @@ import bagpacker.commands.AddCommand; import bagpacker.commands.DeleteCommand; +import bagpacker.commands.PackCommand; import bagpacker.exception.EmptyInputException; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; @@ -109,6 +110,21 @@ public static void removeItem(String itemDescrip, PackingList packingList) { } + /** + * Calls the PackCommand.execute() method to mark an item as packed to the packing list + */ + + public static void packItem(String itemDescrip, PackingList packingList) { + + for (int i = 0; i < packingList.size(); i++) { + if (packingList.get(i).getItemName().equalsIgnoreCase(itemDescrip)) { + PackCommand packCommand = new PackCommand(packingList.get(i)); + packCommand.execute(packingList); + } + + } + + } } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index 4ce67a0422..a1dbf42510 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -20,19 +20,26 @@ public static ArrayList getItemList() { return itemList; } /** - * Adds a task to the list. + * Adds an item to the list. */ public void addItem(Item toAdd) { itemList.add(toAdd); } /** - * Removes a task from the list. + * Removes an item from the list. */ public void deleteItem(Item toDelete) { itemList.remove(toDelete); } + /** + * Marks an item as packed in the list. + */ + public void packItem(Item toPack) { + toPack.setPacked(true); + } + public static Item get(int targetIndex) { return itemList.get(targetIndex); } From d45f8827132edb4fd3122d31eb2fed8e2a7570a5 Mon Sep 17 00:00:00 2001 From: Sophie Date: Sun, 12 Mar 2023 23:06:54 +0800 Subject: [PATCH 019/207] Add functionality to mark an item as unpacked in the packing list --- src/main/java/bagpacker/BagPacker.java | 2 ++ .../java/bagpacker/commands/PackCommand.java | 2 +- .../bagpacker/commands/UnpackCommand.java | 26 +++++++++++++++++++ src/main/java/bagpacker/iohandler/Parser.java | 19 +++++++++++++- .../bagpacker/packingfunc/PackingList.java | 7 +++++ 5 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 src/main/java/bagpacker/commands/UnpackCommand.java diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index 3df39bfcb5..bc3c919ff4 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -49,6 +49,8 @@ public static void runBagPacker() { break; case "unpack": //Add unpack function + itemDescrip = Parser.getItemDescrip(); + Parser.unpackItem(itemDescrip, packingList); break; case "list": //Add list function diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 4894d10be6..b3212da74f 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -7,7 +7,7 @@ public class PackCommand extends Command { public static final String MSG_SUCCESS_PACK = "Item packed: %s"; - public static final String MSG_USAGE_PACK = "pack : Marks an item to as packed in the packing list.\n" + + public static final String MSG_USAGE_PACK = "pack : Marks an item as packed in the packing list.\n" + "Example: pack toothbrush"; private final Item item; diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java new file mode 100644 index 0000000000..7990f4d685 --- /dev/null +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -0,0 +1,26 @@ +package bagpacker.commands; + +import bagpacker.iohandler.Ui; +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; + +public class UnpackCommand extends Command { + + public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; + public static final String MSG_USAGE_UNPACK = "pack : Marks an item as unpacked in the packing list.\n" + + "Example: unpack toothbrush"; + + private final Item item; + + public UnpackCommand(Item item) { + this.item = item; + } + + @Override + public void execute(PackingList packingList) { + this.packingList = packingList; + packingList.unpackItem(item); + Ui.printToUser(String.format(MSG_SUCCESS_UNPACK, item)); + } + +} diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index fe9c8369bf..8b0ce6105d 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -3,6 +3,7 @@ import bagpacker.commands.AddCommand; import bagpacker.commands.DeleteCommand; import bagpacker.commands.PackCommand; +import bagpacker.commands.UnpackCommand; import bagpacker.exception.EmptyInputException; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; @@ -111,7 +112,7 @@ public static void removeItem(String itemDescrip, PackingList packingList) { } /** - * Calls the PackCommand.execute() method to mark an item as packed to the packing list + * Calls the PackCommand.execute() method to mark an item as packed in the packing list */ public static void packItem(String itemDescrip, PackingList packingList) { @@ -126,5 +127,21 @@ public static void packItem(String itemDescrip, PackingList packingList) { } + /** + * Calls the UnpackCommand.execute() method to mark an item as unpacked in the packing list + */ + + public static void unpackItem(String itemDescrip, PackingList packingList) { + + for (int i = 0; i < packingList.size(); i++) { + if (packingList.get(i).getItemName().equalsIgnoreCase(itemDescrip)) { + UnpackCommand unpackCommand = new UnpackCommand(packingList.get(i)); + unpackCommand.execute(packingList); + } + + } + + } + } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index a1dbf42510..1cd8c25c04 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -40,6 +40,13 @@ public void packItem(Item toPack) { toPack.setPacked(true); } + /** + * Marks an item as unpacked in the list. + */ + public void unpackItem(Item toPack) { + toPack.setPacked(false); + } + public static Item get(int targetIndex) { return itemList.get(targetIndex); } From 1c5a5d57dbb64547c4abed7f5b3966ae1c5573bb Mon Sep 17 00:00:00 2001 From: Sophie Date: Sun, 12 Mar 2023 23:14:45 +0800 Subject: [PATCH 020/207] Remove unused imports --- src/main/java/bagpacker/BagPacker.java | 3 --- src/main/java/bagpacker/iohandler/Parser.java | 2 -- 2 files changed, 5 deletions(-) diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index bc3c919ff4..937287f767 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -1,13 +1,10 @@ package bagpacker; -import bagpacker.commands.Command; import bagpacker.iohandler.Storage; import bagpacker.iohandler.Ui; import bagpacker.iohandler.Parser; import bagpacker.packingfunc.PackingList; -import java.util.ArrayList; - public class BagPacker { private static PackingList packingList; /** diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 8b0ce6105d..dabc1bbd73 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -8,8 +8,6 @@ import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; -import java.lang.reflect.Array; -import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; From a9cc94231b5ef7657cb0bbee21ebb23356769d12 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Tue, 14 Mar 2023 00:03:05 +0800 Subject: [PATCH 021/207] Refactor input String Array to type ArrayList --- src/main/java/bagpacker/iohandler/Parser.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index dabc1bbd73..3b859abf9c 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -8,6 +8,7 @@ import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; +import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; @@ -15,7 +16,7 @@ * Parser class contains methods to manipulate user input */ public class Parser { - private static String[] inputStringArray; + private static ArrayList inputStringArray; private static String fullInput; public static void setFullInput(String fullInput) { Parser.fullInput = fullInput; @@ -24,11 +25,11 @@ public static void setFullInput(String fullInput) { /** * Returns the user input as in array format */ - public static String[] getInputStringArray() { + public static ArrayList getInputStringArray() { return inputStringArray; } public static void setInputStringArray(String[] inputStringArray) { - Parser.inputStringArray = inputStringArray; + Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray)); } /** * Returns the user input in String format @@ -65,16 +66,17 @@ private static String readLine() throws EmptyInputException { * Returns the user command in lower case */ public static String getCommand() { - return getInputStringArray()[0].toLowerCase(); + return getInputStringArray().get(0).toLowerCase(); } /** * Returns the user item description */ public static String getItemDescrip() { - String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length); - - return String.join(" ", itemArray); + //String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length); + int indexItemName = getFullInput().indexOf("/n") + 2; + String itemName = getFullInput().substring(indexItemName, getFullInput().length()).trim(); + return itemName; } /** From b297a6eb944c4b9dd77a0b395a3cca93ab69a7ba Mon Sep 17 00:00:00 2001 From: linuspuah Date: Tue, 14 Mar 2023 00:11:31 +0800 Subject: [PATCH 022/207] Change help message item key to i/ --- src/main/java/bagpacker/iohandler/Parser.java | 2 +- src/main/java/bagpacker/iohandler/Ui.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 3b859abf9c..3fb563e40e 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -74,7 +74,7 @@ public static String getCommand() { */ public static String getItemDescrip() { //String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length); - int indexItemName = getFullInput().indexOf("/n") + 2; + int indexItemName = getFullInput().indexOf("/i") + 2; String itemName = getFullInput().substring(indexItemName, getFullInput().length()).trim(); return itemName; } diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index b872a57eec..8e5251e764 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -54,7 +54,7 @@ public static void errorMessage(String errorType, String helpMessage) { public static void helpMessage() { printLine(); System.out.println("All Commands:"); - System.out.println("1. 'add n/ITEM'"); + System.out.println("1. 'add i/ITEM'"); System.out.println("2. 'remove n/ITEM_INDEX'"); System.out.println("2. 'list'"); System.out.println("3. 'pack n/ITEM_INDEX' "); From 42596552b9c3c95f8f98bc57551e9889ba729eb0 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Wed, 15 Mar 2023 22:33:57 +0800 Subject: [PATCH 023/207] Add list and deleteall commands --- src/main/java/bagpacker/BagPacker.java | 4 ++++ .../bagpacker/commands/DeleteListCommand.java | 15 ++++++++++++++ .../java/bagpacker/commands/ListCommand.java | 20 +++++++++++++++++++ src/main/java/bagpacker/iohandler/Parser.java | 10 ++++++++++ 4 files changed, 49 insertions(+) create mode 100644 src/main/java/bagpacker/commands/DeleteListCommand.java diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index 937287f767..1240c40373 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -51,10 +51,14 @@ public static void runBagPacker() { break; case "list": //Add list function + Parser.displayList(packingList); break; case "help": Ui.helpMessage(); break; + case "deleteall": + Parser.deleteList(packingList); + break; default: Ui.errorMessage("'" + Parser.getCommand() + "' is an invalid User Command", "input 'help' to receive all valid commands"); diff --git a/src/main/java/bagpacker/commands/DeleteListCommand.java b/src/main/java/bagpacker/commands/DeleteListCommand.java new file mode 100644 index 0000000000..6a313b430d --- /dev/null +++ b/src/main/java/bagpacker/commands/DeleteListCommand.java @@ -0,0 +1,15 @@ +package bagpacker.commands; + +import bagpacker.iohandler.Parser; +import bagpacker.packingfunc.PackingList; + +public class DeleteListCommand extends Command { + + @Override + public void execute(PackingList packingList) { + for (int i = 0; i < packingList.size(); i++) { + Parser.removeItem(String.valueOf(i), packingList); + } + } + +} diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index 6f487ba086..0da9ba2633 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -6,5 +6,25 @@ public class ListCommand extends Command { @Override public void execute(PackingList packingList) { + if (packingList.size() == 0) { + System.out.println("____________________________________________________________"); + System.out.println("There are no items in your list. What would you like to pack?"); + System.out.println("____________________________________________________________"); + return; + } + + System.out.println("____________________________________________________________"); + System.out.println("Here are the items in your list"); + for (int i = 0; i < packingList.size(); i++) { + String isItemPacked; + if (packingList.get(i).isPacked()) { + isItemPacked = "X"; + } else { + isItemPacked = " "; + } + String itemName = packingList.get(i).getItemName(); + System.out.println((i + 1) + ". [" + isItemPacked + "] " + itemName); + } + System.out.println("____________________________________________________________"); } } diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 3fb563e40e..dab812c4d1 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -4,6 +4,8 @@ import bagpacker.commands.DeleteCommand; import bagpacker.commands.PackCommand; import bagpacker.commands.UnpackCommand; +import bagpacker.commands.ListCommand; +import bagpacker.commands.DeleteListCommand; import bagpacker.exception.EmptyInputException; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; @@ -143,5 +145,13 @@ public static void unpackItem(String itemDescrip, PackingList packingList) { } + public static void displayList(PackingList packingList) { + ListCommand listCommand = new ListCommand(); + listCommand.execute(packingList); + } + public static void deleteList(PackingList packingList) { + DeleteListCommand deleteListCommand = new DeleteListCommand(); + deleteListCommand.execute(packingList); + } } From 2ab6d917f3329de1738cfca7b9fa2bbb92f4c819 Mon Sep 17 00:00:00 2001 From: coregano Date: Thu, 16 Mar 2023 00:59:07 +0800 Subject: [PATCH 024/207] features Move switch case from class BagPacker to Parse edit Update methods in parse to use itemIndex instead of itemDescription --- src/main/java/bagpacker/BagPacker.java | 1 + src/main/java/bagpacker/iohandler/Parser.java | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index ef0c15f413..c43db3c73a 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -48,6 +48,7 @@ public static void runBagPacker() { "input 'help' to receive all valid commands"); break; } + Parser.receiveInput(); } Storage.save(); diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index e5c229a315..a6964edbd3 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -61,5 +61,7 @@ public static String getCommand() { return getInputStringArray().get(0).toLowerCase(); } - + public static String getArgs() { + return getInputStringArray().get(1); + } } From 08ef158b15e833eda8197371d426016ed7c4dca8 Mon Sep 17 00:00:00 2001 From: coregano Date: Thu, 16 Mar 2023 03:42:37 +0800 Subject: [PATCH 025/207] Edit parse class by adding switch case and updated parse command methods --- src/main/java/bagpacker/BagPacker.java | 39 +------- .../bagpacker/commands/DeleteCommand.java | 7 +- .../java/bagpacker/commands/PackCommand.java | 7 +- .../bagpacker/commands/UnpackCommand.java | 6 +- src/main/java/bagpacker/iohandler/Parser.java | 96 ++++++++----------- 5 files changed, 55 insertions(+), 100 deletions(-) diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index 937287f767..4a2fffeb15 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -25,42 +25,9 @@ public static void main(String[] args) { } public static void runBagPacker() { - Parser.receiveInput(); - while (!Parser.getCommand().equals("bye")) { - switch (Parser.getCommand()) { - case "add": - String itemDescrip; - //Add add function - itemDescrip = Parser.getItemDescrip(); - Parser.addItem(itemDescrip, packingList); - break; - case "remove": - //Add remove function - itemDescrip = Parser.getItemDescrip(); - Parser.removeItem(itemDescrip, packingList); - break; - case "pack": - //Add pack function - itemDescrip = Parser.getItemDescrip(); - Parser.packItem(itemDescrip, packingList); - break; - case "unpack": - //Add unpack function - itemDescrip = Parser.getItemDescrip(); - Parser.unpackItem(itemDescrip, packingList); - break; - case "list": - //Add list function - break; - case "help": - Ui.helpMessage(); - break; - default: - Ui.errorMessage("'" + Parser.getCommand() + "' is an invalid User Command", - "input 'help' to receive all valid commands"); - break; - } - Parser.receiveInput(); + + while (true) { + } Storage.save(); } diff --git a/src/main/java/bagpacker/commands/DeleteCommand.java b/src/main/java/bagpacker/commands/DeleteCommand.java index 222036286c..160a74671c 100644 --- a/src/main/java/bagpacker/commands/DeleteCommand.java +++ b/src/main/java/bagpacker/commands/DeleteCommand.java @@ -12,17 +12,16 @@ public class DeleteCommand extends Command { public static final String MSG_USAGE_DELETE = "delete : Deletes an item from the packing list.\n" + "Example: delete toothbrush"; - private final Item item; - public DeleteCommand(Item item) { - this.item = item; + public DeleteCommand(int targetIndex) { + super(targetIndex); } @Override public void execute(PackingList packingList) { + Item item = getTargetItem(); this.packingList = packingList; packingList.deleteItem(item); Ui.printToUser(String.format(MSG_SUCCESS_DELETE, item)); - } } diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index b3212da74f..0e8a6a035f 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -10,15 +10,16 @@ public class PackCommand extends Command { public static final String MSG_USAGE_PACK = "pack : Marks an item as packed in the packing list.\n" + "Example: pack toothbrush"; - private final Item item; - public PackCommand(Item item) { - this.item = item; + + public PackCommand(int targetIndex) { + super(targetIndex); } @Override public void execute(PackingList packingList) { this.packingList = packingList; + final Item item = getTargetItem(); packingList.packItem(item); Ui.printToUser(String.format(MSG_SUCCESS_PACK, item)); } diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index 7990f4d685..6154b769a4 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -10,15 +10,15 @@ public class UnpackCommand extends Command { public static final String MSG_USAGE_UNPACK = "pack : Marks an item as unpacked in the packing list.\n" + "Example: unpack toothbrush"; - private final Item item; - public UnpackCommand(Item item) { - this.item = item; + public UnpackCommand(int targetIndex) { + super(targetIndex); } @Override public void execute(PackingList packingList) { this.packingList = packingList; + final Item item = getTargetItem(); packingList.unpackItem(item); Ui.printToUser(String.format(MSG_SUCCESS_UNPACK, item)); } diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 3fb563e40e..8e53fd64f2 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -1,9 +1,6 @@ package bagpacker.iohandler; -import bagpacker.commands.AddCommand; -import bagpacker.commands.DeleteCommand; -import bagpacker.commands.PackCommand; -import bagpacker.commands.UnpackCommand; +import bagpacker.commands.*; import bagpacker.exception.EmptyInputException; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; @@ -37,9 +34,10 @@ public static void setInputStringArray(String[] inputStringArray) { public static String getFullInput() { return fullInput; } - public static void receiveInput() { + + public static Command parse() { String inputLine = ""; - while(inputLine.isEmpty()){ + while(inputLine.isEmpty()) { try { inputLine = readLine(); } catch (EmptyInputException e) { @@ -47,9 +45,35 @@ public static void receiveInput() { } } setFullInput(inputLine); - String[] inputStringList = inputLine.split(" "); + String[] inputStringList = inputLine.trim().split(" "); setInputStringArray(inputStringList); + String itemDescrip; + + switch (inputStringList[0]) { + case "add": + //Add add function + return addItem(inputStringList[1]); + case "remove": + return removeItem(inputStringList[1]); + case "pack": + return packItem(inputStringList[1]); + case "unpack": + return unpackItem(inputStringList[1]); + default: + return addItem(inputStringList[1]); + } +// case "list": +// return +// break; +// case "help": +// Ui.helpMessage(); +// break; +// default: +// return Command +// Ui.errorMessage("'" + Parser.getCommand() + "' is an invalid User Command", +// "input 'help' to receive all valid commands"); +// break; } private static String readLine() throws EmptyInputException { @@ -74,74 +98,38 @@ public static String getCommand() { */ public static String getItemDescrip() { //String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length); - int indexItemName = getFullInput().indexOf("/i") + 2; - String itemName = getFullInput().substring(indexItemName, getFullInput().length()).trim(); - return itemName; + int indexItemName = getFullInput().indexOf("i/") + 2; + return getFullInput().substring(indexItemName, getFullInput().length()).trim(); } + /** * Calls the AddCommand.execute() method to add an item to the packing list */ - - public static void addItem(String itemDescrip, PackingList packingList) { - + public static Command addItem(String itemDescrip) { // Todo try, catch exception handling - // Create item object - Item item = new Item(itemDescrip,false); - - AddCommand addCommand = new AddCommand(item); - - addCommand.execute(packingList); - + return new AddCommand(new Item(itemDescrip)); } /** * Calls the DeleteCommand.execute() method to add an item to the packing list */ - - public static void removeItem(String itemDescrip, PackingList packingList) { - - for (int i = 0; i < packingList.size(); i++) { - if (packingList.get(i).getItemName().equalsIgnoreCase(itemDescrip)) { - DeleteCommand deleteCommand = new DeleteCommand(packingList.get(i)); - deleteCommand.execute(packingList); - } - - } - + public static Command removeItem(String itemDescrip) { + return new DeleteCommand(Integer.parseInt(itemDescrip)); } /** * Calls the PackCommand.execute() method to mark an item as packed in the packing list */ - - public static void packItem(String itemDescrip, PackingList packingList) { - - for (int i = 0; i < packingList.size(); i++) { - if (packingList.get(i).getItemName().equalsIgnoreCase(itemDescrip)) { - PackCommand packCommand = new PackCommand(packingList.get(i)); - packCommand.execute(packingList); - } - - } - + public static Command packItem(String itemDescrip) { + return new PackCommand(Integer.parseInt(itemDescrip)); } /** * Calls the UnpackCommand.execute() method to mark an item as unpacked in the packing list */ - - public static void unpackItem(String itemDescrip, PackingList packingList) { - - for (int i = 0; i < packingList.size(); i++) { - if (packingList.get(i).getItemName().equalsIgnoreCase(itemDescrip)) { - UnpackCommand unpackCommand = new UnpackCommand(packingList.get(i)); - unpackCommand.execute(packingList); - } - - } - + public static Command unpackItem(String itemDescrip) { + return new UnpackCommand(Integer.parseInt(itemDescrip)); } - } From a4aa258559524826c091c5a39bbdc93722fbfd0d Mon Sep 17 00:00:00 2001 From: coregano Date: Thu, 16 Mar 2023 16:21:13 +0800 Subject: [PATCH 026/207] Fix bug in Main BagPacker Class - add lines to execute Command subclasses --- src/main/java/bagpacker/BagPacker.java | 4 +++- src/main/java/bagpacker/iohandler/Ui.java | 8 +++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index 7cd46df5f7..258e546805 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -1,5 +1,6 @@ package bagpacker; +import bagpacker.commands.Command; import bagpacker.iohandler.Storage; import bagpacker.iohandler.Ui; import bagpacker.iohandler.Parser; @@ -25,7 +26,8 @@ public static void main(String[] args) { public static void runBagPacker() { while (true) { - Parser.parse(); + Command c = Parser.parse(); + c.execute(packingList); } } } diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index 8e5251e764..dae683b18e 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -56,9 +56,11 @@ public static void helpMessage() { System.out.println("All Commands:"); System.out.println("1. 'add i/ITEM'"); System.out.println("2. 'remove n/ITEM_INDEX'"); - System.out.println("2. 'list'"); - System.out.println("3. 'pack n/ITEM_INDEX' "); - System.out.println("4. 'unpack n/ITEM_INDEX'"); + System.out.println("3. 'list'"); + System.out.println("4. 'pack n/ITEM_INDEX' "); + System.out.println("5. 'unpack n/ITEM_INDEX'"); + System.out.println("6. 'deleteall'"); + printLine(); } From 12dee081127783744113dd643ba83ade6aaa5002 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 16 Mar 2023 19:15:27 +0800 Subject: [PATCH 027/207] Refactor Help command --- src/main/java/bagpacker/BagPacker.java | 4 +-- .../java/bagpacker/commands/AddCommand.java | 4 +-- .../java/bagpacker/commands/ByeCommand.java | 18 ++++++++++++ .../bagpacker/commands/DeleteCommand.java | 4 +-- .../java/bagpacker/commands/HelpCommand.java | 3 +- .../java/bagpacker/commands/ListCommand.java | 3 ++ .../java/bagpacker/commands/PackCommand.java | 4 +-- .../bagpacker/commands/UnpackCommand.java | 4 +-- src/main/java/bagpacker/iohandler/Parser.java | 28 +++++++++++++------ src/main/java/bagpacker/iohandler/Ui.java | 21 +++++++++----- src/main/java/bagpacker/packingfunc/Item.java | 1 + 11 files changed, 68 insertions(+), 26 deletions(-) create mode 100644 src/main/java/bagpacker/commands/ByeCommand.java diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index 258e546805..ce64d96cbe 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -1,7 +1,7 @@ package bagpacker; +import bagpacker.commands.ByeCommand; import bagpacker.commands.Command; -import bagpacker.iohandler.Storage; import bagpacker.iohandler.Ui; import bagpacker.iohandler.Parser; import bagpacker.packingfunc.PackingList; @@ -25,7 +25,7 @@ public static void main(String[] args) { } public static void runBagPacker() { - while (true) { + while (ByeCommand.isBagPackerRunning) { Command c = Parser.parse(); c.execute(packingList); } diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index 6aa5b0d926..3e73fc1e84 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -6,8 +6,8 @@ public class AddCommand extends Command { public static final String MSG_SUCCESS_ADD = "New item added: %s"; - public static final String MSG_USAGE_ADD = "add : Adds an item to the packing list.\n" + - "Example: add toothbrush"; + public static final String HELP_MSG = "add : Adds an item to the packing list.\n" + + "\tExample: add toothbrush"; private final Item item; diff --git a/src/main/java/bagpacker/commands/ByeCommand.java b/src/main/java/bagpacker/commands/ByeCommand.java new file mode 100644 index 0000000000..a8be5a0eb0 --- /dev/null +++ b/src/main/java/bagpacker/commands/ByeCommand.java @@ -0,0 +1,18 @@ +package bagpacker.commands; + +/** + * ByeCommand class stops the BagPacker application by changing the run status + */ +public class ByeCommand extends Command { + public static boolean isBagPackerRunning = true; + public static final String HELP_MSG = "bye : Stops the BagPacker Application\n" + + "\tExample: bye"; + public ByeCommand(){ + this.isBagPackerRunning = false; + } + + public boolean getIsRunning() { + return isBagPackerRunning; + } + +} diff --git a/src/main/java/bagpacker/commands/DeleteCommand.java b/src/main/java/bagpacker/commands/DeleteCommand.java index 160a74671c..e8a7091349 100644 --- a/src/main/java/bagpacker/commands/DeleteCommand.java +++ b/src/main/java/bagpacker/commands/DeleteCommand.java @@ -9,8 +9,8 @@ public class DeleteCommand extends Command { public static final String MSG_SUCCESS_DELETE = "%s removed from the list"; - public static final String MSG_USAGE_DELETE = "delete : Deletes an item from the packing list.\n" + - "Example: delete toothbrush"; + public static final String HELP_MSG = "delete : Deletes an item from the packing list.\n" + + "\tExample: delete toothbrush"; public DeleteCommand(int targetIndex) { diff --git a/src/main/java/bagpacker/commands/HelpCommand.java b/src/main/java/bagpacker/commands/HelpCommand.java index 4e2c298d16..610fb00041 100644 --- a/src/main/java/bagpacker/commands/HelpCommand.java +++ b/src/main/java/bagpacker/commands/HelpCommand.java @@ -1,10 +1,11 @@ package bagpacker.commands; +import bagpacker.iohandler.Ui; import bagpacker.packingfunc.PackingList; public class HelpCommand extends Command { @Override public void execute(PackingList packingList) { - + Ui.helpMessage(); } } diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index 0da9ba2633..96d8a34080 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -3,6 +3,9 @@ import bagpacker.packingfunc.PackingList; public class ListCommand extends Command { + public static final String HELP_MSG = "add : Adds an item to the packing list.\n" + + "\tExample: add toothbrush"; + @Override public void execute(PackingList packingList) { diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 0e8a6a035f..43106f2df6 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -7,8 +7,8 @@ public class PackCommand extends Command { public static final String MSG_SUCCESS_PACK = "Item packed: %s"; - public static final String MSG_USAGE_PACK = "pack : Marks an item as packed in the packing list.\n" + - "Example: pack toothbrush"; + public static final String HELP_MSG= "pack : Marks an item as packed in the packing list.\n" + + "\tExample: pack toothbrush"; diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index 6154b769a4..c25beea609 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -7,8 +7,8 @@ public class UnpackCommand extends Command { public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; - public static final String MSG_USAGE_UNPACK = "pack : Marks an item as unpacked in the packing list.\n" + - "Example: unpack toothbrush"; + public static final String HELP_MSG = "unpack : Marks an item as unpacked in the packing list.\n" + + "\tExample: unpack toothbrush"; public UnpackCommand(int targetIndex) { diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 3e4c5bde62..d4400a33d5 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -1,6 +1,16 @@ package bagpacker.iohandler; -import bagpacker.commands.*; + +import bagpacker.commands.AddCommand; +import bagpacker.commands.ByeCommand; +import bagpacker.commands.Command; +import bagpacker.commands.DeleteCommand; +import bagpacker.commands.DeleteListCommand; +import bagpacker.commands.HelpCommand; +import bagpacker.commands.IncorrectCommand; +import bagpacker.commands.ListCommand; +import bagpacker.commands.PackCommand; +import bagpacker.commands.UnpackCommand; import bagpacker.exception.EmptyInputException; import bagpacker.packingfunc.Item; @@ -47,14 +57,11 @@ public static Command parse() { setFullInput(inputLine); String[] inputStringList = inputLine.trim().split(" "); setInputStringArray(inputStringList); - - switch (inputStringList[0]) { case "add": - //Add add function return addItem(inputStringList[1]); - case "remove": - return removeItem(inputStringList[1]); + case "delete": + return deleteItem(inputStringList[1]); case "pack": return packItem(inputStringList[1]); case "unpack": @@ -63,8 +70,10 @@ public static Command parse() { return listCommand(); case "help": return helpCommand(); - case "delete": + case "deletelist": return deleteList(); + case "bye": + return callByeCmd(); default: return new IncorrectCommand("'" + Parser.getCommand() + "' is an invalid User Command\n" + "input 'help' to receive all valid commands"); @@ -113,7 +122,7 @@ public static Command addItem(String itemDescrip) { /** * Calls the DeleteCommand.execute() method to add an item to the packing list */ - public static Command removeItem(String itemDescrip) { + public static Command deleteItem(String itemDescrip) { return new DeleteCommand(Integer.parseInt(itemDescrip)); } @@ -143,4 +152,7 @@ private static Command helpCommand() { return new HelpCommand(); } + private static Command callByeCmd() { + return new ByeCommand(); + } } diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index dae683b18e..4b77544a14 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -1,4 +1,12 @@ package bagpacker.iohandler; + +import bagpacker.commands.AddCommand; +import bagpacker.commands.ByeCommand; +import bagpacker.commands.DeleteCommand; +import bagpacker.commands.ListCommand; +import bagpacker.commands.PackCommand; +import bagpacker.commands.UnpackCommand; + /** * Ui class contains methods to print messages to user interface on Command Line Interface */ @@ -54,13 +62,12 @@ public static void errorMessage(String errorType, String helpMessage) { public static void helpMessage() { printLine(); System.out.println("All Commands:"); - System.out.println("1. 'add i/ITEM'"); - System.out.println("2. 'remove n/ITEM_INDEX'"); - System.out.println("3. 'list'"); - System.out.println("4. 'pack n/ITEM_INDEX' "); - System.out.println("5. 'unpack n/ITEM_INDEX'"); - System.out.println("6. 'deleteall'"); - + System.out.println("1. " + AddCommand.HELP_MSG); + System.out.println("2. " + DeleteCommand.HELP_MSG); + System.out.println("3. " + ListCommand.HELP_MSG); + System.out.println("4. " + PackCommand.HELP_MSG); + System.out.println("5. " + UnpackCommand.HELP_MSG); + System.out.println("6. " + ByeCommand.HELP_MSG); printLine(); } diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index 2a429dbda2..c0755c9743 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -14,6 +14,7 @@ public Item(String description, boolean isPacked) { this.itemName = description; this.isPacked = isPacked; } + public String getItemName() { return itemName; } From 701d20107cbecf64966b1ea51d9c7cbf80361927 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 16 Mar 2023 19:29:43 +0800 Subject: [PATCH 028/207] Fix feedback message bug for pack and unpack command --- .../bagpacker/commands/DeleteListCommand.java | 1 - src/main/java/bagpacker/commands/ListCommand.java | 2 +- src/main/java/bagpacker/packingfunc/Item.java | 15 ++++++++++++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/bagpacker/commands/DeleteListCommand.java b/src/main/java/bagpacker/commands/DeleteListCommand.java index ba3c489b92..cbde5bf805 100644 --- a/src/main/java/bagpacker/commands/DeleteListCommand.java +++ b/src/main/java/bagpacker/commands/DeleteListCommand.java @@ -1,6 +1,5 @@ package bagpacker.commands; -import bagpacker.iohandler.Parser; import bagpacker.packingfunc.PackingList; public class DeleteListCommand extends Command { diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index 96d8a34080..879f85432b 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -20,7 +20,7 @@ public void execute(PackingList packingList) { System.out.println("Here are the items in your list"); for (int i = 0; i < packingList.size(); i++) { String isItemPacked; - if (packingList.get(i).isPacked()) { + if (packingList.get(i).getIsPacked()) { isItemPacked = "X"; } else { isItemPacked = " "; diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index c0755c9743..2249ccc272 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -6,6 +6,7 @@ public class Item { private String itemName; private boolean isPacked; + private String packIcon = " "; public Item(String description) { this.itemName = description; isPacked = false; @@ -14,19 +15,27 @@ public Item(String description, boolean isPacked) { this.itemName = description; this.isPacked = isPacked; } - + public void setPackIcon() { + if (this.isPacked) { + this.packIcon = "X"; + } else { + this.packIcon = " "; + } + } + public String getItemName() { return itemName; } - public boolean isPacked() { + public boolean getIsPacked() { return isPacked; } public void setPacked(boolean packed) { isPacked = packed; + setPackIcon(); } public String toString() { - return "[" + this.isPacked() + "] " + this.getItemName(); + return "[" + this.packIcon + "] " + this.getItemName(); } } From ed24adb50654c55001ebe477d860c36cb6a6b9d5 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Fri, 17 Mar 2023 02:22:01 +0800 Subject: [PATCH 029/207] Fixed bug that only read in first space separated word after the command input Add major errors handling and exceptions for command inputs --- .../bagpacker/commands/IncorrectCommand.java | 10 +- .../java/bagpacker/commands/ListCommand.java | 2 +- .../exception/InvalidIndexException.java | 6 + .../exception/InvalidVariablesException.java | 6 + src/main/java/bagpacker/iohandler/Parser.java | 129 +++++++++++++++--- 5 files changed, 129 insertions(+), 24 deletions(-) create mode 100644 src/main/java/bagpacker/exception/InvalidIndexException.java create mode 100644 src/main/java/bagpacker/exception/InvalidVariablesException.java diff --git a/src/main/java/bagpacker/commands/IncorrectCommand.java b/src/main/java/bagpacker/commands/IncorrectCommand.java index 53046dca21..4932cb1c29 100644 --- a/src/main/java/bagpacker/commands/IncorrectCommand.java +++ b/src/main/java/bagpacker/commands/IncorrectCommand.java @@ -4,13 +4,15 @@ import bagpacker.packingfunc.PackingList; public class IncorrectCommand extends Command { - public final String feedbackToUser; - public IncorrectCommand(String feedbackToUser) { - this.feedbackToUser = feedbackToUser; + private final String errorType; + private final String helpMessage; + public IncorrectCommand(String errorType, String helpMessage) { + this.helpMessage = helpMessage; + this.errorType = errorType; } @Override public void execute(PackingList packingList) { - Ui.printToUser(feedbackToUser); + Ui.errorMessage(errorType, helpMessage); } } diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index 879f85432b..1b76809e39 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -11,7 +11,7 @@ public void execute(PackingList packingList) { if (packingList.size() == 0) { System.out.println("____________________________________________________________"); - System.out.println("There are no items in your list. What would you like to pack?"); + System.out.println("There are no items in your list. What would you like to add?"); System.out.println("____________________________________________________________"); return; } diff --git a/src/main/java/bagpacker/exception/InvalidIndexException.java b/src/main/java/bagpacker/exception/InvalidIndexException.java new file mode 100644 index 0000000000..c67a8009b6 --- /dev/null +++ b/src/main/java/bagpacker/exception/InvalidIndexException.java @@ -0,0 +1,6 @@ +package bagpacker.exception; + + + +public class InvalidIndexException extends Exception{ +} diff --git a/src/main/java/bagpacker/exception/InvalidVariablesException.java b/src/main/java/bagpacker/exception/InvalidVariablesException.java new file mode 100644 index 0000000000..428e531525 --- /dev/null +++ b/src/main/java/bagpacker/exception/InvalidVariablesException.java @@ -0,0 +1,6 @@ +package bagpacker.exception; + + + +public class InvalidVariablesException extends Exception{ +} diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index d4400a33d5..cb44a50468 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -12,7 +12,10 @@ import bagpacker.commands.PackCommand; import bagpacker.commands.UnpackCommand; import bagpacker.exception.EmptyInputException; +import bagpacker.exception.InvalidIndexException; +import bagpacker.exception.InvalidVariablesException; import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; import java.util.ArrayList; import java.util.Arrays; @@ -24,7 +27,7 @@ public class Parser { private static ArrayList inputStringArray; private static String fullInput; - private static String itemDescrip; + public static void setFullInput(String fullInput) { Parser.fullInput = fullInput; } @@ -35,9 +38,11 @@ public static void setFullInput(String fullInput) { public static ArrayList getInputStringArray() { return inputStringArray; } + public static void setInputStringArray(String[] inputStringArray) { Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray)); } + /** * Returns the user input in String format */ @@ -47,7 +52,7 @@ public static String getFullInput() { public static Command parse() { String inputLine = ""; - while(inputLine.isEmpty()) { + while (inputLine.isEmpty()) { try { inputLine = readLine(); } catch (EmptyInputException e) { @@ -59,13 +64,13 @@ public static Command parse() { setInputStringArray(inputStringList); switch (inputStringList[0]) { case "add": - return addItem(inputStringList[1]); + return addItem(); case "delete": - return deleteItem(inputStringList[1]); + return deleteItem(); case "pack": - return packItem(inputStringList[1]); + return packItem(); case "unpack": - return unpackItem(inputStringList[1]); + return unpackItem(); case "list": return listCommand(); case "help": @@ -75,7 +80,7 @@ public static Command parse() { case "bye": return callByeCmd(); default: - return new IncorrectCommand("'" + Parser.getCommand() + "' is an invalid User Command\n" + + return new IncorrectCommand("'" + Parser.getCommand() + "' is an invalid User Command", "input 'help' to receive all valid commands"); } } @@ -84,7 +89,7 @@ private static String readLine() throws EmptyInputException { String inputLine; Scanner in = new Scanner(System.in); inputLine = in.nextLine().trim(); - if(inputLine.isEmpty()){ + if (inputLine.isEmpty()) { throw new EmptyInputException(); } return inputLine; @@ -97,10 +102,56 @@ public static String getCommand() { return getInputStringArray().get(0).toLowerCase(); } - public static String getArgs() { - return getInputStringArray().get(1); + public static String getItemName() throws InvalidVariablesException { + String inputVariables; + if (inputStringArray.size() <= 1) { + throw new InvalidVariablesException(); + } + try { + int itemIndStart = fullInput.indexOf(" ") + 1; + inputVariables = fullInput.substring(itemIndStart); + } catch (IndexOutOfBoundsException e) { + throw new InvalidVariablesException(); + } + return inputVariables; + } + + public static String getItemIndex() throws InvalidIndexException { + String inputIndex; + int itemIndex; + if (inputStringArray.size() != 2) { + throw new InvalidIndexException(); + } + try { + int itemIndStart = fullInput.indexOf(" ") + 1; + inputIndex = fullInput.substring(itemIndStart); + itemIndex = Integer.parseInt(inputIndex); + if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) { + throw new InvalidIndexException(); + } + } catch (IndexOutOfBoundsException | NumberFormatException e) { + throw new InvalidIndexException(); + } + return inputIndex; } + public static String getVariable(String command) throws InvalidVariablesException, InvalidIndexException { + String variable; + try { + if (command.equals("add")) { + variable = getItemName(); + } else { + variable = getItemIndex(); + } + } catch (InvalidVariablesException e) { + throw new InvalidVariablesException(); + } catch (InvalidIndexException e) { + throw new InvalidIndexException(); + } + return variable; + } + + /** * Returns the user item description */ @@ -114,30 +165,70 @@ public static String getItemDescrip() { /** * Calls the AddCommand.execute() method to add an item to the packing list */ - public static Command addItem(String itemDescrip) { - // Todo try, catch exception handling - return new AddCommand(new Item(itemDescrip)); + public static Command addItem() { + try { + String itemName = getVariable("add"); + return new AddCommand(new Item(itemName)); + } catch (InvalidVariablesException e) { + return new IncorrectCommand("Invalid Item Name", "try to input a name (word(s)) to be added into the list"); + } catch (InvalidIndexException e) { + return new IncorrectCommand("Invalid Item Index", "try to input an integer number between 1 and " + PackingList.getItemList().size()); + } } /** * Calls the DeleteCommand.execute() method to add an item to the packing list */ - public static Command deleteItem(String itemDescrip) { - return new DeleteCommand(Integer.parseInt(itemDescrip)); + public static Command deleteItem() { + try { + String itemIndex = getVariable("delete"); + return new DeleteCommand(Integer.parseInt(itemIndex)); + } catch (InvalidVariablesException e) { + return new IncorrectCommand("Invalid Item Name", "Try to input a name (word(s)) to be added into the list"); + } catch (InvalidIndexException e) { + if (PackingList.getItemList().size() == 0) { + return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to delete"); + } else { + return new IncorrectCommand("Invalid Item Index", "Try to input an integer number between 1 and " + PackingList.getItemList().size()); + } + } } /** * Calls the PackCommand.execute() method to mark an item as packed in the packing list */ - public static Command packItem(String itemDescrip) { - return new PackCommand(Integer.parseInt(itemDescrip)); + public static Command packItem() { + try { + String itemIndex = getVariable("pack"); + return new PackCommand(Integer.parseInt(itemIndex)); + } catch (InvalidVariablesException e) { + return new IncorrectCommand("Invalid Item Name", "try to input a name (word(s)) to be added into the list"); + } catch (InvalidIndexException e) { + if (PackingList.getItemList().size() == 0) { + return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to pack"); + } else { + return new IncorrectCommand("Invalid Item Index", "Try to input an integer number between 1 and " + PackingList.getItemList().size()); + } + } } + /** * Calls the UnpackCommand.execute() method to mark an item as unpacked in the packing list */ - public static Command unpackItem(String itemDescrip) { - return new UnpackCommand(Integer.parseInt(itemDescrip)); + public static Command unpackItem() { + try { + String itemIndex = getVariable("delete"); + return new UnpackCommand(Integer.parseInt(itemIndex)); + } catch (InvalidVariablesException e) { + return new IncorrectCommand("Invalid Item Name", "try to input a name (word(s)) to be added into the list"); + } catch (InvalidIndexException e) { + if (PackingList.getItemList().size() == 0) { + return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to unpack"); + } else { + return new IncorrectCommand("Invalid Item Index", "Try to input an integer number between 1 and " + PackingList.getItemList().size()); + } + } } public static Command listCommand() { From 2db534838b72a9e9f504e87358b9505f6c2c4f60 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Fri, 17 Mar 2023 02:24:01 +0800 Subject: [PATCH 030/207] Refactor Parser Class --- src/main/java/bagpacker/iohandler/Parser.java | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index cb44a50468..7515ff90f4 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -56,7 +56,8 @@ public static Command parse() { try { inputLine = readLine(); } catch (EmptyInputException e) { - Ui.errorMessage("Empty input received", "try to input a command, to view all commands input 'help'"); + Ui.errorMessage("Empty input received", + "try to input a command, to view all commands input 'help'"); } } setFullInput(inputLine); @@ -170,9 +171,11 @@ public static Command addItem() { String itemName = getVariable("add"); return new AddCommand(new Item(itemName)); } catch (InvalidVariablesException e) { - return new IncorrectCommand("Invalid Item Name", "try to input a name (word(s)) to be added into the list"); + return new IncorrectCommand("Invalid Item Name", + "try to input a name (word(s)) to be added into the list"); } catch (InvalidIndexException e) { - return new IncorrectCommand("Invalid Item Index", "try to input an integer number between 1 and " + PackingList.getItemList().size()); + return new IncorrectCommand("Invalid Item Index", + "try to input an integer number between 1 and " + PackingList.getItemList().size()); } } @@ -184,12 +187,15 @@ public static Command deleteItem() { String itemIndex = getVariable("delete"); return new DeleteCommand(Integer.parseInt(itemIndex)); } catch (InvalidVariablesException e) { - return new IncorrectCommand("Invalid Item Name", "Try to input a name (word(s)) to be added into the list"); + return new IncorrectCommand("Invalid Item Name", + "Try to input a name (word(s)) to be added into the list"); } catch (InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { - return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to delete"); + return new IncorrectCommand("Invalid Item Index", + "Your packing list is empty, there is nothing to delete"); } else { - return new IncorrectCommand("Invalid Item Index", "Try to input an integer number between 1 and " + PackingList.getItemList().size()); + return new IncorrectCommand("Invalid Item Index", + "Try to input an integer number between 1 and " + PackingList.getItemList().size()); } } } @@ -202,12 +208,15 @@ public static Command packItem() { String itemIndex = getVariable("pack"); return new PackCommand(Integer.parseInt(itemIndex)); } catch (InvalidVariablesException e) { - return new IncorrectCommand("Invalid Item Name", "try to input a name (word(s)) to be added into the list"); + return new IncorrectCommand("Invalid Item Name", + "try to input a name (word(s)) to be added into the list"); } catch (InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { - return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to pack"); + return new IncorrectCommand("Invalid Item Index", + "Your packing list is empty, there is nothing to pack"); } else { - return new IncorrectCommand("Invalid Item Index", "Try to input an integer number between 1 and " + PackingList.getItemList().size()); + return new IncorrectCommand("Invalid Item Index", + "Try to input an integer number between 1 and " + PackingList.getItemList().size()); } } } @@ -221,12 +230,15 @@ public static Command unpackItem() { String itemIndex = getVariable("delete"); return new UnpackCommand(Integer.parseInt(itemIndex)); } catch (InvalidVariablesException e) { - return new IncorrectCommand("Invalid Item Name", "try to input a name (word(s)) to be added into the list"); + return new IncorrectCommand("Invalid Item Name", + "try to input a name (word(s)) to be added into the list"); } catch (InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { - return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to unpack"); + return new IncorrectCommand("Invalid Item Index", + "Your packing list is empty, there is nothing to unpack"); } else { - return new IncorrectCommand("Invalid Item Index", "Try to input an integer number between 1 and " + PackingList.getItemList().size()); + return new IncorrectCommand("Invalid Item Index", + "Try to input an integer number between 1 and " + PackingList.getItemList().size()); } } } From 27a6af87c0a3e28709bf163d86d7744fb0709d32 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Fri, 17 Mar 2023 11:11:16 +0800 Subject: [PATCH 031/207] Add javaDocs --- src/main/java/bagpacker/iohandler/Parser.java | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 7515ff90f4..2a14fd952b 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -85,7 +85,13 @@ public static Command parse() { "input 'help' to receive all valid commands"); } } - + /** + * Reads and returns the full user input from the command line interface + * - trims the leading and trailing white spaces + * + * @throws EmptyInputException when user input empty line + * @return inputLine the String input of the user + */ private static String readLine() throws EmptyInputException { String inputLine; Scanner in = new Scanner(System.in); @@ -103,20 +109,32 @@ public static String getCommand() { return getInputStringArray().get(0).toLowerCase(); } + /** + * Returns a string which represents the name of the item from the user input + * + * @throws InvalidVariablesException when the item name cannot be found + * @return inputVariables which is the name of the item + */ public static String getItemName() throws InvalidVariablesException { - String inputVariables; + String itemName; if (inputStringArray.size() <= 1) { throw new InvalidVariablesException(); } try { int itemIndStart = fullInput.indexOf(" ") + 1; - inputVariables = fullInput.substring(itemIndStart); + itemName = fullInput.substring(itemIndStart); } catch (IndexOutOfBoundsException e) { throw new InvalidVariablesException(); } - return inputVariables; + return itemName; } + /** + * Returns a string which represents the index of the item from the user input + * + * @throws InvalidIndexException when the item index is not valid + * @return inputIndex which is the item index of the item in packing list + */ public static String getItemIndex() throws InvalidIndexException { String inputIndex; int itemIndex; @@ -135,21 +153,29 @@ public static String getItemIndex() throws InvalidIndexException { } return inputIndex; } - + /** + * Returns a string which represents the relevant variable depending on the command + * - "add" will return the item name + * - "delete", "pack", "unpack" will return item index + * + * @param command used to determine the type of variable to return + * @throws InvalidIndexException when the item index is not valid + * @return itemVariable which is the index OR name of the item in packing list + */ public static String getVariable(String command) throws InvalidVariablesException, InvalidIndexException { - String variable; + String itemVariable; try { if (command.equals("add")) { - variable = getItemName(); + itemVariable = getItemName(); } else { - variable = getItemIndex(); + itemVariable = getItemIndex(); } } catch (InvalidVariablesException e) { throw new InvalidVariablesException(); } catch (InvalidIndexException e) { throw new InvalidIndexException(); } - return variable; + return itemVariable; } From e96cf74376e4c217be7102d66141a91d1b92cf76 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Fri, 17 Mar 2023 11:42:27 +0800 Subject: [PATCH 032/207] Refine JavaDocs for Parser --- src/main/java/bagpacker/iohandler/Parser.java | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 2a14fd952b..e96575de7c 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -65,13 +65,13 @@ public static Command parse() { setInputStringArray(inputStringList); switch (inputStringList[0]) { case "add": - return addItem(); + return createAddObj(); case "delete": - return deleteItem(); + return createDeleteObj(); case "pack": - return packItem(); + return createPackObj(); case "unpack": - return unpackItem(); + return createUnpackObj(); case "list": return listCommand(); case "help": @@ -190,9 +190,12 @@ public static String getItemDescrip() { /** - * Calls the AddCommand.execute() method to add an item to the packing list + * Attempts to create AddCommand object to be executed where it is called from + * + * @return AddCommand the command to be executed to add an item to the packing list, else + * an IncorrectCommand is created to be executed */ - public static Command addItem() { + public static Command createAddObj() { try { String itemName = getVariable("add"); return new AddCommand(new Item(itemName)); @@ -206,9 +209,12 @@ public static Command addItem() { } /** - * Calls the DeleteCommand.execute() method to add an item to the packing list + * Attempts to create DeleteCommand object to be executed where it is called from + * + * @return DeleteCommand the command to be executed to delete an item to the packing list, else + * an IncorrectCommand is created to be executed */ - public static Command deleteItem() { + public static Command createDeleteObj() { try { String itemIndex = getVariable("delete"); return new DeleteCommand(Integer.parseInt(itemIndex)); @@ -227,9 +233,12 @@ public static Command deleteItem() { } /** - * Calls the PackCommand.execute() method to mark an item as packed in the packing list + * Attempts to create PackCommand object to be executed where it is called from + * + * @return PackCommand the command to be executed to Pack an item in the packing list, else + * an IncorrectCommand is created to be executed */ - public static Command packItem() { + public static Command createPackObj() { try { String itemIndex = getVariable("pack"); return new PackCommand(Integer.parseInt(itemIndex)); @@ -249,9 +258,12 @@ public static Command packItem() { /** - * Calls the UnpackCommand.execute() method to mark an item as unpacked in the packing list + * Attempts to create UnpackCommand object to be executed where it is called from + * + * @return UnpackCommand the command to be executed to unpack an item in the packing list, else + * an IncorrectCommand is created to be executed */ - public static Command unpackItem() { + public static Command createUnpackObj() { try { String itemIndex = getVariable("delete"); return new UnpackCommand(Integer.parseInt(itemIndex)); From 66e57f9424524674730260be307a37a15d7494dc Mon Sep 17 00:00:00 2001 From: linuspuah Date: Fri, 17 Mar 2023 12:00:58 +0800 Subject: [PATCH 033/207] Add assertion to PackCommand --- .../java/bagpacker/commands/PackCommand.java | 1 + src/main/java/bagpacker/iohandler/Parser.java | 23 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 43106f2df6..6ee20fc97d 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -14,6 +14,7 @@ public class PackCommand extends Command { public PackCommand(int targetIndex) { super(targetIndex); + assert (targetIndex >= 1 & targetIndex <= packingList.size()) : "Pack Command Target index is out of bounds"; } @Override diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index e96575de7c..74f3691827 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -89,8 +89,8 @@ public static Command parse() { * Reads and returns the full user input from the command line interface * - trims the leading and trailing white spaces * - * @throws EmptyInputException when user input empty line * @return inputLine the String input of the user + * @throws EmptyInputException when user input empty line */ private static String readLine() throws EmptyInputException { String inputLine; @@ -104,16 +104,19 @@ private static String readLine() throws EmptyInputException { /** * Returns the user command in lower case + * + * @return command from user */ public static String getCommand() { - return getInputStringArray().get(0).toLowerCase(); + String command = getInputStringArray().get(0).toLowerCase(); + return command; } /** * Returns a string which represents the name of the item from the user input * - * @throws InvalidVariablesException when the item name cannot be found * @return inputVariables which is the name of the item + * @throws InvalidVariablesException when the item name cannot be found */ public static String getItemName() throws InvalidVariablesException { String itemName; @@ -132,8 +135,8 @@ public static String getItemName() throws InvalidVariablesException { /** * Returns a string which represents the index of the item from the user input * - * @throws InvalidIndexException when the item index is not valid * @return inputIndex which is the item index of the item in packing list + * @throws InvalidIndexException when the item index is not valid */ public static String getItemIndex() throws InvalidIndexException { String inputIndex; @@ -159,8 +162,8 @@ public static String getItemIndex() throws InvalidIndexException { * - "delete", "pack", "unpack" will return item index * * @param command used to determine the type of variable to return - * @throws InvalidIndexException when the item index is not valid * @return itemVariable which is the index OR name of the item in packing list + * @throws InvalidIndexException when the item index is not valid */ public static String getVariable(String command) throws InvalidVariablesException, InvalidIndexException { String itemVariable; @@ -193,7 +196,7 @@ public static String getItemDescrip() { * Attempts to create AddCommand object to be executed where it is called from * * @return AddCommand the command to be executed to add an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createAddObj() { try { @@ -212,7 +215,7 @@ public static Command createAddObj() { * Attempts to create DeleteCommand object to be executed where it is called from * * @return DeleteCommand the command to be executed to delete an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createDeleteObj() { try { @@ -236,7 +239,7 @@ public static Command createDeleteObj() { * Attempts to create PackCommand object to be executed where it is called from * * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createPackObj() { try { @@ -261,11 +264,11 @@ public static Command createPackObj() { * Attempts to create UnpackCommand object to be executed where it is called from * * @return UnpackCommand the command to be executed to unpack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createUnpackObj() { try { - String itemIndex = getVariable("delete"); + String itemIndex = getVariable("unpack"); return new UnpackCommand(Integer.parseInt(itemIndex)); } catch (InvalidVariablesException e) { return new IncorrectCommand("Invalid Item Name", From 842bda936c917200b519fd4012ed14e7ef9ec2c0 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sun, 19 Mar 2023 21:59:18 +0800 Subject: [PATCH 034/207] Fix pack class assertion bug --- src/main/java/bagpacker/commands/PackCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 6ee20fc97d..fe1944140f 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -14,7 +14,8 @@ public class PackCommand extends Command { public PackCommand(int targetIndex) { super(targetIndex); - assert (targetIndex >= 1 & targetIndex <= packingList.size()) : "Pack Command Target index is out of bounds"; + assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : + "Pack Command Target index is out of bounds"; } @Override From b388e3c4e9694cc319fdbebcebdc3b24b5059db7 Mon Sep 17 00:00:00 2001 From: Sophie Date: Sun, 19 Mar 2023 22:48:22 +0800 Subject: [PATCH 035/207] Add JUnit tests for addCommand --- src/test/java/bagpacker/BagPackerTest.java | 1 + .../packingfunctest/CommandsTest.java | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/test/java/bagpacker/BagPackerTest.java b/src/test/java/bagpacker/BagPackerTest.java index dc074577b8..c77bc1b9c2 100644 --- a/src/test/java/bagpacker/BagPackerTest.java +++ b/src/test/java/bagpacker/BagPackerTest.java @@ -11,4 +11,5 @@ class BagPackerTest { public void sampleTest() { assertTrue(true); } + } diff --git a/src/test/java/bagpacker/packingfunctest/CommandsTest.java b/src/test/java/bagpacker/packingfunctest/CommandsTest.java index 01cab9459a..8f9f3a65c6 100644 --- a/src/test/java/bagpacker/packingfunctest/CommandsTest.java +++ b/src/test/java/bagpacker/packingfunctest/CommandsTest.java @@ -1,7 +1,16 @@ package bagpacker.packingfunctest; +import bagpacker.commands.AddCommand; +import bagpacker.commands.Command; +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -12,4 +21,26 @@ public class CommandsTest { public void sampleTest() { assertTrue(true); } + + @Test + public void testAddCommand() { + PackingList packingList = new PackingList(); + Item item = new Item("toothbrush"); + Command addCommand = new AddCommand(item); + addCommand.execute(packingList); + + // Expect a Packinglist with a toothbrush item in first index + Assertions.assertEquals("toothbrush",packingList.get(0).getItemName()); + Assertions.assertNotEquals("tooth", packingList.get(0).getItemName()); + + // Expect second index item in the packing list to be toothpaste + Item item_two = new Item("toothpaste"); + addCommand = new AddCommand(item_two); + addCommand.execute(packingList); + + Assertions.assertEquals("toothpaste",packingList.get(1).getItemName()); + Assertions.assertNotEquals("toothbrush", packingList.get(1).getItemName()); + + } + } From 6575c86eb7e3f2c979b4cef1c9d60b0e015c70ca Mon Sep 17 00:00:00 2001 From: Sophie Date: Sun, 19 Mar 2023 22:53:24 +0800 Subject: [PATCH 036/207] Remove unused imports --- src/test/java/bagpacker/packingfunctest/CommandsTest.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/test/java/bagpacker/packingfunctest/CommandsTest.java b/src/test/java/bagpacker/packingfunctest/CommandsTest.java index 8f9f3a65c6..9207610f45 100644 --- a/src/test/java/bagpacker/packingfunctest/CommandsTest.java +++ b/src/test/java/bagpacker/packingfunctest/CommandsTest.java @@ -6,11 +6,6 @@ import bagpacker.packingfunc.PackingList; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - - -import java.util.ArrayList; - -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; /** From 7e83f4e9ef78edd3b33d6a358e1e1640e42db4fc Mon Sep 17 00:00:00 2001 From: Sophie Date: Wed, 22 Mar 2023 12:31:26 +0800 Subject: [PATCH 037/207] Add assertion for unpack command --- src/main/java/bagpacker/commands/UnpackCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index c25beea609..bb7ff22a18 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -13,6 +13,7 @@ public class UnpackCommand extends Command { public UnpackCommand(int targetIndex) { super(targetIndex); + assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): "Unpack Command Target index is out of bounds"; } @Override From 6ca03c9e460405f710581d51834beac66f82ee6c Mon Sep 17 00:00:00 2001 From: Sophie Date: Wed, 22 Mar 2023 12:38:29 +0800 Subject: [PATCH 038/207] Refactor code format --- src/main/java/bagpacker/commands/PackCommand.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index fe1944140f..59d6028f87 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -11,10 +11,9 @@ public class PackCommand extends Command { "\tExample: pack toothbrush"; - public PackCommand(int targetIndex) { super(targetIndex); - assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : + assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): "Pack Command Target index is out of bounds"; } From f36400ae24eb8ab17397a7de2e140b9740cbd050 Mon Sep 17 00:00:00 2001 From: Sophie Date: Wed, 22 Mar 2023 12:41:31 +0800 Subject: [PATCH 039/207] Refactor unpack command code format --- src/main/java/bagpacker/commands/UnpackCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index bb7ff22a18..738ebe07ae 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -13,7 +13,8 @@ public class UnpackCommand extends Command { public UnpackCommand(int targetIndex) { super(targetIndex); - assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): "Unpack Command Target index is out of bounds"; + assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): + "Unpack Command Target index is out of bounds"; } @Override From 83cb8261a8b487ad9f23acc0c80f9f3fc454533d Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 22 Mar 2023 13:51:41 +0800 Subject: [PATCH 040/207] Update user stories until V2b in DG --- docs/DeveloperGuide.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index a9cccc14b2..5330910cc3 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -2,14 +2,17 @@ ## Acknowledgements -{list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} +{list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the +original source as well} ## Design & implementation {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} + ## Product scope + ### Target user profile {Describe the target user profile} @@ -20,10 +23,18 @@ ## User Stories -|Version| As a ... | I want to ... | So that I can ...| -|--------|----------|---------------|------------------| -|v1.0|new user|see usage instructions|refer to them when I forget how to use the application| -|v2.0|user|find a to-do item by name|locate a to-do without having to go through the entire list| +| Version | As a ... | I want to ... | So that I can ... | +|---------|----------|------------------------------------------------|------------------------------------------------------------------------------| +| v1 | user | Add an item to my packing list | update my packing list | +| v1 | user | Remove an item from my packing list | update my packing list | +| v1 | user | view a list of my packed and unpacked items | keep track of my packing list | +| v1 | user | mark an item as packed | keep track of what is packed | +| v1 | user | mark an item as unpacked | keep track of what is unpacked | +| v1 | new user | see usage instructions | refer to them when I forget how to use the application | +| v2a | user | find an item by name | find the pack status of an item without having to go through the entire list | +| v2a | user | remove my packing list | clear my list once I am done packing | +| v2a | user | Specify the quantity of an item I need to pack | keep track of individual item quantities being packed | +| v2b | user | Save my packing list | keep track of my packing list even after leaving the app | ## Non-Functional Requirements From 3339bff0bb3020ca43ec2170438b2ec34e0ba8cb Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 22 Mar 2023 15:08:42 +0800 Subject: [PATCH 041/207] Update General Command Mechanisms, with details for Bye, Help, DeleteList Command --- docs/DeveloperGuide.md | 44 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 5330910cc3..dfe2cd8504 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -7,7 +7,49 @@ original source as well} ## Design & implementation -{Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} +### Command Mechanisms: +For all valid commands, the mechanism of implementation are as follows: +1. Read input - ```runBagPacker()``` method in ```BagPacker``` calls the ```Parser``` class to read user input command +2. Create command object - The ```Parser``` class creates a corresponding command object of the relevant command +3. Execute command object - ```runBagPacker()``` method executes the ```.execute()``` method (overridden by child classes) of the command object + which runs the actual command function + +#### Help Command +Help command is used to exit the BagPacker application. + +Execute: ```HelpCommand.execute()``` prints the following help message. + +``` +All Commands: +1. add : Adds an item to the packing list. + Example: add toothbrush +2. delete : Deletes an item from the packing list. + Example: delete 1 +3. list : List all items in packing list. + Example: list +4. pack : Marks an item as packed in the packing list. + Example: pack 2 of 3 + Meaning: packs 2 quantities of the third item in the packing list +5. unpack : Marks an item as unpacked in the packing list. + Example: unpack 1 of 2 + Meaning: unpacks 1 quantity of the second item in the packing list +6. bye : Stops the BagPacker Application + Example: bye +____________________________________________________________ + +``` + +#### Bye Command +```ByeCommand``` is used to exit the BagPacker application. + +Mechanism: ```ByeCommand.execute()``` updates the static boolean ```isBagPackerRunning``` to be false. +The ```runBagPacker()``` method will continually parse and execute relevant commands (refer to Command Mechanisms in DG) until +```isBagPackerRunning == false``` which occurs upon the execution of the ```byeCommand```. + +#### DeleteList Command +```DeleteListCommand``` is used to delete a whole packing list in the BagPacker application. + +Mechanism: ```DeleteListCommand.execute()``` reassigns the existing ```packingList``` to a new empty ArrayList of Items, thus deleting the ```packingList```. From 473ee2b9150e0b98d67bd9e403026cf231de64a1 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 22 Mar 2023 15:09:22 +0800 Subject: [PATCH 042/207] Add DeleteListCommand function --- src/main/java/bagpacker/commands/ByeCommand.java | 9 +++------ src/main/java/bagpacker/commands/Command.java | 5 ++++- src/main/java/bagpacker/commands/DeleteCommand.java | 2 +- .../java/bagpacker/commands/DeleteListCommand.java | 12 ++++++++++-- src/main/java/bagpacker/commands/ListCommand.java | 4 ++-- src/main/java/bagpacker/commands/PackCommand.java | 3 ++- src/main/java/bagpacker/commands/UnpackCommand.java | 3 ++- src/main/java/bagpacker/iohandler/Parser.java | 12 ++++++------ src/main/java/bagpacker/packingfunc/PackingList.java | 4 ++++ 9 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/main/java/bagpacker/commands/ByeCommand.java b/src/main/java/bagpacker/commands/ByeCommand.java index a8be5a0eb0..1da5969222 100644 --- a/src/main/java/bagpacker/commands/ByeCommand.java +++ b/src/main/java/bagpacker/commands/ByeCommand.java @@ -1,5 +1,7 @@ package bagpacker.commands; +import bagpacker.packingfunc.PackingList; + /** * ByeCommand class stops the BagPacker application by changing the run status */ @@ -7,12 +9,7 @@ public class ByeCommand extends Command { public static boolean isBagPackerRunning = true; public static final String HELP_MSG = "bye : Stops the BagPacker Application\n" + "\tExample: bye"; - public ByeCommand(){ + public void execute (PackingList packingList) { this.isBagPackerRunning = false; } - - public boolean getIsRunning() { - return isBagPackerRunning; - } - } diff --git a/src/main/java/bagpacker/commands/Command.java b/src/main/java/bagpacker/commands/Command.java index b5947a8b7c..b3ce81ba9e 100644 --- a/src/main/java/bagpacker/commands/Command.java +++ b/src/main/java/bagpacker/commands/Command.java @@ -39,8 +39,11 @@ protected Item getTargetItem() throws IndexOutOfBoundsException { /** - * Executes the command. + * Executes the command which requires a packingList + * + * @param packingList used to execute the command */ public void execute (PackingList packingList) { } + } diff --git a/src/main/java/bagpacker/commands/DeleteCommand.java b/src/main/java/bagpacker/commands/DeleteCommand.java index e8a7091349..abd800d69f 100644 --- a/src/main/java/bagpacker/commands/DeleteCommand.java +++ b/src/main/java/bagpacker/commands/DeleteCommand.java @@ -10,7 +10,7 @@ public class DeleteCommand extends Command { public static final String MSG_SUCCESS_DELETE = "%s removed from the list"; public static final String HELP_MSG = "delete : Deletes an item from the packing list.\n" + - "\tExample: delete toothbrush"; + "\tExample: delete 1"; public DeleteCommand(int targetIndex) { diff --git a/src/main/java/bagpacker/commands/DeleteListCommand.java b/src/main/java/bagpacker/commands/DeleteListCommand.java index cbde5bf805..ea4ea801c8 100644 --- a/src/main/java/bagpacker/commands/DeleteListCommand.java +++ b/src/main/java/bagpacker/commands/DeleteListCommand.java @@ -1,12 +1,20 @@ package bagpacker.commands; +import bagpacker.iohandler.Ui; +import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; -public class DeleteListCommand extends Command { +import java.util.ArrayList; +public class DeleteListCommand extends Command { + public static final String MSG_SUCCESS_DELETE_LIST = "list deleted"; @Override public void execute(PackingList packingList) { - packingList = new PackingList(); + ArrayList< Item > emptyList = new ArrayList<>(); + packingList.setItemList(emptyList); + Ui.printToUser(String.format(MSG_SUCCESS_DELETE_LIST)); } + + } diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index 1b76809e39..279520a779 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -3,8 +3,8 @@ import bagpacker.packingfunc.PackingList; public class ListCommand extends Command { - public static final String HELP_MSG = "add : Adds an item to the packing list.\n" + - "\tExample: add toothbrush"; + public static final String HELP_MSG = "list : List all items in packing list.\n" + + "\tExample: list"; @Override public void execute(PackingList packingList) { diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 59d6028f87..fb7b0c8295 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -8,7 +8,8 @@ public class PackCommand extends Command { public static final String MSG_SUCCESS_PACK = "Item packed: %s"; public static final String HELP_MSG= "pack : Marks an item as packed in the packing list.\n" + - "\tExample: pack toothbrush"; + "\tExample: pack 2 of 3\n" + + "\tMeaning: packs 2 quantities of the third item in the packing list"; public PackCommand(int targetIndex) { diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index 738ebe07ae..5e35bf08c7 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -8,7 +8,8 @@ public class UnpackCommand extends Command { public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; public static final String HELP_MSG = "unpack : Marks an item as unpacked in the packing list.\n" + - "\tExample: unpack toothbrush"; + "\tExample: unpack 1 of 2\n" + + "\tMeaning: unpacks 1 quantity of the second item in the packing list"; public UnpackCommand(int targetIndex) { diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 74f3691827..28eed17a8d 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -75,11 +75,11 @@ public static Command parse() { case "list": return listCommand(); case "help": - return helpCommand(); + return createHelpObj(); case "deletelist": - return deleteList(); + return createDeletelistObj(); case "bye": - return callByeCmd(); + return createByeObj(); default: return new IncorrectCommand("'" + Parser.getCommand() + "' is an invalid User Command", "input 'help' to receive all valid commands"); @@ -288,15 +288,15 @@ public static Command listCommand() { return new ListCommand(); } - public static Command deleteList() { + public static Command createDeletelistObj() { return new DeleteListCommand(); } - private static Command helpCommand() { + private static Command createHelpObj() { return new HelpCommand(); } - private static Command callByeCmd() { + private static Command createByeObj() { return new ByeCommand(); } } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index 1cd8c25c04..fc9949c2bb 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -9,7 +9,11 @@ public class PackingList { private static ArrayList itemList = new ArrayList<>(); + private static int targetIndex = -1; + public static void setItemList(ArrayList itemList) { + PackingList.itemList = itemList; + } /** * Getter for itemList From b87db85fb8af50f4b4584b8053351250b6178293 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 22 Mar 2023 15:15:50 +0800 Subject: [PATCH 043/207] Refactor naming in CommandsTest class --- src/test/java/bagpacker/packingfunctest/CommandsTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/bagpacker/packingfunctest/CommandsTest.java b/src/test/java/bagpacker/packingfunctest/CommandsTest.java index 9207610f45..88ef7ab2f7 100644 --- a/src/test/java/bagpacker/packingfunctest/CommandsTest.java +++ b/src/test/java/bagpacker/packingfunctest/CommandsTest.java @@ -29,8 +29,8 @@ public void testAddCommand() { Assertions.assertNotEquals("tooth", packingList.get(0).getItemName()); // Expect second index item in the packing list to be toothpaste - Item item_two = new Item("toothpaste"); - addCommand = new AddCommand(item_two); + Item itemTwo = new Item("toothpaste"); + addCommand = new AddCommand(itemTwo); addCommand.execute(packingList); Assertions.assertEquals("toothpaste",packingList.get(1).getItemName()); From cecb427ef0824400b674a37b54d93948fd172599 Mon Sep 17 00:00:00 2001 From: Sophie Date: Wed, 22 Mar 2023 15:53:54 +0800 Subject: [PATCH 044/207] Update developer guide with add, delete command, target user profile and value proposition --- docs/DeveloperGuide.md | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index dfe2cd8504..7ea734cf4a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -14,6 +14,20 @@ For all valid commands, the mechanism of implementation are as follows: 3. Execute command object - ```runBagPacker()``` method executes the ```.execute()``` method (overridden by child classes) of the command object which runs the actual command function +#### Add Command + +Add command is used to add a quantity of items to the packing list. + +Mechanism: ```AddCommand.execute()``` calls the ```PackingList.addItem()``` method from the ```PackingList``` class which executes the ```ArrayList.add()``` method to add the item to the ```PackingList``` ArrayList. +It then updates the ```quantity``` variable according to the quantity inputted by the user. + +#### Delete Command + +Delete command is used to delete an item from the packing list. + +Mechanism: ```DeleteCommand.execute()``` calls the ```PackingList.deleteItem()``` method from the ```PackingList``` class which executes the ```ArrayList.remove()``` method to remove the item from the ```PackingList``` ArrayList. + + #### Help Command Help command is used to exit the BagPacker application. @@ -21,8 +35,8 @@ Execute: ```HelpCommand.execute()``` prints the following help message. ``` All Commands: -1. add : Adds an item to the packing list. - Example: add toothbrush +1. add : Adds a quantity of items to the packing list. + Example: add 3 toothbrushes 2. delete : Deletes an item from the packing list. Example: delete 1 3. list : List all items in packing list. @@ -57,11 +71,12 @@ Mechanism: ```DeleteListCommand.execute()``` reassigns the existing ```packingLi ### Target user profile -{Describe the target user profile} +BagPacker is for NUS students, in particular, exchange students who travel a lot and want a simple CLI to keep track of their packing. ### Value proposition -{Describe the value proposition: what problem does it solve?} +BagPacker aims to help busy students simplify their packing process by allowing easy adding of items to pack and record of the items they have already packed so that they can be organised and aboard their travels with ease. + ## User Stories From dae2205d9145c93ede3f7bee7b93d6da7a0f92be Mon Sep 17 00:00:00 2001 From: Sophie Date: Wed, 22 Mar 2023 16:04:10 +0800 Subject: [PATCH 045/207] Edit add command UG description --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 7ea734cf4a..869674cb22 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -16,7 +16,7 @@ For all valid commands, the mechanism of implementation are as follows: #### Add Command -Add command is used to add a quantity of items to the packing list. +Add command is used to add a quantity of item(s) to the packing list. Mechanism: ```AddCommand.execute()``` calls the ```PackingList.addItem()``` method from the ```PackingList``` class which executes the ```ArrayList.add()``` method to add the item to the ```PackingList``` ArrayList. It then updates the ```quantity``` variable according to the quantity inputted by the user. From f7c1f0bab397eb2926859ddd3f3e447ec715c724 Mon Sep 17 00:00:00 2001 From: coregano Date: Wed, 22 Mar 2023 23:22:49 +0800 Subject: [PATCH 046/207] Update DevGuide --- docs/DeveloperGuide.md | 19 +++++++++++++++++-- docs/img_1.png | Bin 0 -> 38579 bytes 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 docs/img_1.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index a9cccc14b2..879a385768 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,4 +1,5 @@ -[DeveloperGuide.md](DeveloperGuide.md)# Developer Guide +[DeveloperGuide.md](DeveloperGuide.md) +# Developer Guide ## Acknowledgements @@ -6,7 +7,21 @@ ## Design & implementation -{Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} +### Preventing duplicate items + +When using the `add` function, we have decided to implement a passive function that checks whether the item with the same name already exists in the packingList. + +This is done through the `contains()` method in class `PackingList()`, which is called during `execute` in an `AddCommand` object. + +Below is the UML diagram showing what occurs during `add` function. +![img_1.png](img_1.png) +When `execute()` is called in `a`(object of class `AddCommand`), the `addItem(item)` method is called in the object `packingList`. This method will see if method `contains()` will return `true`. + +The `contains()` method, which is shown as a reference on the right of the UML diagram, is a boolean method that loops through all items in the packingList, and returns `true` if any of the existing items have the same description as the item to be added in `toAdd`, and `false` otherwise. + +When `contains()` returns `true`, method `addItem(item)` will be interrupted and a `DuplicateItemException` will be thrown from `packingList`, which will be caught by `a`. If `contains()` returns false, the item will be added onto `packingList`. + +In both scenarios, `ui.printToUser` will be called to print a message to the user. In the former case, `ExistItemError` will be printed, while `AddSuccess` will be shown if the item was added with no issues. ## Product scope diff --git a/docs/img_1.png b/docs/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6899bf1bc9187a05077c7cf5c275153ce46b910a GIT binary patch literal 38579 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 literal 0 HcmV?d00001 From 352822d344c1271a4ecd5e1d06001b5df88f0843 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Thu, 23 Mar 2023 15:21:51 +0800 Subject: [PATCH 047/207] Update Developer Guide with Pack and Unpack Commands --- docs/DeveloperGuide.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f171e5cf9a..30cb13bfe2 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -83,7 +83,16 @@ The ```runBagPacker()``` method will continually parse and execute relevant comm Mechanism: ```DeleteListCommand.execute()``` reassigns the existing ```packingList``` to a new empty ArrayList of Items, thus deleting the ```packingList```. +#### Pack Command +```PackCommand``` is used to mark an item in the list as packed. +Mechanism: ```PackCommand.execute()``` calls the ```PackingList.packItem()``` method from the ```PackingList``` class. +This will execute the ```setPacked()``` method to set the value of the boolean ```isPacked``` to be ```true```, and mark the item as packed in the ```PackingList``` ArrayList. + +#### Unpack Command +```Unpack Command``` is used to mark an item in the list as unpacked. +Mechanism: ```UnpackCommand.execute()``` calls the ```PackingList.unpackItem()``` method from the ```PackingList``` class. +This will execute the ```setPacked``` method to set the value of the boolean ```isPacked``` to be ```false```, and mark the item as unpacked in the ```PackingList``` ArrayList. ## Product scope From e8510a25fe48482aa491a7314f5abad5d1659255 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Thu, 23 Mar 2023 15:42:20 +0800 Subject: [PATCH 048/207] Remove unused method getItemDescrip from Parser --- docs/DeveloperGuide.md | 1 + src/main/java/bagpacker/iohandler/Parser.java | 11 ----------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 30cb13bfe2..dcb4e5a69b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -91,6 +91,7 @@ This will execute the ```setPacked()``` method to set the value of the boolean ` #### Unpack Command ```Unpack Command``` is used to mark an item in the list as unpacked. + Mechanism: ```UnpackCommand.execute()``` calls the ```PackingList.unpackItem()``` method from the ```PackingList``` class. This will execute the ```setPacked``` method to set the value of the boolean ```isPacked``` to be ```false```, and mark the item as unpacked in the ```PackingList``` ArrayList. diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 28eed17a8d..8235fe140e 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -181,17 +181,6 @@ public static String getVariable(String command) throws InvalidVariablesExceptio return itemVariable; } - - /** - * Returns the user item description - */ - public static String getItemDescrip() { - //String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length); - int indexItemName = getFullInput().indexOf("i/") + 2; - return getFullInput().substring(indexItemName).trim(); - } - - /** * Attempts to create AddCommand object to be executed where it is called from * From c3fde0d92682dca9a8de7e9d0c3497ef7166ab4d Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Thu, 23 Mar 2023 19:31:56 +0800 Subject: [PATCH 049/207] Enhance Item class to support quantities Enhance Add, Pack and Unpack support improved Item class Refactor Parser to support new input format --- .../java/bagpacker/commands/AddCommand.java | 4 +- .../java/bagpacker/commands/ListCommand.java | 10 +- .../java/bagpacker/commands/PackCommand.java | 7 +- .../bagpacker/commands/UnpackCommand.java | 60 ++--- src/main/java/bagpacker/iohandler/Parser.java | 232 ++++++++++-------- .../java/bagpacker/iohandler/Storage.java | 22 +- src/main/java/bagpacker/iohandler/Ui.java | 6 +- src/main/java/bagpacker/packingfunc/Item.java | 43 ++-- .../bagpacker/packingfunc/PackingList.java | 12 +- .../packingfunctest/CommandsTest.java | 7 +- 10 files changed, 211 insertions(+), 192 deletions(-) diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index 3e73fc1e84..6a467ec470 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -11,8 +11,8 @@ public class AddCommand extends Command { private final Item item; - public AddCommand(Item item) { - this.item = item; + public AddCommand(int quantity, String description) { + this.item = new Item(quantity, description); } @Override diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index 279520a779..bf66f3ebb1 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -19,14 +19,8 @@ public void execute(PackingList packingList) { System.out.println("____________________________________________________________"); System.out.println("Here are the items in your list"); for (int i = 0; i < packingList.size(); i++) { - String isItemPacked; - if (packingList.get(i).getIsPacked()) { - isItemPacked = "X"; - } else { - isItemPacked = " "; - } - String itemName = packingList.get(i).getItemName(); - System.out.println((i + 1) + ". [" + isItemPacked + "] " + itemName); + System.out.print((i + 1) + ". "); + System.out.println(PackingList.get(i)); } System.out.println("____________________________________________________________"); } diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index fb7b0c8295..e09e0cb252 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -5,15 +5,16 @@ import bagpacker.packingfunc.PackingList; public class PackCommand extends Command { - + private static int packQuantity; public static final String MSG_SUCCESS_PACK = "Item packed: %s"; public static final String HELP_MSG= "pack : Marks an item as packed in the packing list.\n" + "\tExample: pack 2 of 3\n" + "\tMeaning: packs 2 quantities of the third item in the packing list"; - public PackCommand(int targetIndex) { + public PackCommand(int quantity, int targetIndex) { super(targetIndex); + packQuantity = quantity; assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): "Pack Command Target index is out of bounds"; } @@ -22,7 +23,7 @@ public PackCommand(int targetIndex) { public void execute(PackingList packingList) { this.packingList = packingList; final Item item = getTargetItem(); - packingList.packItem(item); + packingList.packItem(item, packQuantity); Ui.printToUser(String.format(MSG_SUCCESS_PACK, item)); } diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index 5e35bf08c7..d8fc98e173 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -1,29 +1,31 @@ -package bagpacker.commands; - -import bagpacker.iohandler.Ui; -import bagpacker.packingfunc.Item; -import bagpacker.packingfunc.PackingList; - -public class UnpackCommand extends Command { - - public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; - public static final String HELP_MSG = "unpack : Marks an item as unpacked in the packing list.\n" + - "\tExample: unpack 1 of 2\n" + - "\tMeaning: unpacks 1 quantity of the second item in the packing list"; - - - public UnpackCommand(int targetIndex) { - super(targetIndex); - assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): - "Unpack Command Target index is out of bounds"; - } - - @Override - public void execute(PackingList packingList) { - this.packingList = packingList; - final Item item = getTargetItem(); - packingList.unpackItem(item); - Ui.printToUser(String.format(MSG_SUCCESS_UNPACK, item)); - } - -} +//package bagpacker.commands; +// +//import bagpacker.iohandler.Ui; +//import bagpacker.packingfunc.Item; +//import bagpacker.packingfunc.PackingList; +// +//public class UnpackCommand extends Command { +// private static int unpackQuantity; +// +// public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; +// public static final String HELP_MSG = "unpack : Marks an item as unpacked in the packing list.\n" + +// "\tExample: unpack 1 of 2\n" + +// "\tMeaning: unpacks 1 quantity of the second item in the packing list"; +// +// +// public UnpackCommand(int quantity, int targetIndex) { +// super(targetIndex); +// unpackQuantity = quantity; +// assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): +// "Unpack Command Target index is out of bounds"; +// } +// +// @Override +// public void execute(PackingList packingList) { +// this.packingList = packingList; +// final Item item = getTargetItem(); +// packingList.unpackItem(item, unpackQuantity); +// Ui.printToUser(String.format(MSG_SUCCESS_UNPACK, item)); +// } +// +//} diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 8235fe140e..248c177e97 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -10,47 +10,49 @@ import bagpacker.commands.IncorrectCommand; import bagpacker.commands.ListCommand; import bagpacker.commands.PackCommand; -import bagpacker.commands.UnpackCommand; +//import bagpacker.commands.UnpackCommand; import bagpacker.exception.EmptyInputException; import bagpacker.exception.InvalidIndexException; import bagpacker.exception.InvalidVariablesException; -import bagpacker.packingfunc.Item; +//import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; -import java.util.ArrayList; -import java.util.Arrays; +//import java.util.ArrayList; +//import java.util.Arrays; import java.util.Scanner; /** * Parser class contains methods to manipulate user input */ public class Parser { - private static ArrayList inputStringArray; +// private static ArrayList inputStringArray; + private static String[] arguments; private static String fullInput; public static void setFullInput(String fullInput) { Parser.fullInput = fullInput; } - /** - * Returns the user input as in array format - */ - public static ArrayList getInputStringArray() { - return inputStringArray; - } +// /** +// * Returns the user input as in array format +// */ +// public static ArrayList getInputStringArray() { +// return inputStringArray; +// } - public static void setInputStringArray(String[] inputStringArray) { - Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray)); - } +// public static void setInputStringArray(String[] inputStringArray) { +// Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray)); +// } - /** - * Returns the user input in String format - */ - public static String getFullInput() { - return fullInput; - } +// /** +// * Returns the user input in String format +// */ +// public static String getFullInput() { +// return fullInput; +// } public static Command parse() { + arguments = new String[2]; String inputLine = ""; while (inputLine.isEmpty()) { try { @@ -61,30 +63,34 @@ public static Command parse() { } } setFullInput(inputLine); - String[] inputStringList = inputLine.trim().split(" "); - setInputStringArray(inputStringList); + String[] inputStringList = inputLine.trim().split(" ", 2); switch (inputStringList[0]) { - case "add": - return createAddObj(); - case "delete": - return createDeleteObj(); - case "pack": - return createPackObj(); - case "unpack": - return createUnpackObj(); - case "list": - return listCommand(); - case "help": - return createHelpObj(); - case "deletelist": - return createDeletelistObj(); - case "bye": - return createByeObj(); - default: - return new IncorrectCommand("'" + Parser.getCommand() + "' is an invalid User Command", - "input 'help' to receive all valid commands"); + case "add": + arguments = inputStringList[1].trim().split("/of"); + return createAddObj(); + case "delete": + arguments[0] = inputStringList[1].trim(); + return createDeleteObj(); + case "pack": + arguments = inputStringList[1].trim().split("/of"); + return createPackObj(); + case "unpack": + arguments = inputStringList[1].trim().split("/of"); + return createUnpackObj(); + case "list": + return listCommand(); + case "help": + return createHelpObj(); + case "deletelist": + return createDeletelistObj(); + case "bye": + return createByeObj(); + default: + return new IncorrectCommand("'" + inputStringList[0] + "' is an invalid User Command", + "input 'help' to receive all valid commands"); } } + /** * Reads and returns the full user input from the command line interface * - trims the leading and trailing white spaces @@ -102,35 +108,35 @@ private static String readLine() throws EmptyInputException { return inputLine; } - /** - * Returns the user command in lower case - * - * @return command from user - */ - public static String getCommand() { - String command = getInputStringArray().get(0).toLowerCase(); - return command; - } +// /** +// * Returns the user command in lower case +// * +// * @return command from user +// */ +// public static String getCommand() { +// String command = getInputStringArray().get(0).toLowerCase(); +// return command; +// } - /** - * Returns a string which represents the name of the item from the user input - * - * @return inputVariables which is the name of the item - * @throws InvalidVariablesException when the item name cannot be found - */ - public static String getItemName() throws InvalidVariablesException { - String itemName; - if (inputStringArray.size() <= 1) { - throw new InvalidVariablesException(); - } - try { - int itemIndStart = fullInput.indexOf(" ") + 1; - itemName = fullInput.substring(itemIndStart); - } catch (IndexOutOfBoundsException e) { - throw new InvalidVariablesException(); - } - return itemName; - } +// /** +// * Returns a string which represents the name of the item from the user input +// * +// * @return inputVariables which is the name of the item +// * @throws InvalidVariablesException when the item name cannot be found +// */ +// public static String getItemName() throws InvalidVariablesException { +// String itemName; +// if (inputStringArray.size() <= 1) { +// throw new InvalidVariablesException(); +// } +// try { +// int itemIndStart = fullInput.indexOf(" ") + 1; +// itemName = fullInput.substring(itemIndStart); +// } catch (IndexOutOfBoundsException e) { +// throw new InvalidVariablesException(); +// } +// return itemName; +// } /** * Returns a string which represents the index of the item from the user input @@ -141,7 +147,7 @@ public static String getItemName() throws InvalidVariablesException { public static String getItemIndex() throws InvalidIndexException { String inputIndex; int itemIndex; - if (inputStringArray.size() != 2) { + if (arguments[0] == null) { throw new InvalidIndexException(); } try { @@ -156,63 +162,61 @@ public static String getItemIndex() throws InvalidIndexException { } return inputIndex; } + /** * Returns a string which represents the relevant variable depending on the command * - "add" will return the item name * - "delete", "pack", "unpack" will return item index * - * @param command used to determine the type of variable to return * @return itemVariable which is the index OR name of the item in packing list * @throws InvalidIndexException when the item index is not valid */ - public static String getVariable(String command) throws InvalidVariablesException, InvalidIndexException { + public static String getVariable() throws InvalidIndexException { String itemVariable; try { - if (command.equals("add")) { - itemVariable = getItemName(); - } else { +// if (command.equals("add")) { +// itemVariable = getItemName(); +// } else { itemVariable = getItemIndex(); - } - } catch (InvalidVariablesException e) { - throw new InvalidVariablesException(); +// } } catch (InvalidIndexException e) { throw new InvalidIndexException(); } return itemVariable; } - /** - * Attempts to create AddCommand object to be executed where it is called from - * - * @return AddCommand the command to be executed to add an item to the packing list, else - * an IncorrectCommand is created to be executed - */ + public static String[] getQuantityAndDescription() { + String[] itemQuantityAndDescription = new String[2]; + itemQuantityAndDescription[0] = arguments[0]; + itemQuantityAndDescription[1] = arguments[1]; + return itemQuantityAndDescription; + } + public static Command createAddObj() { - try { - String itemName = getVariable("add"); - return new AddCommand(new Item(itemName)); - } catch (InvalidVariablesException e) { - return new IncorrectCommand("Invalid Item Name", - "try to input a name (word(s)) to be added into the list"); - } catch (InvalidIndexException e) { - return new IncorrectCommand("Invalid Item Index", - "try to input an integer number between 1 and " + PackingList.getItemList().size()); - } +// try { + String[] quantityAndDescription = getQuantityAndDescription(); + int itemQuantity = Integer.parseInt((quantityAndDescription[0]).trim()); + String itemDescription = quantityAndDescription[1].trim(); + return new AddCommand(itemQuantity, itemDescription); +// } catch (InvalidVariablesException e) { +// return new IncorrectCommand("Invalid Item Name", +// "try to input a name (word(s)) to be added into the list"); +// } catch (InvalidIndexException e) { +// return new IncorrectCommand("Invalid Item Index", +// "try to input an integer number between 1 and " + PackingList.getItemList().size()); +// } } /** * Attempts to create DeleteCommand object to be executed where it is called from * * @return DeleteCommand the command to be executed to delete an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createDeleteObj() { try { - String itemIndex = getVariable("delete"); + String itemIndex = getVariable(); return new DeleteCommand(Integer.parseInt(itemIndex)); - } catch (InvalidVariablesException e) { - return new IncorrectCommand("Invalid Item Name", - "Try to input a name (word(s)) to be added into the list"); } catch (InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { return new IncorrectCommand("Invalid Item Index", @@ -224,16 +228,32 @@ public static Command createDeleteObj() { } } + public static int[] getQuantityAndIndex() throws InvalidVariablesException, InvalidIndexException { + int[] itemQuantityAndIndex = new int[2]; + // quantity is itemQuantityAndIndex[0], index is itemQuantityAndIndex[1] + try { + itemQuantityAndIndex[0] = Integer.parseInt(arguments[0].trim()); + itemQuantityAndIndex[1] = Integer.parseInt(arguments[1].trim()); + } catch (IndexOutOfBoundsException e) { + throw new InvalidVariablesException(); + } catch (NumberFormatException e) { + throw new InvalidIndexException(); + } + return itemQuantityAndIndex; + } + /** * Attempts to create PackCommand object to be executed where it is called from * * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createPackObj() { try { - String itemIndex = getVariable("pack"); - return new PackCommand(Integer.parseInt(itemIndex)); + int[] quantityAndIndex = getQuantityAndIndex(); + int itemQuantity = quantityAndIndex[0]; + int itemIndex = quantityAndIndex[1]; + return new PackCommand(itemQuantity, itemIndex); } catch (InvalidVariablesException e) { return new IncorrectCommand("Invalid Item Name", "try to input a name (word(s)) to be added into the list"); @@ -253,12 +273,14 @@ public static Command createPackObj() { * Attempts to create UnpackCommand object to be executed where it is called from * * @return UnpackCommand the command to be executed to unpack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createUnpackObj() { try { - String itemIndex = getVariable("unpack"); - return new UnpackCommand(Integer.parseInt(itemIndex)); + int[] quantityAndIndex = getQuantityAndIndex(); + int itemQuantity = -1 * quantityAndIndex[0]; + int itemIndex = quantityAndIndex[1]; + return new PackCommand(itemQuantity, itemIndex); } catch (InvalidVariablesException e) { return new IncorrectCommand("Invalid Item Name", "try to input a name (word(s)) to be added into the list"); diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java index 212fefb558..aeb5184821 100644 --- a/src/main/java/bagpacker/iohandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -17,17 +17,17 @@ public class Storage { public static ArrayList packingList = new ArrayList<>(); private static final String FILE_PATH = "packingList.txt"; - public static void load() throws FileNotFoundException { - Scanner reader = new Scanner(new File(FILE_PATH)); - String line; - while (reader.hasNext()) { - line = reader.nextLine(); - boolean isPacked = line.charAt(1) == 'X'; - String itemDesc = line.substring(4); - Item item = new Item(itemDesc, isPacked); - PackingList.getItemList().add(item); - } - } +// public static void load() throws FileNotFoundException { +// Scanner reader = new Scanner(new File(FILE_PATH)); +// String line; +// while (reader.hasNext()) { +// line = reader.nextLine(); +// boolean isPacked = line.charAt(1) == 'X'; +// String itemDesc = line.substring(4); +// Item item = new Item(itemDesc, isPacked); +// PackingList.getItemList().add(item); +// } +// } public static void save() { try { diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index 4b77544a14..31963fd398 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -5,7 +5,7 @@ import bagpacker.commands.DeleteCommand; import bagpacker.commands.ListCommand; import bagpacker.commands.PackCommand; -import bagpacker.commands.UnpackCommand; +//import bagpacker.commands.UnpackCommand; /** * Ui class contains methods to print messages to user interface on Command Line Interface @@ -66,8 +66,8 @@ public static void helpMessage() { System.out.println("2. " + DeleteCommand.HELP_MSG); System.out.println("3. " + ListCommand.HELP_MSG); System.out.println("4. " + PackCommand.HELP_MSG); - System.out.println("5. " + UnpackCommand.HELP_MSG); - System.out.println("6. " + ByeCommand.HELP_MSG); +// System.out.println("5. " + UnpackCommand.HELP_MSG); + System.out.println("5. " + ByeCommand.HELP_MSG); printLine(); } diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index 2249ccc272..abf2c57093 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -5,37 +5,38 @@ */ public class Item { private String itemName; - private boolean isPacked; + private int packedQuantity; + private int totalQuantity; private String packIcon = " "; - public Item(String description) { + public Item(int quantity, String description) { this.itemName = description; - isPacked = false; - } - public Item(String description, boolean isPacked) { - this.itemName = description; - this.isPacked = isPacked; - } - public void setPackIcon() { - if (this.isPacked) { - this.packIcon = "X"; - } else { - this.packIcon = " "; - } + packedQuantity = 0; + totalQuantity = quantity; } +// public Item(String description, boolean isPacked) { +// this.itemName = description; +// this.isPacked = isPacked; +// } +// public void setPackIcon() { +// if (this.isPacked) { +// this.packIcon = "X"; +// } else { +// this.packIcon = " "; +// } +// } public String getItemName() { return itemName; } - public boolean getIsPacked() { - return isPacked; - } - public void setPacked(boolean packed) { - isPacked = packed; - setPackIcon(); +// public boolean getIsPacked() { +// return isPacked; +// } + public void setPacked(int quantity) { + this.packedQuantity += quantity; } public String toString() { - return "[" + this.packIcon + "] " + this.getItemName(); + return "[" + packedQuantity + "/" + totalQuantity + "] " + this.getItemName(); } } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index fc9949c2bb..12e5a58a54 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -38,17 +38,17 @@ public void deleteItem(Item toDelete) { } /** - * Marks an item as packed in the list. + * Adds quantity to quantity already packed */ - public void packItem(Item toPack) { - toPack.setPacked(true); + public void packItem(Item toPack, int quantity) { + toPack.setPacked(quantity); } /** - * Marks an item as unpacked in the list. + * Subtracts quantity from quantity already packed */ - public void unpackItem(Item toPack) { - toPack.setPacked(false); + public void unpackItem(Item toPack, int quantity) { + toPack.setPacked(quantity); } public static Item get(int targetIndex) { diff --git a/src/test/java/bagpacker/packingfunctest/CommandsTest.java b/src/test/java/bagpacker/packingfunctest/CommandsTest.java index 88ef7ab2f7..ef25581a0b 100644 --- a/src/test/java/bagpacker/packingfunctest/CommandsTest.java +++ b/src/test/java/bagpacker/packingfunctest/CommandsTest.java @@ -20,8 +20,7 @@ public void sampleTest() { @Test public void testAddCommand() { PackingList packingList = new PackingList(); - Item item = new Item("toothbrush"); - Command addCommand = new AddCommand(item); + Command addCommand = new AddCommand(1, "toothbrush"); addCommand.execute(packingList); // Expect a Packinglist with a toothbrush item in first index @@ -29,8 +28,8 @@ public void testAddCommand() { Assertions.assertNotEquals("tooth", packingList.get(0).getItemName()); // Expect second index item in the packing list to be toothpaste - Item itemTwo = new Item("toothpaste"); - addCommand = new AddCommand(itemTwo); +// Item itemTwo = new Item("toothpaste"); + addCommand = new AddCommand(1, "toothpaste"); addCommand.execute(packingList); Assertions.assertEquals("toothpaste",packingList.get(1).getItemName()); From be6c56eedfd79e8c40a4576d0d6f0264ad695328 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Thu, 23 Mar 2023 19:45:45 +0800 Subject: [PATCH 050/207] Remove unused methods and comments --- src/main/java/bagpacker/BagPacker.java | 1 + .../java/bagpacker/commands/AddCommand.java | 2 +- .../java/bagpacker/commands/ByeCommand.java | 3 +- src/main/java/bagpacker/commands/Command.java | 3 +- .../bagpacker/commands/DeleteListCommand.java | 6 +- .../bagpacker/commands/IncorrectCommand.java | 1 + .../java/bagpacker/commands/PackCommand.java | 4 +- .../bagpacker/commands/UnpackCommand.java | 31 -------- .../exception/InvalidIndexException.java | 4 +- .../exception/InvalidVariablesException.java | 4 +- src/main/java/bagpacker/iohandler/Parser.java | 77 ++----------------- .../java/bagpacker/iohandler/Storage.java | 2 + src/main/java/bagpacker/iohandler/Ui.java | 2 - src/main/java/bagpacker/packingfunc/Item.java | 17 +--- .../bagpacker/packingfunc/PackingList.java | 6 +- 15 files changed, 23 insertions(+), 140 deletions(-) delete mode 100644 src/main/java/bagpacker/commands/UnpackCommand.java diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index ce64d96cbe..7fe2678c6a 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -8,6 +8,7 @@ public class BagPacker { private static PackingList packingList; + /** * Main entry-point for the java.BagPacker application. */ diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index 6a467ec470..1c6b4b201b 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -7,7 +7,7 @@ public class AddCommand extends Command { public static final String MSG_SUCCESS_ADD = "New item added: %s"; public static final String HELP_MSG = "add : Adds an item to the packing list.\n" + - "\tExample: add toothbrush"; + "\tExample: add toothbrush"; private final Item item; diff --git a/src/main/java/bagpacker/commands/ByeCommand.java b/src/main/java/bagpacker/commands/ByeCommand.java index 1da5969222..b5616f236e 100644 --- a/src/main/java/bagpacker/commands/ByeCommand.java +++ b/src/main/java/bagpacker/commands/ByeCommand.java @@ -9,7 +9,8 @@ public class ByeCommand extends Command { public static boolean isBagPackerRunning = true; public static final String HELP_MSG = "bye : Stops the BagPacker Application\n" + "\tExample: bye"; - public void execute (PackingList packingList) { + + public void execute(PackingList packingList) { this.isBagPackerRunning = false; } } diff --git a/src/main/java/bagpacker/commands/Command.java b/src/main/java/bagpacker/commands/Command.java index b3ce81ba9e..967691f9f9 100644 --- a/src/main/java/bagpacker/commands/Command.java +++ b/src/main/java/bagpacker/commands/Command.java @@ -37,13 +37,12 @@ protected Item getTargetItem() throws IndexOutOfBoundsException { return packingList.get(getTargetIndex() - 1); } - /** * Executes the command which requires a packingList * * @param packingList used to execute the command */ - public void execute (PackingList packingList) { + public void execute(PackingList packingList) { } } diff --git a/src/main/java/bagpacker/commands/DeleteListCommand.java b/src/main/java/bagpacker/commands/DeleteListCommand.java index ea4ea801c8..90992d80ad 100644 --- a/src/main/java/bagpacker/commands/DeleteListCommand.java +++ b/src/main/java/bagpacker/commands/DeleteListCommand.java @@ -8,13 +8,11 @@ public class DeleteListCommand extends Command { public static final String MSG_SUCCESS_DELETE_LIST = "list deleted"; + @Override public void execute(PackingList packingList) { - ArrayList< Item > emptyList = new ArrayList<>(); + ArrayList emptyList = new ArrayList<>(); packingList.setItemList(emptyList); Ui.printToUser(String.format(MSG_SUCCESS_DELETE_LIST)); } - - - } diff --git a/src/main/java/bagpacker/commands/IncorrectCommand.java b/src/main/java/bagpacker/commands/IncorrectCommand.java index 4932cb1c29..038cec642a 100644 --- a/src/main/java/bagpacker/commands/IncorrectCommand.java +++ b/src/main/java/bagpacker/commands/IncorrectCommand.java @@ -6,6 +6,7 @@ public class IncorrectCommand extends Command { private final String errorType; private final String helpMessage; + public IncorrectCommand(String errorType, String helpMessage) { this.helpMessage = helpMessage; this.errorType = errorType; diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index e09e0cb252..d0db619c95 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -7,7 +7,7 @@ public class PackCommand extends Command { private static int packQuantity; public static final String MSG_SUCCESS_PACK = "Item packed: %s"; - public static final String HELP_MSG= "pack : Marks an item as packed in the packing list.\n" + + public static final String HELP_MSG = "pack : Marks an item as packed in the packing list.\n" + "\tExample: pack 2 of 3\n" + "\tMeaning: packs 2 quantities of the third item in the packing list"; @@ -15,7 +15,7 @@ public class PackCommand extends Command { public PackCommand(int quantity, int targetIndex) { super(targetIndex); packQuantity = quantity; - assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): + assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : "Pack Command Target index is out of bounds"; } diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java deleted file mode 100644 index d8fc98e173..0000000000 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ /dev/null @@ -1,31 +0,0 @@ -//package bagpacker.commands; -// -//import bagpacker.iohandler.Ui; -//import bagpacker.packingfunc.Item; -//import bagpacker.packingfunc.PackingList; -// -//public class UnpackCommand extends Command { -// private static int unpackQuantity; -// -// public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; -// public static final String HELP_MSG = "unpack : Marks an item as unpacked in the packing list.\n" + -// "\tExample: unpack 1 of 2\n" + -// "\tMeaning: unpacks 1 quantity of the second item in the packing list"; -// -// -// public UnpackCommand(int quantity, int targetIndex) { -// super(targetIndex); -// unpackQuantity = quantity; -// assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): -// "Unpack Command Target index is out of bounds"; -// } -// -// @Override -// public void execute(PackingList packingList) { -// this.packingList = packingList; -// final Item item = getTargetItem(); -// packingList.unpackItem(item, unpackQuantity); -// Ui.printToUser(String.format(MSG_SUCCESS_UNPACK, item)); -// } -// -//} diff --git a/src/main/java/bagpacker/exception/InvalidIndexException.java b/src/main/java/bagpacker/exception/InvalidIndexException.java index c67a8009b6..61268b25d7 100644 --- a/src/main/java/bagpacker/exception/InvalidIndexException.java +++ b/src/main/java/bagpacker/exception/InvalidIndexException.java @@ -1,6 +1,4 @@ package bagpacker.exception; - - -public class InvalidIndexException extends Exception{ +public class InvalidIndexException extends Exception { } diff --git a/src/main/java/bagpacker/exception/InvalidVariablesException.java b/src/main/java/bagpacker/exception/InvalidVariablesException.java index 428e531525..163e70c5cb 100644 --- a/src/main/java/bagpacker/exception/InvalidVariablesException.java +++ b/src/main/java/bagpacker/exception/InvalidVariablesException.java @@ -1,6 +1,4 @@ package bagpacker.exception; - - -public class InvalidVariablesException extends Exception{ +public class InvalidVariablesException extends Exception { } diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 248c177e97..31f001085d 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -1,6 +1,5 @@ package bagpacker.iohandler; - import bagpacker.commands.AddCommand; import bagpacker.commands.ByeCommand; import bagpacker.commands.Command; @@ -10,22 +9,17 @@ import bagpacker.commands.IncorrectCommand; import bagpacker.commands.ListCommand; import bagpacker.commands.PackCommand; -//import bagpacker.commands.UnpackCommand; import bagpacker.exception.EmptyInputException; import bagpacker.exception.InvalidIndexException; import bagpacker.exception.InvalidVariablesException; -//import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; -//import java.util.ArrayList; -//import java.util.Arrays; import java.util.Scanner; /** * Parser class contains methods to manipulate user input */ public class Parser { -// private static ArrayList inputStringArray; private static String[] arguments; private static String fullInput; @@ -33,24 +27,6 @@ public static void setFullInput(String fullInput) { Parser.fullInput = fullInput; } -// /** -// * Returns the user input as in array format -// */ -// public static ArrayList getInputStringArray() { -// return inputStringArray; -// } - -// public static void setInputStringArray(String[] inputStringArray) { -// Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray)); -// } - -// /** -// * Returns the user input in String format -// */ -// public static String getFullInput() { -// return fullInput; -// } - public static Command parse() { arguments = new String[2]; String inputLine = ""; @@ -108,36 +84,6 @@ private static String readLine() throws EmptyInputException { return inputLine; } -// /** -// * Returns the user command in lower case -// * -// * @return command from user -// */ -// public static String getCommand() { -// String command = getInputStringArray().get(0).toLowerCase(); -// return command; -// } - -// /** -// * Returns a string which represents the name of the item from the user input -// * -// * @return inputVariables which is the name of the item -// * @throws InvalidVariablesException when the item name cannot be found -// */ -// public static String getItemName() throws InvalidVariablesException { -// String itemName; -// if (inputStringArray.size() <= 1) { -// throw new InvalidVariablesException(); -// } -// try { -// int itemIndStart = fullInput.indexOf(" ") + 1; -// itemName = fullInput.substring(itemIndStart); -// } catch (IndexOutOfBoundsException e) { -// throw new InvalidVariablesException(); -// } -// return itemName; -// } - /** * Returns a string which represents the index of the item from the user input * @@ -174,11 +120,7 @@ public static String getItemIndex() throws InvalidIndexException { public static String getVariable() throws InvalidIndexException { String itemVariable; try { -// if (command.equals("add")) { -// itemVariable = getItemName(); -// } else { - itemVariable = getItemIndex(); -// } + itemVariable = getItemIndex(); } catch (InvalidIndexException e) { throw new InvalidIndexException(); } @@ -193,18 +135,10 @@ public static String[] getQuantityAndDescription() { } public static Command createAddObj() { -// try { - String[] quantityAndDescription = getQuantityAndDescription(); - int itemQuantity = Integer.parseInt((quantityAndDescription[0]).trim()); - String itemDescription = quantityAndDescription[1].trim(); - return new AddCommand(itemQuantity, itemDescription); -// } catch (InvalidVariablesException e) { -// return new IncorrectCommand("Invalid Item Name", -// "try to input a name (word(s)) to be added into the list"); -// } catch (InvalidIndexException e) { -// return new IncorrectCommand("Invalid Item Index", -// "try to input an integer number between 1 and " + PackingList.getItemList().size()); -// } + String[] quantityAndDescription = getQuantityAndDescription(); + int itemQuantity = Integer.parseInt((quantityAndDescription[0]).trim()); + String itemDescription = quantityAndDescription[1].trim(); + return new AddCommand(itemQuantity, itemDescription); } /** @@ -230,7 +164,6 @@ public static Command createDeleteObj() { public static int[] getQuantityAndIndex() throws InvalidVariablesException, InvalidIndexException { int[] itemQuantityAndIndex = new int[2]; - // quantity is itemQuantityAndIndex[0], index is itemQuantityAndIndex[1] try { itemQuantityAndIndex[0] = Integer.parseInt(arguments[0].trim()); itemQuantityAndIndex[1] = Integer.parseInt(arguments[1].trim()); diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java index aeb5184821..158fc9ac10 100644 --- a/src/main/java/bagpacker/iohandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -17,6 +17,8 @@ public class Storage { public static ArrayList packingList = new ArrayList<>(); private static final String FILE_PATH = "packingList.txt"; + +// to be edited by @coregano // public static void load() throws FileNotFoundException { // Scanner reader = new Scanner(new File(FILE_PATH)); // String line; diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index 31963fd398..9088c6dd0f 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -5,7 +5,6 @@ import bagpacker.commands.DeleteCommand; import bagpacker.commands.ListCommand; import bagpacker.commands.PackCommand; -//import bagpacker.commands.UnpackCommand; /** * Ui class contains methods to print messages to user interface on Command Line Interface @@ -66,7 +65,6 @@ public static void helpMessage() { System.out.println("2. " + DeleteCommand.HELP_MSG); System.out.println("3. " + ListCommand.HELP_MSG); System.out.println("4. " + PackCommand.HELP_MSG); -// System.out.println("5. " + UnpackCommand.HELP_MSG); System.out.println("5. " + ByeCommand.HELP_MSG); printLine(); } diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index abf2c57093..636a05cd86 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -1,4 +1,5 @@ package bagpacker.packingfunc; + /** * Item class used to store information about item * Items to be packed can be saved in PackingList class @@ -7,31 +8,17 @@ public class Item { private String itemName; private int packedQuantity; private int totalQuantity; - private String packIcon = " "; + public Item(int quantity, String description) { this.itemName = description; packedQuantity = 0; totalQuantity = quantity; } -// public Item(String description, boolean isPacked) { -// this.itemName = description; -// this.isPacked = isPacked; -// } -// public void setPackIcon() { -// if (this.isPacked) { -// this.packIcon = "X"; -// } else { -// this.packIcon = " "; -// } -// } public String getItemName() { return itemName; } -// public boolean getIsPacked() { -// return isPacked; -// } public void setPacked(int quantity) { this.packedQuantity += quantity; } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index 12e5a58a54..29b3145e08 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -7,10 +7,8 @@ */ public class PackingList { - private static ArrayList itemList = new ArrayList<>(); - private static int targetIndex = -1; public static void setItemList(ArrayList itemList) { PackingList.itemList = itemList; } @@ -23,6 +21,7 @@ public static void setItemList(ArrayList itemList) { public static ArrayList getItemList() { return itemList; } + /** * Adds an item to the list. */ @@ -58,9 +57,8 @@ public static Item get(int targetIndex) { /** * Returns size of packing list */ - public int size(){ + public int size() { return itemList.size(); } - } From ad8e7dc2192393f9da45043ed5ab16248e39497f Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Thu, 23 Mar 2023 20:01:17 +0800 Subject: [PATCH 051/207] Edit code to pass checkstyle tests --- .../java/bagpacker/commands/PackCommand.java | 3 +- src/main/java/bagpacker/iohandler/Parser.java | 52 +++++++++---------- .../java/bagpacker/iohandler/Storage.java | 27 +++++----- .../packingfunctest/CommandsTest.java | 4 +- 4 files changed, 42 insertions(+), 44 deletions(-) diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index d0db619c95..5c8f69b6b6 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -5,12 +5,13 @@ import bagpacker.packingfunc.PackingList; public class PackCommand extends Command { - private static int packQuantity; + public static final String MSG_SUCCESS_PACK = "Item packed: %s"; public static final String HELP_MSG = "pack : Marks an item as packed in the packing list.\n" + "\tExample: pack 2 of 3\n" + "\tMeaning: packs 2 quantities of the third item in the packing list"; + private static int packQuantity; public PackCommand(int quantity, int targetIndex) { super(targetIndex); diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 31f001085d..44f838d050 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -41,29 +41,29 @@ public static Command parse() { setFullInput(inputLine); String[] inputStringList = inputLine.trim().split(" ", 2); switch (inputStringList[0]) { - case "add": - arguments = inputStringList[1].trim().split("/of"); - return createAddObj(); - case "delete": - arguments[0] = inputStringList[1].trim(); - return createDeleteObj(); - case "pack": - arguments = inputStringList[1].trim().split("/of"); - return createPackObj(); - case "unpack": - arguments = inputStringList[1].trim().split("/of"); - return createUnpackObj(); - case "list": - return listCommand(); - case "help": - return createHelpObj(); - case "deletelist": - return createDeletelistObj(); - case "bye": - return createByeObj(); - default: - return new IncorrectCommand("'" + inputStringList[0] + "' is an invalid User Command", - "input 'help' to receive all valid commands"); + case "add": + arguments = inputStringList[1].trim().split("/of"); + return createAddObj(); + case "delete": + arguments[0] = inputStringList[1].trim(); + return createDeleteObj(); + case "pack": + arguments = inputStringList[1].trim().split("/of"); + return createPackObj(); + case "unpack": + arguments = inputStringList[1].trim().split("/of"); + return createUnpackObj(); + case "list": + return listCommand(); + case "help": + return createHelpObj(); + case "deletelist": + return createDeletelistObj(); + case "bye": + return createByeObj(); + default: + return new IncorrectCommand("'" + inputStringList[0] + "' is an invalid User Command", + "input 'help' to receive all valid commands"); } } @@ -145,7 +145,7 @@ public static Command createAddObj() { * Attempts to create DeleteCommand object to be executed where it is called from * * @return DeleteCommand the command to be executed to delete an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createDeleteObj() { try { @@ -179,7 +179,7 @@ public static int[] getQuantityAndIndex() throws InvalidVariablesException, Inva * Attempts to create PackCommand object to be executed where it is called from * * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createPackObj() { try { @@ -206,7 +206,7 @@ public static Command createPackObj() { * Attempts to create UnpackCommand object to be executed where it is called from * * @return UnpackCommand the command to be executed to unpack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createUnpackObj() { try { diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java index 158fc9ac10..5af85eb755 100644 --- a/src/main/java/bagpacker/iohandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -3,12 +3,9 @@ import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; -import java.io.File; -import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; -import java.util.Scanner; /** * Storage class contains methods to save and retrieve saved packing list in txt file @@ -18,18 +15,18 @@ public class Storage { public static ArrayList packingList = new ArrayList<>(); private static final String FILE_PATH = "packingList.txt"; -// to be edited by @coregano -// public static void load() throws FileNotFoundException { -// Scanner reader = new Scanner(new File(FILE_PATH)); -// String line; -// while (reader.hasNext()) { -// line = reader.nextLine(); -// boolean isPacked = line.charAt(1) == 'X'; -// String itemDesc = line.substring(4); -// Item item = new Item(itemDesc, isPacked); -// PackingList.getItemList().add(item); -// } -// } + // to be edited by @coregano + // public static void load() throws FileNotFoundException { + // Scanner reader = new Scanner(new File(FILE_PATH)); + // String line; + // while (reader.hasNext()) { + // line = reader.nextLine(); + // boolean isPacked = line.charAt(1) == 'X'; + // String itemDesc = line.substring(4); + // Item item = new Item(itemDesc, isPacked); + // PackingList.getItemList().add(item); + // } + // } public static void save() { try { diff --git a/src/test/java/bagpacker/packingfunctest/CommandsTest.java b/src/test/java/bagpacker/packingfunctest/CommandsTest.java index ef25581a0b..a6c07db09a 100644 --- a/src/test/java/bagpacker/packingfunctest/CommandsTest.java +++ b/src/test/java/bagpacker/packingfunctest/CommandsTest.java @@ -2,7 +2,7 @@ import bagpacker.commands.AddCommand; import bagpacker.commands.Command; -import bagpacker.packingfunc.Item; +//import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -28,7 +28,7 @@ public void testAddCommand() { Assertions.assertNotEquals("tooth", packingList.get(0).getItemName()); // Expect second index item in the packing list to be toothpaste -// Item itemTwo = new Item("toothpaste"); + // Item itemTwo = new Item("toothpaste"); addCommand = new AddCommand(1, "toothpaste"); addCommand.execute(packingList); From bf78ab7e7c2bd9668a1efd6723faa2ddc152e39d Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 23 Mar 2023 23:20:57 +0800 Subject: [PATCH 052/207] Add Junit test for ParserTest class --- htmlReport/css/coverage.css | 154 ++ htmlReport/css/idea.min.css | 118 ++ htmlReport/img/arrowDown.gif | Bin 0 -> 89 bytes htmlReport/img/arrowUp.gif | Bin 0 -> 91 bytes htmlReport/index.html | 249 +++ htmlReport/index_SORT_BY_BLOCK.html | 249 +++ htmlReport/index_SORT_BY_BLOCK_DESC.html | 249 +++ htmlReport/index_SORT_BY_CLASS.html | 249 +++ htmlReport/index_SORT_BY_CLASS_DESC.html | 249 +++ htmlReport/index_SORT_BY_LINE.html | 249 +++ htmlReport/index_SORT_BY_LINE_DESC.html | 249 +++ htmlReport/index_SORT_BY_METHOD.html | 249 +++ htmlReport/index_SORT_BY_METHOD_DESC.html | 249 +++ htmlReport/index_SORT_BY_NAME_DESC.html | 249 +++ htmlReport/js/highlight.min.js | 1388 +++++++++++++++++ htmlReport/js/highlightjs-line-numbers.min.js | 24 + htmlReport/ns-1/index.html | 142 ++ htmlReport/ns-1/index_SORT_BY_BLOCK.html | 142 ++ htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html | 142 ++ htmlReport/ns-1/index_SORT_BY_CLASS.html | 142 ++ htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html | 142 ++ htmlReport/ns-1/index_SORT_BY_LINE.html | 142 ++ htmlReport/ns-1/index_SORT_BY_LINE_DESC.html | 142 ++ htmlReport/ns-1/index_SORT_BY_METHOD.html | 142 ++ .../ns-1/index_SORT_BY_METHOD_DESC.html | 142 ++ htmlReport/ns-1/index_SORT_BY_NAME_DESC.html | 142 ++ htmlReport/ns-1/sources/source-1.html | 136 ++ htmlReport/ns-2/index.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_BLOCK.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_CLASS.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_LINE.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_LINE_DESC.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_METHOD.html | 385 +++++ .../ns-2/index_SORT_BY_METHOD_DESC.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_NAME_DESC.html | 385 +++++ htmlReport/ns-2/sources/source-1.html | 127 ++ htmlReport/ns-2/sources/source-2.html | 118 ++ htmlReport/ns-2/sources/source-3.html | 152 ++ htmlReport/ns-2/sources/source-4.html | 130 ++ htmlReport/ns-2/sources/source-5.html | 123 ++ htmlReport/ns-2/sources/source-6.html | 114 ++ htmlReport/ns-2/sources/source-7.html | 121 ++ htmlReport/ns-2/sources/source-8.html | 136 ++ htmlReport/ns-2/sources/source-9.html | 132 ++ htmlReport/ns-2/sources/source-a.html | 132 ++ htmlReport/ns-3/index.html | 196 +++ htmlReport/ns-3/index_SORT_BY_BLOCK.html | 196 +++ htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html | 196 +++ htmlReport/ns-3/index_SORT_BY_CLASS.html | 196 +++ htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html | 196 +++ htmlReport/ns-3/index_SORT_BY_LINE.html | 196 +++ htmlReport/ns-3/index_SORT_BY_LINE_DESC.html | 196 +++ htmlReport/ns-3/index_SORT_BY_METHOD.html | 196 +++ .../ns-3/index_SORT_BY_METHOD_DESC.html | 196 +++ htmlReport/ns-3/index_SORT_BY_NAME_DESC.html | 196 +++ htmlReport/ns-3/sources/source-1.html | 107 ++ htmlReport/ns-3/sources/source-2.html | 109 ++ htmlReport/ns-3/sources/source-3.html | 109 ++ htmlReport/ns-4/index.html | 196 +++ htmlReport/ns-4/index_SORT_BY_BLOCK.html | 196 +++ htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html | 196 +++ htmlReport/ns-4/index_SORT_BY_CLASS.html | 196 +++ htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html | 196 +++ htmlReport/ns-4/index_SORT_BY_LINE.html | 196 +++ htmlReport/ns-4/index_SORT_BY_LINE_DESC.html | 196 +++ htmlReport/ns-4/index_SORT_BY_METHOD.html | 196 +++ .../ns-4/index_SORT_BY_METHOD_DESC.html | 196 +++ htmlReport/ns-4/index_SORT_BY_NAME_DESC.html | 196 +++ htmlReport/ns-4/sources/source-1.html | 405 +++++ htmlReport/ns-4/sources/source-2.html | 150 ++ htmlReport/ns-4/sources/source-3.html | 188 +++ htmlReport/ns-5/index.html | 169 ++ htmlReport/ns-5/index_SORT_BY_BLOCK.html | 169 ++ htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html | 169 ++ htmlReport/ns-5/index_SORT_BY_CLASS.html | 169 ++ htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html | 169 ++ htmlReport/ns-5/index_SORT_BY_LINE.html | 169 ++ htmlReport/ns-5/index_SORT_BY_LINE_DESC.html | 169 ++ htmlReport/ns-5/index_SORT_BY_METHOD.html | 169 ++ .../ns-5/index_SORT_BY_METHOD_DESC.html | 169 ++ htmlReport/ns-5/index_SORT_BY_NAME_DESC.html | 169 ++ htmlReport/ns-5/sources/source-1.html | 144 ++ htmlReport/ns-5/sources/source-2.html | 169 ++ src/main/java/bagpacker/iohandler/Parser.java | 26 +- .../bagpacker/iohandlertest/ParserTest.java | 146 +- .../packingfunctest/CommandsTest.java | 14 +- 88 files changed, 18019 insertions(+), 23 deletions(-) create mode 100644 htmlReport/css/coverage.css create mode 100644 htmlReport/css/idea.min.css create mode 100644 htmlReport/img/arrowDown.gif create mode 100644 htmlReport/img/arrowUp.gif create mode 100644 htmlReport/index.html create mode 100644 htmlReport/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/index_SORT_BY_CLASS.html create mode 100644 htmlReport/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/index_SORT_BY_LINE.html create mode 100644 htmlReport/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/index_SORT_BY_METHOD.html create mode 100644 htmlReport/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/js/highlight.min.js create mode 100644 htmlReport/js/highlightjs-line-numbers.min.js create mode 100644 htmlReport/ns-1/index.html create mode 100644 htmlReport/ns-1/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-1/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-1/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-1/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-1/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-1/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-1/sources/source-1.html create mode 100644 htmlReport/ns-2/index.html create mode 100644 htmlReport/ns-2/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-2/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-2/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-2/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-2/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-2/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-2/sources/source-1.html create mode 100644 htmlReport/ns-2/sources/source-2.html create mode 100644 htmlReport/ns-2/sources/source-3.html create mode 100644 htmlReport/ns-2/sources/source-4.html create mode 100644 htmlReport/ns-2/sources/source-5.html create mode 100644 htmlReport/ns-2/sources/source-6.html create mode 100644 htmlReport/ns-2/sources/source-7.html create mode 100644 htmlReport/ns-2/sources/source-8.html create mode 100644 htmlReport/ns-2/sources/source-9.html create mode 100644 htmlReport/ns-2/sources/source-a.html create mode 100644 htmlReport/ns-3/index.html create mode 100644 htmlReport/ns-3/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-3/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-3/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-3/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-3/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-3/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-3/sources/source-1.html create mode 100644 htmlReport/ns-3/sources/source-2.html create mode 100644 htmlReport/ns-3/sources/source-3.html create mode 100644 htmlReport/ns-4/index.html create mode 100644 htmlReport/ns-4/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-4/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-4/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-4/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-4/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-4/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-4/sources/source-1.html create mode 100644 htmlReport/ns-4/sources/source-2.html create mode 100644 htmlReport/ns-4/sources/source-3.html create mode 100644 htmlReport/ns-5/index.html create mode 100644 htmlReport/ns-5/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-5/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-5/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-5/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-5/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-5/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-5/sources/source-1.html create mode 100644 htmlReport/ns-5/sources/source-2.html diff --git a/htmlReport/css/coverage.css b/htmlReport/css/coverage.css new file mode 100644 index 0000000000..cef776517f --- /dev/null +++ b/htmlReport/css/coverage.css @@ -0,0 +1,154 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +* { + margin: 0; + padding: 0; +} + +body { + background-color: #fff; + font-family: helvetica neue, tahoma, arial, sans-serif; + font-size: 82%; + color: #151515; +} + +h1 { + margin: 0.5em 0; + color: #010101; + font-weight: normal; + font-size: 18px; +} + +h2 { + margin: 0.5em 0; + color: #010101; + font-weight: normal; + font-size: 16px; +} + +a { + color: #1564C2; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +span.separator { + color: #9BA9BA; + padding-left: 5px; + padding-right: 5px; +} + +div.content { + width: 99%; +} + +table.coverageStats { + width: 100%; + border-collapse: collapse; +} + +table.overallStats { + width: 20%; +} + +table.coverageStats td, table.coverageStats th { + padding: 4px 2px; + border-bottom: 1px solid #ccc; +} + +table.coverageStats th { + background-color: #959BA4; + border: none; + font-weight: bold; + text-align: left; + color: #FFF; +} + +table.coverageStats th.coverageStat { + width: 15%; +} + +table.coverageStats th a { + color: #FFF; +} + +table.coverageStats th a:hover { + text-decoration: none; +} + +table.coverageStats th.sortedDesc a { + background: url(../img/arrowDown.gif) no-repeat 100% 2px; + padding-right: 20px; +} + +table.coverageStats th.sortedAsc a { + background: url(../img/arrowUp.gif) no-repeat 100% 2px; + padding-right: 20px; +} + +div.footer { + margin: 2em .5em; + font-size: 85%; + text-align: left; + line-height: 140%; +} + +code.sourceCode { + width: 100%; + border: 1px solid #ccc; + font: normal 12px 'Menlo', 'Bitstream Vera Sans Mono', 'Courier New', 'Courier', monospace; + white-space: pre; +} + +code.sourceCode b { + font-weight: normal; +} + +code.sourceCode span.number { + color: #151515; +} + +code.sourceCode .fc { + background-color: #cfc; +} + +code.sourceCode .pc { + background-color: #ffc; +} + +code.sourceCode .nc { + background-color: #fcc; +} + +.percent, .absValue { + font-size: 90%; +} + +.percent .green, .absValue .green { + color: #32cc32; +} + +.percent .red, .absValue .red { + color: #f00; +} + +.percent .totalDiff { + color: #3f3f3f; +} diff --git a/htmlReport/css/idea.min.css b/htmlReport/css/idea.min.css new file mode 100644 index 0000000000..a8d5292bd5 --- /dev/null +++ b/htmlReport/css/idea.min.css @@ -0,0 +1,118 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* +Intellij Idea-like styling (c) Vasily Polovnyov +*/ + +.hljs { + color: #000; + background: #fff; +} + +.hljs-subst, +.hljs-title { + font-weight: normal; + color: #000; +} + +.hljs-comment, +.hljs-quote { + color: #808080; + font-style: italic; +} + +.hljs-meta { + color: #808000; +} + +.hljs-tag { + background: #efefef; +} + +.hljs-section, +.hljs-name, +.hljs-literal, +.hljs-keyword, +.hljs-selector-tag, +.hljs-type, +.hljs-selector-id, +.hljs-selector-class { + font-weight: bold; + color: #000080; +} + +.hljs-attribute, +.hljs-number, +.hljs-regexp, +.hljs-link { + font-weight: bold; + color: #0000ff; +} + +.hljs-number, +.hljs-regexp, +.hljs-link { + font-weight: normal; +} + +.hljs-string { + color: #008000; + font-weight: bold; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-formula { + color: #000; + background: #d0eded; + font-style: italic; +} + +.hljs-doctag { + text-decoration: underline; +} + +.hljs-variable, +.hljs-template-variable { + color: #660e7a; +} + +.hljs-addition { + background: #baeeba; +} + +.hljs-deletion { + background: #ffc8bd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-ln-numbers { + display: block; + float: left; + width: 3em; + border-right: 1px solid #ccc; + font-style: normal; + text-align: right; + background-color: #eee; +} diff --git a/htmlReport/img/arrowDown.gif b/htmlReport/img/arrowDown.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4ac9b4b0f5eee9fc82deb7f03d0cc7f197b01c7 GIT binary patch literal 89 zcmZ?wbhEHbv%yJ&P?))?G g5?!@7agD+*@rGjs@joUks8}}Ha%HfNHz$KN0Orjd82|tP literal 0 HcmV?d00001 diff --git a/htmlReport/img/arrowUp.gif b/htmlReport/img/arrowUp.gif new file mode 100644 index 0000000000000000000000000000000000000000..d488db0089f15409b83a6f39718384cac89ea3c9 GIT binary patch literal 91 zcmZ?wbhEHbv%nBa6?))=2 j#jeJ<$W6!S$=vG=3s*2Wu3C5I!M+a(XH6zEFjxZs9OxeQ literal 0 HcmV?d00001 diff --git a/htmlReport/index.html b/htmlReport/index.html new file mode 100644 index 0000000000..2014cca5f8 --- /dev/null +++ b/htmlReport/index.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_BLOCK.html b/htmlReport/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..cd848940d4 --- /dev/null +++ b/htmlReport/index_SORT_BY_BLOCK.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_BLOCK_DESC.html b/htmlReport/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..0306ddac53 --- /dev/null +++ b/htmlReport/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_CLASS.html b/htmlReport/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..9289b15a33 --- /dev/null +++ b/htmlReport/index_SORT_BY_CLASS.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_CLASS_DESC.html b/htmlReport/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..db988e6dbd --- /dev/null +++ b/htmlReport/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_LINE.html b/htmlReport/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..a5149f7a02 --- /dev/null +++ b/htmlReport/index_SORT_BY_LINE.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_LINE_DESC.html b/htmlReport/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..a087b56950 --- /dev/null +++ b/htmlReport/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_METHOD.html b/htmlReport/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..83260463c5 --- /dev/null +++ b/htmlReport/index_SORT_BY_METHOD.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_METHOD_DESC.html b/htmlReport/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..1831b33bc1 --- /dev/null +++ b/htmlReport/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_NAME_DESC.html b/htmlReport/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..e7e8077a52 --- /dev/null +++ b/htmlReport/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+
+ + + + + + + diff --git a/htmlReport/js/highlight.min.js b/htmlReport/js/highlight.min.js new file mode 100644 index 0000000000..e88731520e --- /dev/null +++ b/htmlReport/js/highlight.min.js @@ -0,0 +1,1388 @@ +/* + Highlight.js 10.7.2 (00233d63) + License: BSD-3-Clause + Copyright (c) 2006-2021, Ivan Sagalaev + + BSD 3-Clause License + + Copyright (c) 2006-2021, Ivan Sagalaev. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +var hljs=function(){"use strict";function e(t){ +return t instanceof Map?t.clear=t.delete=t.set=()=>{ +throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{var i=t[n] +;"object"!=typeof i||Object.isFrozen(i)||e(i)})),t}var t=e,n=e;t.default=n +;class i{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function s(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function a(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] +;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const r=e=>!!e.kind +;class l{constructor(e,t){ +this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ +this.buffer+=s(e)}openNode(e){if(!r(e))return;let t=e.kind +;e.sublanguage||(t=`${this.classPrefix}${t}`),this.span(t)}closeNode(e){ +r(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}class o{constructor(){this.rootNode={ +children:[]},this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const t={kind:e,children:[]} +;this.add(t),this.stack.push(t)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ +return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), +t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +o._collapse(e)})))}}class c extends o{constructor(e){super(),this.options=e} +addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} +addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root +;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){ +return new l(this,this.options).value()}finalize(){return!0}}function g(e){ +return e?"string"==typeof e?e:e.source:null} +const u=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,h="[a-zA-Z]\\w*",d="[a-zA-Z_]\\w*",f="\\b\\d+(\\.\\d+)?",p="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",m="\\b(0b[01]+)",b={ +begin:"\\\\[\\s\\S]",relevance:0},E={className:"string",begin:"'",end:"'", +illegal:"\\n",contains:[b]},x={className:"string",begin:'"',end:'"', +illegal:"\\n",contains:[b]},v={ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},w=(e,t,n={})=>{const i=a({className:"comment",begin:e,end:t,contains:[]},n) +;return i.contains.push(v),i.contains.push({className:"doctag", +begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),i +},y=w("//","$"),N=w("/\\*","\\*/"),R=w("#","$");var _=Object.freeze({ +__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:h,UNDERSCORE_IDENT_RE:d, +NUMBER_RE:f,C_NUMBER_RE:p,BINARY_NUMBER_RE:m, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const t=/^#![ ]*\// +;return e.binary&&(e.begin=((...e)=>e.map((e=>g(e))).join(""))(t,/.*\b/,e.binary,/\b.*/)), +a({className:"meta",begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{ +0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:b,APOS_STRING_MODE:E, +QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:v,COMMENT:w,C_LINE_COMMENT_MODE:y, +C_BLOCK_COMMENT_MODE:N,HASH_COMMENT_MODE:R,NUMBER_MODE:{className:"number", +begin:f,relevance:0},C_NUMBER_MODE:{className:"number",begin:p,relevance:0}, +BINARY_NUMBER_MODE:{className:"number",begin:m,relevance:0},CSS_NUMBER_MODE:{ +className:"number", +begin:f+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", +relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp", +begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[b,{begin:/\[/,end:/\]/, +relevance:0,contains:[b]}]}]},TITLE_MODE:{className:"title",begin:h,relevance:0 +},UNDERSCORE_TITLE_MODE:{className:"title",begin:d,relevance:0},METHOD_GUARD:{ +begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ +t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function k(e,t){ +"."===e.input[e.index-1]&&t.ignoreMatch()}function M(e,t){ +t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=k,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function O(e,t){ +Array.isArray(e.illegal)&&(e.illegal=((...e)=>"("+e.map((e=>g(e))).join("|")+")")(...e.illegal)) +}function A(e,t){if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function L(e,t){ +void 0===e.relevance&&(e.relevance=1)} +const I=["of","and","for","in","not","or","if","then","parent","list","value"] +;function j(e,t,n="keyword"){const i={} +;return"string"==typeof e?s(n,e.split(" ")):Array.isArray(e)?s(n,e):Object.keys(e).forEach((n=>{ +Object.assign(i,j(e[n],t,n))})),i;function s(e,n){ +t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") +;i[n[0]]=[e,B(n[0],n[1])]}))}}function B(e,t){ +return t?Number(t):(e=>I.includes(e.toLowerCase()))(e)?0:1} +function T(e,{plugins:t}){function n(t,n){ +return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(n?"g":""))}class i{ +constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,t){ +t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), +this.matchAt+=(e=>RegExp(e.toString()+"|").exec("").length-1)(e)+1}compile(){ +0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(((e,t="|")=>{let n=0 +;return e.map((e=>{n+=1;const t=n;let i=g(e),s="";for(;i.length>0;){ +const e=u.exec(i);if(!e){s+=i;break} +s+=i.substring(0,e.index),i=i.substring(e.index+e[0].length), +"\\"===e[0][0]&&e[1]?s+="\\"+(Number(e[1])+t):(s+=e[0],"("===e[0]&&n++)}return s +})).map((e=>`(${e})`)).join(t)})(e),!0),this.lastIndex=0}exec(e){ +this.matcherRe.lastIndex=this.lastIndex;const t=this.matcherRe.exec(e) +;if(!t)return null +;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] +;return t.splice(0,n),Object.assign(t,i)}}class s{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const t=new i +;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), +t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ +this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ +const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex +;let n=t.exec(e) +;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ +const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} +return n&&(this.regexIndex+=n.position+1, +this.regexIndex===this.count&&this.considerAll()),n}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=a(e.classNameAliases||{}),function t(i,r){const l=i +;if(i.isCompiled)return l +;[A].forEach((e=>e(i,r))),e.compilerExtensions.forEach((e=>e(i,r))), +i.__beforeBegin=null,[M,O,L].forEach((e=>e(i,r))),i.isCompiled=!0;let o=null +;if("object"==typeof i.keywords&&(o=i.keywords.$pattern, +delete i.keywords.$pattern), +i.keywords&&(i.keywords=j(i.keywords,e.case_insensitive)), +i.lexemes&&o)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ") +;return o=o||i.lexemes||/\w+/, +l.keywordPatternRe=n(o,!0),r&&(i.begin||(i.begin=/\B|\b/), +l.beginRe=n(i.begin),i.endSameAsBegin&&(i.end=i.begin), +i.end||i.endsWithParent||(i.end=/\B|\b/), +i.end&&(l.endRe=n(i.end)),l.terminatorEnd=g(i.end)||"", +i.endsWithParent&&r.terminatorEnd&&(l.terminatorEnd+=(i.end?"|":"")+r.terminatorEnd)), +i.illegal&&(l.illegalRe=n(i.illegal)), +i.contains||(i.contains=[]),i.contains=[].concat(...i.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>a(e,{ +variants:null},t)))),e.cachedVariants?e.cachedVariants:S(e)?a(e,{ +starts:e.starts?a(e.starts):null +}):Object.isFrozen(e)?a(e):e))("self"===e?i:e)))),i.contains.forEach((e=>{t(e,l) +})),i.starts&&t(i.starts,r),l.matcher=(e=>{const t=new s +;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(l),l}(e)}function S(e){ +return!!e&&(e.endsWithParent||S(e.starts))}function P(e){const t={ +props:["language","code","autodetect"],data:()=>({detectedLanguage:"", +unknownLanguage:!1}),computed:{className(){ +return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){ +if(!this.autoDetect&&!e.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`), +this.unknownLanguage=!0,s(this.code);let t={} +;return this.autoDetect?(t=e.highlightAuto(this.code), +this.detectedLanguage=t.language):(t=e.highlight(this.language,this.code,this.ignoreIllegals), +this.detectedLanguage=this.language),t.value},autoDetect(){ +return!(this.language&&(e=this.autodetect,!e&&""!==e));var e}, +ignoreIllegals:()=>!0},render(e){return e("pre",{},[e("code",{ +class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{ +Component:t,VuePlugin:{install(e){e.component("highlightjs",t)}}}}const D={ +"after:highlightElement":({el:e,result:t,text:n})=>{const i=H(e) +;if(!i.length)return;const a=document.createElement("div") +;a.innerHTML=t.value,t.value=((e,t,n)=>{let i=0,a="";const r=[];function l(){ +return e.length&&t.length?e[0].offset!==t[0].offset?e[0].offset"}function c(e){ +a+=""}function g(e){("start"===e.event?o:c)(e.node)} +for(;e.length||t.length;){let t=l() +;if(a+=s(n.substring(i,t[0].offset)),i=t[0].offset,t===e){r.reverse().forEach(c) +;do{g(t.splice(0,1)[0]),t=l()}while(t===e&&t.length&&t[0].offset===i) +;r.reverse().forEach(o) +}else"start"===t[0].event?r.push(t[0].node):r.pop(),g(t.splice(0,1)[0])} +return a+s(n.substr(i))})(i,H(a),n)}};function C(e){ +return e.nodeName.toLowerCase()}function H(e){const t=[];return function e(n,i){ +for(let s=n.firstChild;s;s=s.nextSibling)3===s.nodeType?i+=s.nodeValue.length:1===s.nodeType&&(t.push({ +event:"start",offset:i,node:s}),i=e(s,i),C(s).match(/br|hr|img|input/)||t.push({ +event:"stop",offset:i,node:s}));return i}(e,0),t}const $={},U=e=>{ +console.error(e)},z=(e,...t)=>{console.log("WARN: "+e,...t)},K=(e,t)=>{ +$[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),$[`${e}/${t}`]=!0) +},G=s,V=a,W=Symbol("nomatch");return(e=>{ +const n=Object.create(null),s=Object.create(null),a=[];let r=!0 +;const l=/(^(<[^>]+>|\t|)+|\n)/gm,o="Could not find the language '{}', did you forget to load/include a language module?",g={ +disableAutodetect:!0,name:"Plain text",contains:[]};let u={ +noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +tabReplace:null,useBR:!1,languages:null,__emitter:c};function h(e){ +return u.noHighlightRe.test(e)}function d(e,t,n,i){let s="",a="" +;"object"==typeof t?(s=e, +n=t.ignoreIllegals,a=t.language,i=void 0):(K("10.7.0","highlight(lang, code, ...args) has been deprecated."), +K("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +a=e,s=t);const r={code:s,language:a};M("before:highlight",r) +;const l=r.result?r.result:f(r.language,r.code,n,i) +;return l.code=r.code,M("after:highlight",l),l}function f(e,t,s,l){ +function c(e,t){const n=v.case_insensitive?t[0].toLowerCase():t[0] +;return Object.prototype.hasOwnProperty.call(e.keywords,n)&&e.keywords[n]} +function g(){null!=R.subLanguage?(()=>{if(""===M)return;let e=null +;if("string"==typeof R.subLanguage){ +if(!n[R.subLanguage])return void k.addText(M) +;e=f(R.subLanguage,M,!0,_[R.subLanguage]),_[R.subLanguage]=e.top +}else e=p(M,R.subLanguage.length?R.subLanguage:null) +;R.relevance>0&&(O+=e.relevance),k.addSublanguage(e.emitter,e.language) +})():(()=>{if(!R.keywords)return void k.addText(M);let e=0 +;R.keywordPatternRe.lastIndex=0;let t=R.keywordPatternRe.exec(M),n="";for(;t;){ +n+=M.substring(e,t.index);const i=c(R,t);if(i){const[e,s]=i +;if(k.addText(n),n="",O+=s,e.startsWith("_"))n+=t[0];else{ +const n=v.classNameAliases[e]||e;k.addKeyword(t[0],n)}}else n+=t[0] +;e=R.keywordPatternRe.lastIndex,t=R.keywordPatternRe.exec(M)} +n+=M.substr(e),k.addText(n)})(),M=""}function h(e){ +return e.className&&k.openNode(v.classNameAliases[e.className]||e.className), +R=Object.create(e,{parent:{value:R}}),R}function d(e,t,n){let s=((e,t)=>{ +const n=e&&e.exec(t);return n&&0===n.index})(e.endRe,n);if(s){if(e["on:end"]){ +const n=new i(e);e["on:end"](t,n),n.isMatchIgnored&&(s=!1)}if(s){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return d(e.parent,t,n)}function m(e){ +return 0===R.matcher.regexIndex?(M+=e[0],1):(I=!0,0)}function b(e){ +const n=e[0],i=t.substr(e.index),s=d(R,e,i);if(!s)return W;const a=R +;a.skip?M+=n:(a.returnEnd||a.excludeEnd||(M+=n),g(),a.excludeEnd&&(M=n));do{ +R.className&&k.closeNode(),R.skip||R.subLanguage||(O+=R.relevance),R=R.parent +}while(R!==s.parent) +;return s.starts&&(s.endSameAsBegin&&(s.starts.endRe=s.endRe), +h(s.starts)),a.returnEnd?0:n.length}let E={};function x(n,a){const l=a&&a[0] +;if(M+=n,null==l)return g(),0 +;if("begin"===E.type&&"end"===a.type&&E.index===a.index&&""===l){ +if(M+=t.slice(a.index,a.index+1),!r){const t=Error("0 width match regex") +;throw t.languageName=e,t.badRule=E.rule,t}return 1} +if(E=a,"begin"===a.type)return function(e){ +const t=e[0],n=e.rule,s=new i(n),a=[n.__beforeBegin,n["on:begin"]] +;for(const n of a)if(n&&(n(e,s),s.isMatchIgnored))return m(t) +;return n&&n.endSameAsBegin&&(n.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")), +n.skip?M+=t:(n.excludeBegin&&(M+=t), +g(),n.returnBegin||n.excludeBegin||(M=t)),h(n),n.returnBegin?0:t.length}(a) +;if("illegal"===a.type&&!s){ +const e=Error('Illegal lexeme "'+l+'" for mode "'+(R.className||"")+'"') +;throw e.mode=R,e}if("end"===a.type){const e=b(a);if(e!==W)return e} +if("illegal"===a.type&&""===l)return 1 +;if(L>1e5&&L>3*a.index)throw Error("potential infinite loop, way more iterations than matches") +;return M+=l,l.length}const v=N(e) +;if(!v)throw U(o.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const w=T(v,{plugins:a});let y="",R=l||w;const _={},k=new u.__emitter(u);(()=>{ +const e=[];for(let t=R;t!==v;t=t.parent)t.className&&e.unshift(t.className) +;e.forEach((e=>k.openNode(e)))})();let M="",O=0,A=0,L=0,I=!1;try{ +for(R.matcher.considerAll();;){ +L++,I?I=!1:R.matcher.considerAll(),R.matcher.lastIndex=A +;const e=R.matcher.exec(t);if(!e)break;const n=x(t.substring(A,e.index),e) +;A=e.index+n}return x(t.substr(A)),k.closeAllNodes(),k.finalize(),y=k.toHTML(),{ +relevance:Math.floor(O),value:y,language:e,illegal:!1,emitter:k,top:R}}catch(n){ +if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{ +msg:n.message,context:t.slice(A-100,A+100),mode:n.mode},sofar:y,relevance:0, +value:G(t),emitter:k};if(r)return{illegal:!1,relevance:0,value:G(t),emitter:k, +language:e,top:R,errorRaised:n};throw n}}function p(e,t){ +t=t||u.languages||Object.keys(n);const i=(e=>{const t={relevance:0, +emitter:new u.__emitter(u),value:G(e),illegal:!1,top:g} +;return t.emitter.addText(e),t})(e),s=t.filter(N).filter(k).map((t=>f(t,e,!1))) +;s.unshift(i);const a=s.sort(((e,t)=>{ +if(e.relevance!==t.relevance)return t.relevance-e.relevance +;if(e.language&&t.language){if(N(e.language).supersetOf===t.language)return 1 +;if(N(t.language).supersetOf===e.language)return-1}return 0})),[r,l]=a,o=r +;return o.second_best=l,o}const m={"before:highlightElement":({el:e})=>{ +u.useBR&&(e.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")) +},"after:highlightElement":({result:e})=>{ +u.useBR&&(e.value=e.value.replace(/\n/g,"
"))}},b=/^(<[^>]+>|\t)+/gm,E={ +"after:highlightElement":({result:e})=>{ +u.tabReplace&&(e.value=e.value.replace(b,(e=>e.replace(/\t/g,u.tabReplace))))}} +;function x(e){let t=null;const n=(e=>{let t=e.className+" " +;t+=e.parentNode?e.parentNode.className:"";const n=u.languageDetectRe.exec(t) +;if(n){const t=N(n[1]) +;return t||(z(o.replace("{}",n[1])),z("Falling back to no-highlight mode for this block.",e)), +t?n[1]:"no-highlight"}return t.split(/\s+/).find((e=>h(e)||N(e)))})(e) +;if(h(n))return;M("before:highlightElement",{el:e,language:n}),t=e +;const i=t.textContent,a=n?d(i,{language:n,ignoreIllegals:!0}):p(i) +;M("after:highlightElement",{el:e,result:a,text:i +}),e.innerHTML=a.value,((e,t,n)=>{const i=t?s[t]:n +;e.classList.add("hljs"),i&&e.classList.add(i)})(e,n,a.language),e.result={ +language:a.language,re:a.relevance,relavance:a.relevance +},a.second_best&&(e.second_best={language:a.second_best.language, +re:a.second_best.relevance,relavance:a.second_best.relevance})}const v=()=>{ +v.called||(v.called=!0, +K("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead."), +document.querySelectorAll("pre code").forEach(x))};let w=!1;function y(){ +"loading"!==document.readyState?document.querySelectorAll("pre code").forEach(x):w=!0 +}function N(e){return e=(e||"").toLowerCase(),n[e]||n[s[e]]} +function R(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +s[e.toLowerCase()]=t}))}function k(e){const t=N(e) +;return t&&!t.disableAutodetect}function M(e,t){const n=e;a.forEach((e=>{ +e[n]&&e[n](t)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +w&&y()}),!1),Object.assign(e,{highlight:d,highlightAuto:p,highlightAll:y, +fixMarkup:e=>{ +return K("10.2.0","fixMarkup will be removed entirely in v11.0"),K("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"), +t=e, +u.tabReplace||u.useBR?t.replace(l,(e=>"\n"===e?u.useBR?"
":e:u.tabReplace?e.replace(/\t/g,u.tabReplace):e)):t +;var t},highlightElement:x, +highlightBlock:e=>(K("10.7.0","highlightBlock will be removed entirely in v12.0"), +K("10.7.0","Please use highlightElement now."),x(e)),configure:e=>{ +e.useBR&&(K("10.3.0","'useBR' will be removed entirely in v11.0"), +K("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")), +u=V(u,e)},initHighlighting:v,initHighlightingOnLoad:()=>{ +K("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."), +w=!0},registerLanguage:(t,i)=>{let s=null;try{s=i(e)}catch(e){ +if(U("Language definition for '{}' could not be registered.".replace("{}",t)), +!r)throw e;U(e),s=g} +s.name||(s.name=t),n[t]=s,s.rawDefinition=i.bind(null,e),s.aliases&&R(s.aliases,{ +languageName:t})},unregisterLanguage:e=>{delete n[e] +;for(const t of Object.keys(s))s[t]===e&&delete s[t]}, +listLanguages:()=>Object.keys(n),getLanguage:N,registerAliases:R, +requireLanguage:e=>{ +K("10.4.0","requireLanguage will be removed entirely in v11."), +K("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844") +;const t=N(e);if(t)return t +;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))}, +autoDetection:k,inherit:V,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ +e["before:highlightBlock"](Object.assign({block:t.el},t)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ +e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),a.push(e)}, +vuePlugin:P(e).VuePlugin}),e.debugMode=()=>{r=!1},e.safeMode=()=>{r=!0 +},e.versionString="10.7.2";for(const e in _)"object"==typeof _[e]&&t(_[e]) +;return Object.assign(e,_),e.addPlugin(m),e.addPlugin(D),e.addPlugin(E),e})({}) +}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); +hljs.registerLanguage("apache",(()=>{"use strict";return e=>{const n={ +className:"number",begin:/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?/} +;return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0, +contains:[e.HASH_COMMENT_MODE,{className:"section",begin:/<\/?/,end:/>/, +contains:[n,{className:"number",begin:/:\d{1,5}/ +},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute", +begin:/\w+/,relevance:0,keywords:{ +nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername" +},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"}, +contains:[{className:"meta",begin:/\s\[/,end:/\]$/},{className:"variable", +begin:/[\$%]\{/,end:/\}/,contains:["self",{className:"number",begin:/[$%]\d+/}] +},n,{className:"number",begin:/\d+/},e.QUOTE_STRING_MODE]}}],illegal:/\S/}} +})()); +hljs.registerLanguage("bash",(()=>{"use strict";function e(...e){ +return e.map((e=>{return(s=e)?"string"==typeof s?s:s.source:null;var s +})).join("")}return s=>{const n={},t={begin:/\$\{/,end:/\}/,contains:["self",{ +begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{ +begin:e(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},t]});const a={ +className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},i={ +begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/, +end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/, +contains:[s.BACKSLASH_ESCAPE,n,a]};a.contains.push(c);const o={begin:/\$\(\(/, +end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,n] +},r=s.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 +}),l={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, +contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ +name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/, +keyword:"if then else elif fi for while in do done case esac function", +literal:"true false", +built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp" +},contains:[r,s.SHEBANG(),l,o,s.HASH_COMMENT_MODE,i,c,{className:"",begin:/\\"/ +},{className:"string",begin:/'/,end:/'/},n]}}})()); +hljs.registerLanguage("c",(()=>{"use strict";function e(e){ +return((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(",e,")?") +}return t=>{const n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),r="[a-zA-Z_]\\w*::",a="(decltype\\(auto\\)|"+e(r)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",i={ +className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string", +variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", +contains:[t.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},t.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},t.inherit(s,{className:"meta-string"}),{ +className:"meta-string",begin:/<.*?>/},n,t.C_BLOCK_COMMENT_MODE]},l={ +className:"title",begin:e(r)+t.IDENT_RE,relevance:0 +},d=e(r)+t.IDENT_RE+"\\s*\\(",u={ +keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", +built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary", +literal:"true false nullptr NULL"},m=[c,i,n,t.C_BLOCK_COMMENT_MODE,o,s],p={ +variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ +beginKeywords:"new throw return else",end:/;/}],keywords:u,contains:m.concat([{ +begin:/\(/,end:/\)/,keywords:u,contains:m.concat(["self"]),relevance:0}]), +relevance:0},_={className:"function",begin:"("+a+"[\\*&\\s]+)+"+d, +returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:u,illegal:/[^\w\s\*&:<>.]/, +contains:[{begin:"decltype\\(auto\\)",keywords:u,relevance:0},{begin:d, +returnBegin:!0,contains:[l],relevance:0},{className:"params",begin:/\(/, +end:/\)/,keywords:u,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,s,o,i,{ +begin:/\(/,end:/\)/,keywords:u,relevance:0, +contains:["self",n,t.C_BLOCK_COMMENT_MODE,s,o,i]}] +},i,n,t.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, +disableAutodetect:!0,illegal:"",keywords:u,contains:["self",i]},{begin:t.IDENT_RE+"::",keywords:u},{ +className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, +contains:[{beginKeywords:"final class struct"},t.TITLE_MODE]}]),exports:{ +preprocessor:c,strings:s,keywords:u}}}})()); +hljs.registerLanguage("coffeescript",(()=>{"use strict" +;const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) +;return r=>{const t={ +keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((i=["var","const","let","function","static"], +e=>!i.includes(e))),literal:n.concat(["yes","no","on","off"]), +built_in:a.concat(["npm","print"])};var i;const s="[A-Za-z$_][0-9A-Za-z$_]*",o={ +className:"subst",begin:/#\{/,end:/\}/,keywords:t +},c=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?", +relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/, +contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE] +},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,o]},{begin:/"/,end:/"/, +contains:[r.BACKSLASH_ESCAPE,o]}]},{className:"regexp",variants:[{begin:"///", +end:"///",contains:[o,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)", +relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+s +},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{ +begin:"```",end:"```"},{begin:"`",end:"`"}]}];o.contains=c +;const l=r.inherit(r.TITLE_MODE,{begin:s}),d="(\\(.*\\)\\s*)?\\B[-=]>",g={ +className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/, +end:/\)/,keywords:t,contains:["self"].concat(c)}]};return{name:"CoffeeScript", +aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/, +contains:c.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{ +className:"function",begin:"^\\s*"+s+"\\s*=\\s*"+d,end:"[-=]>",returnBegin:!0, +contains:[l,g]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function", +begin:d,end:"[-=]>",returnBegin:!0,contains:[g]}]},{className:"class", +beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{ +beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[l]},l] +},{begin:s+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}})()); +hljs.registerLanguage("cpp",(()=>{"use strict";function e(e){ +return t("(",e,")?")}function t(...e){return e.map((e=>{ +return(t=e)?"string"==typeof t?t:t.source:null;var t})).join("")}return n=>{ +const r=n.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),a="[a-zA-Z_]\\w*::",i="(decltype\\(auto\\)|"+e(a)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",s={ +className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string", +variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", +contains:[n.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},n.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},n.inherit(c,{className:"meta-string"}),{ +className:"meta-string",begin:/<.*?>/},r,n.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:e(a)+n.IDENT_RE,relevance:0 +},u=e(a)+n.IDENT_RE+"\\s*\\(",m={ +keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", +built_in:"_Bool _Complex _Imaginary", +_relevance_hints:["asin","atan2","atan","calloc","ceil","cosh","cos","exit","exp","fabs","floor","fmod","fprintf","fputs","free","frexp","auto_ptr","deque","list","queue","stack","vector","map","set","pair","bitset","multiset","multimap","unordered_set","fscanf","future","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","tolower","toupper","labs","ldexp","log10","log","malloc","realloc","memchr","memcmp","memcpy","memset","modf","pow","printf","putchar","puts","scanf","sinh","sin","snprintf","sprintf","sqrt","sscanf","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","tanh","tan","unordered_map","unordered_multiset","unordered_multimap","priority_queue","make_pair","array","shared_ptr","abort","terminate","abs","acos","vfprintf","vprintf","vsprintf","endl","initializer_list","unique_ptr","complex","imaginary","std","string","wstring","cin","cout","cerr","clog","stdin","stdout","stderr","stringstream","istringstream","ostringstream"], +literal:"true false nullptr NULL"},p={className:"function.dispatch",relevance:0, +keywords:m, +begin:t(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!while)/,n.IDENT_RE,(_=/\s*\(/, +t("(?=",_,")")))};var _;const g=[p,l,s,r,n.C_BLOCK_COMMENT_MODE,o,c],b={ +variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ +beginKeywords:"new throw return else",end:/;/}],keywords:m,contains:g.concat([{ +begin:/\(/,end:/\)/,keywords:m,contains:g.concat(["self"]),relevance:0}]), +relevance:0},f={className:"function",begin:"("+i+"[\\*&\\s]+)+"+u, +returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:m,illegal:/[^\w\s\*&:<>.]/, +contains:[{begin:"decltype\\(auto\\)",keywords:m,relevance:0},{begin:u, +returnBegin:!0,contains:[d],relevance:0},{begin:/::/,relevance:0},{begin:/:/, +endsWithParent:!0,contains:[c,o]},{className:"params",begin:/\(/,end:/\)/, +keywords:m,relevance:0,contains:[r,n.C_BLOCK_COMMENT_MODE,c,o,s,{begin:/\(/, +end:/\)/,keywords:m,relevance:0,contains:["self",r,n.C_BLOCK_COMMENT_MODE,c,o,s] +}]},s,r,n.C_BLOCK_COMMENT_MODE,l]};return{name:"C++", +aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:m,illegal:"",keywords:m,contains:["self",s]},{begin:n.IDENT_RE+"::",keywords:m},{ +className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, +contains:[{beginKeywords:"final class struct"},n.TITLE_MODE]}]),exports:{ +preprocessor:l,strings:c,keywords:m}}}})()); +hljs.registerLanguage("csharp",(()=>{"use strict";return e=>{const n={ +keyword:["abstract","as","base","break","case","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), +built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], +literal:["default","false","null","true"]},a=e.inherit(e.TITLE_MODE,{ +begin:"[a-zA-Z](\\.?\\w)*"}),i={className:"number",variants:[{ +begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] +},t=e.inherit(s,{illegal:/\n/}),r={className:"subst",begin:/\{/,end:/\}/, +keywords:n},l=e.inherit(r,{illegal:/\n/}),c={className:"string",begin:/\$"/, +end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ +},e.BACKSLASH_ESCAPE,l]},o={className:"string",begin:/\$@"/,end:'"',contains:[{ +begin:/\{\{/},{begin:/\}\}/},{begin:'""'},r]},d=e.inherit(o,{illegal:/\n/, +contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},l]}) +;r.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.C_BLOCK_COMMENT_MODE], +l.contains=[d,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.inherit(e.C_BLOCK_COMMENT_MODE,{ +illegal:/\n/})];const g={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},a] +},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={ +begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], +keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, +contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ +begin:"\x3c!--|--\x3e"},{begin:""}]}] +}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", +end:"$",keywords:{ +"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum" +}},g,i,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, +illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" +},a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", +relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[a,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", +begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ +className:"meta-string",begin:/"/,end:/"/}]},{ +beginKeywords:"new return throw await else",relevance:0},{className:"function", +begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(<.+>\\s*)?\\(",returnBegin:!0, +end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", +relevance:0},{begin:e.IDENT_RE+"\\s*(<.+>\\s*)?\\(",returnBegin:!0, +contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/, +excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, +contains:[g,i,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}})()); +hljs.registerLanguage("css",(()=>{"use strict" +;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],r=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() +;return n=>{const a=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, +HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, +ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, +illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} +}))(n),l=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS", +case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"}, +classNameAliases:{keyframePosition:"selector-tag"}, +contains:[n.C_BLOCK_COMMENT_MODE,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ +},n.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 +},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 +},a.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ +begin:":("+i.join("|")+")"},{begin:"::("+o.join("|")+")"}]},{ +className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{begin:":",end:"[;}]", +contains:[a.HEXCOLOR,a.IMPORTANT,n.CSS_NUMBER_MODE,...l,{ +begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" +},contains:[{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}] +},{className:"built_in",begin:/[\w-]+(?=\()/}]},{ +begin:(s=/@/,((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(?=",s,")")), +end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword", +begin:/@-?\w[\w]*(-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0, +relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only", +attribute:t.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute" +},...l,n.CSS_NUMBER_MODE]}]},{className:"selector-tag", +begin:"\\b("+e.join("|")+")\\b"}]};var s}})()); +hljs.registerLanguage("diff",(()=>{"use strict";return e=>({name:"Diff", +aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{ +begin:/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{ +begin:/^--- +\d+,\d+ +----$/}]},{className:"comment",variants:[{begin:/Index: /, +end:/$/},{begin:/^index/,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^-{3}/,end:/$/ +},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/},{ +begin:/^diff --git/,end:/$/}]},{className:"addition",begin:/^\+/,end:/$/},{ +className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, +end:/$/}]})})()); +hljs.registerLanguage("go",(()=>{"use strict";return e=>{const n={ +keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune", +literal:"true false iota nil", +built_in:"append cap close complex copy imag len make new panic print println real recover delete" +};return{name:"Go",aliases:["golang"],keywords:n,illegal:"{"use strict";function e(...e){ +return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n +})).join("")}return n=>{const a="HTTP/(2|1\\.[01])",s={className:"attribute", +begin:e("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{ +className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]} +},t=[s,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{ +name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+a+" \\d{3})", +end:/$/,contains:[{className:"meta",begin:a},{className:"number", +begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:t}},{ +begin:"(?=^[A-Z]+ (.*?) "+a+"$)",end:/$/,contains:[{className:"string", +begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:a},{ +className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:t} +},n.inherit(s,{relevance:0})]}}})()); +hljs.registerLanguage("ini",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(...n){ +return n.map((n=>e(n))).join("")}return s=>{const a={className:"number", +relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{begin:s.NUMBER_RE}] +},i=s.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];const t={ +className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)\}/ +}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={ +className:"string",contains:[s.BACKSLASH_ESCAPE],variants:[{begin:"'''", +end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"' +},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,a,"self"], +relevance:0 +},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map((n=>e(n))).join("|")+")" +;return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, +contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{ +begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr", +starts:{end:/$/,contains:[i,c,r,t,l,a]}}]}}})()); +hljs.registerLanguage("java",(()=>{"use strict" +;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ +className:"number",variants:[{ +begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ +begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};return e=>{ +var n="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s={ +className:"meta",begin:"@[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*", +contains:[{begin:/\(/,end:/\)/,contains:["self"]}]};const r=a;return{ +name:"Java",aliases:["jsp"],keywords:n,illegal:/<\/|#/, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, +relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ +begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ +className:"class",beginKeywords:"class interface enum",end:/[{;=]/, +excludeEnd:!0,relevance:1,keywords:"class interface enum",illegal:/[:"\[\]]/, +contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"new throw return else",relevance:0},{className:"class", +begin:"record\\s+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,excludeEnd:!0, +end:/[{;=]/,keywords:n,contains:[{beginKeywords:"record"},{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, +keywords:n,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"function", +begin:"([\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(<[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(\\s*,\\s*[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(", +returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, +keywords:n,relevance:0, +contains:[s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,r,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},r,s]}}})()); +hljs.registerLanguage("javascript",(()=>{"use strict" +;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) +;function r(e){return t("(?=",e,")")}function t(...e){return e.map((e=>{ +return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return i=>{ +const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/, +isTrulyOpeningTag:(e,n)=>{const a=e[0].length+e.index,s=e.input[a] +;"<"!==s?">"===s&&(((e,{after:n})=>{const a="", +returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{ +begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0 +},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:f}]}] +},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{ +variants:[{begin:"<>",end:""},{begin:o.begin,"on:begin":o.isTrulyOpeningTag, +end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0, +contains:["self"]}]}],relevance:0},{className:"function", +beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l, +contains:["self",i.inherit(i.TITLE_MODE,{begin:c}),p],illegal:/%/},{ +beginKeywords:"while if switch catch for"},{className:"function", +begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,contains:[p,i.inherit(i.TITLE_MODE,{begin:c})]},{variants:[{ +begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class", +beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{ +beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/, +end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:c}),"self",p] +},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set", +contains:[i.inherit(i.TITLE_MODE,{begin:c}),{begin:/\(\)/},p]},{begin:/\$[(.]/}] +}}})()); +hljs.registerLanguage("json",(()=>{"use strict";return n=>{const e={ +literal:"true false null" +},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],a=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],l={ +end:",",endsWithParent:!0,excludeEnd:!0,contains:a,keywords:e},t={begin:/\{/, +end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/, +contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(l,{begin:/:/ +})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(l)], +illegal:"\\S"};return a.push(t,s),i.forEach((n=>{a.push(n)})),{name:"JSON", +contains:a,keywords:e,illegal:"\\S"}}})()); +hljs.registerLanguage("kotlin",(()=>{"use strict" +;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ +className:"number",variants:[{ +begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ +begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};return e=>{const n={ +keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", +built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", +literal:"true false null"},i={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" +},s={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},t={ +className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", +variants:[{begin:'"""',end:'"""(?=[^"])',contains:[t,s]},{begin:"'",end:"'", +illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, +contains:[e.BACKSLASH_ESCAPE,t,s]}]};s.contains.push(r);const l={ +className:"meta", +begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" +},c={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, +end:/\)/,contains:[e.inherit(r,{className:"meta-string"})]}] +},o=a,b=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),E={ +variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, +contains:[]}]},d=E;return d.variants[1].contains=[E],E.variants[1].contains=[d], +{name:"Kotlin",aliases:["kt","kts"],keywords:n, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", +begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,b,{className:"keyword", +begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", +begin:/@\w+/}]}},i,l,c,{className:"function",beginKeywords:"fun",end:"[(]|$", +returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, +keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, +endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, +endsWithParent:!0,contains:[E,e.C_LINE_COMMENT_MODE,b],relevance:0 +},e.C_LINE_COMMENT_MODE,b,l,c,r,e.C_NUMBER_MODE]},b]},{className:"class", +beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, +illegal:"extends implements",contains:[{ +beginKeywords:"public protected internal private constructor" +},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, +excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/, +excludeBegin:!0,returnEnd:!0},l,c]},r,{className:"meta",begin:"^#!/usr/bin/env", +end:"$",illegal:"\n"},o]}}})()); +hljs.registerLanguage("less",(()=>{"use strict" +;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],n=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse(),r=i.concat(o) +;return a=>{const s=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, +HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, +ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, +illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} +}))(a),l=r,d="([\\w-]+|@\\{[\\w-]+\\})",c=[],g=[],b=e=>({className:"string", +begin:"~?"+e+".*?"+e}),m=(e,t,i)=>({className:e,begin:t,relevance:i}),u={ +$pattern:/[a-z-]+/,keyword:"and or not only",attribute:t.join(" ")},p={ +begin:"\\(",end:"\\)",contains:g,keywords:u,relevance:0} +;g.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,b("'"),b('"'),a.CSS_NUMBER_MODE,{ +begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", +excludeEnd:!0} +},s.HEXCOLOR,p,m("variable","@@?[\\w-]+",10),m("variable","@\\{[\\w-]+\\}"),m("built_in","~?`[^`]*?`"),{ +className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0 +},s.IMPORTANT);const f=g.concat({begin:/\{/,end:/\}/,contains:c}),h={ +beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not" +}].concat(g)},w={begin:d+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0, +contains:[{begin:/-(webkit|moz|ms|o)-/},{className:"attribute", +begin:"\\b("+n.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0, +illegal:"[<=$]",relevance:0,contains:g}}]},v={className:"keyword", +begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", +starts:{end:"[;{}]",keywords:u,returnEnd:!0,contains:g,relevance:0}},y={ +className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{ +begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:f}},k={variants:[{ +begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:d,end:/\{/}],returnBegin:!0, +returnEnd:!0,illegal:"[<='$\"]",relevance:0, +contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,h,m("keyword","all\\b"),m("variable","@\\{[\\w-]+\\}"),{ +begin:"\\b("+e.join("|")+")\\b",className:"selector-tag" +},m("selector-tag",d+"%?",0),m("selector-id","#"+d),m("selector-class","\\."+d,0),m("selector-tag","&",0),s.ATTRIBUTE_SELECTOR_MODE,{ +className:"selector-pseudo",begin:":("+i.join("|")+")"},{ +className:"selector-pseudo",begin:"::("+o.join("|")+")"},{begin:"\\(",end:"\\)", +contains:f},{begin:"!important"}]},E={begin:`[\\w-]+:(:)?(${l.join("|")})`, +returnBegin:!0,contains:[k]} +;return c.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,v,y,E,w,k),{ +name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:c}}})()); +hljs.registerLanguage("lua",(()=>{"use strict";return e=>{ +const t="\\[=*\\[",a="\\]=*\\]",n={begin:t,end:a,contains:["self"] +},o=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[",a,{contains:[n], +relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, +literal:"true false nil", +keyword:"and break do else elseif end for goto if in local not or repeat return then until while", +built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" +},contains:o.concat([{className:"function",beginKeywords:"function",end:"\\)", +contains:[e.inherit(e.TITLE_MODE,{ +begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", +begin:"\\(",endsWithParent:!0,contains:o}].concat(o) +},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", +begin:t,end:a,contains:[n],relevance:5}])}}})()); +hljs.registerLanguage("makefile",(()=>{"use strict";return e=>{const i={ +className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} +function a(...n){return n.map((n=>e(n))).join("")}function s(...n){ +return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ +const t=a(/[A-Z_]/,a("(",/[A-Z0-9_.-]*:/,")?"),/[A-Z0-9_.-]*/),i={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},r={begin:/\s/, +contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},c=e.inherit(r,{begin:/\(/,end:/\)/}),l=e.inherit(e.APOS_STRING_MODE,{ +className:"meta-string"}),g=e.inherit(e.QUOTE_STRING_MODE,{ +className:"meta-string"}),m={endsWithParent:!0,illegal:/`]+/}]}] +}]};return{name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,contains:[{className:"meta",begin://, +relevance:10,contains:[r,g,l,c,{begin:/\[/,end:/\]/,contains:[{className:"meta", +begin://,contains:[r,c,g,l]}]}]},e.COMMENT(//,{ +relevance:10}),{begin://,relevance:10},i,{ +className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[m],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[m],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:a(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name", +begin:t,relevance:0,starts:m}]},{className:"tag",begin:a(/<\//,n(a(t,/>/))), +contains:[{className:"name",begin:t,relevance:0},{begin:/>/,relevance:0, +endsParent:!0}]}]}}})()); +hljs.registerLanguage("markdown",(()=>{"use strict";function n(...n){ +return n.map((n=>{return(e=n)?"string"==typeof e?e:e.source:null;var e +})).join("")}return e=>{const a={begin:/<\/?[A-Za-z_]/,end:">", +subLanguage:"xml",relevance:0},i={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0 +},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{begin:n(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.+?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{ +className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},s={className:"strong",contains:[], +variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},c={ +className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{ +begin:/_(?!_)/,end:/_/,relevance:0}]};s.contains.push(c),c.contains.push(s) +;let t=[a,i] +;return s.contains=s.contains.concat(t),c.contains=c.contains.concat(t), +t=t.concat(s,c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:t},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:t}]}]},a,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},s,c,{className:"quote",begin:"^>\\s+",contains:t, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},i,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})()); +hljs.registerLanguage("nginx",(()=>{"use strict";return e=>{const n={ +className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/\}/},{ +begin:/[$@]/+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{ +$pattern:"[a-z/_]+", +literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll" +},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string", +contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/ +}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n] +},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^", +end:"\\s|\\{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|\\{|;",returnEnd:!0},{ +begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number", +begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{ +className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{ +name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{ +begin:e.UNDERSCORE_IDENT_RE+"\\s+\\{",returnBegin:!0,end:/\{/,contains:[{ +className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{ +begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|\\{",returnBegin:!0,contains:[{ +className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}], +illegal:"[^\\s\\}]"}}})()); +hljs.registerLanguage("objectivec",(()=>{"use strict";return e=>{ +const n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n, +keyword:"@interface @class @protocol @implementation"};return{ +name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], +keywords:{$pattern:n, +keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN", +literal:"false true FALSE TRUE nil YES NO NULL", +built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once" +},illegal:"/,end:/$/, +illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:/(\{|$)/, +excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{ +begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}})()); +hljs.registerLanguage("perl",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(...n){ +return n.map((n=>e(n))).join("")}function t(...n){ +return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ +const r=/[dualxmsipngr]{0,12}/,s={$pattern:/[\w.]+/, +keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" +},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:s},a={begin:/->\{/, +end:/\}/},o={variants:[{begin:/\$\d/},{ +begin:n(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])") +},{begin:/[$%@][^\s\w{]/,relevance:0}] +},c=[e.BACKSLASH_ESCAPE,i,o],g=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],l=(e,t,s="\\1")=>{ +const i="\\1"===s?s:n(s,t) +;return n(n("(?:",e,")"),t,/(?:\\.|[^\\\/])*?/,i,/(?:\\.|[^\\\/])*?/,s,r) +},d=(e,t,s)=>n(n("(?:",e,")"),t,/(?:\\.|[^\\\/])*?/,s,r),p=[o,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{ +endsWithParent:!0}),a,{className:"string",contains:c,variants:[{ +begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[", +end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{ +begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">", +relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'", +contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{ +begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number", +begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b", +relevance:0},{ +begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*", +keywords:"split return print reverse grep",relevance:0, +contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{ +begin:l("s|tr|y",t(...g))},{begin:l("s|tr|y","\\(","\\)")},{ +begin:l("s|tr|y","\\[","\\]")},{begin:l("s|tr|y","\\{","\\}")}],relevance:2},{ +className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{ +begin:d("(?:m|qr)?",/\//,/\//)},{begin:d("m|qr",t(...g),/\1/)},{ +begin:d("m|qr",/\(/,/\)/)},{begin:d("m|qr",/\[/,/\]/)},{ +begin:d("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub", +end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{ +begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$", +subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}] +}];return i.contains=p,a.contains=p,{name:"Perl",aliases:["pl","pm"],keywords:s, +contains:p}}})()); +hljs.registerLanguage("php",(()=>{"use strict";return e=>{const r={ +className:"variable", +begin:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?![A-Za-z0-9])(?![$])"},t={ +className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{ +begin:/\?>/}]},a={className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/, +end:/\}/}]},n=e.inherit(e.APOS_STRING_MODE,{illegal:null +}),i=e.inherit(e.QUOTE_STRING_MODE,{illegal:null, +contains:e.QUOTE_STRING_MODE.contains.concat(a)}),o=e.END_SAME_AS_BEGIN({ +begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/, +contains:e.QUOTE_STRING_MODE.contains.concat(a)}),l={className:"string", +contains:[e.BACKSLASH_ESCAPE,t],variants:[e.inherit(n,{begin:"b'",end:"'" +}),e.inherit(i,{begin:'b"',end:'"'}),i,n,o]},s={className:"number",variants:[{ +begin:"\\b0b[01]+(?:_[01]+)*\\b"},{begin:"\\b0o[0-7]+(?:_[0-7]+)*\\b"},{ +begin:"\\b0x[\\da-f]+(?:_[\\da-f]+)*\\b"},{ +begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:e[+-]?\\d+)?" +}],relevance:0},c={ +keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile enum eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list match|0 mixed new object or private protected public real return string switch throw trait try unset use var void while xor yield", +literal:"false null true", +built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException UnhandledMatchError ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Stringable Throwable Traversable WeakReference WeakMap Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass" +};return{aliases:["php3","php4","php5","php6","php7","php8"], +case_insensitive:!0,keywords:c, +contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t] +}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}] +}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0, +keywords:"__halt_compiler"}),t,{className:"keyword",begin:/\$this\b/},r,{ +begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function", +relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0, +illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{ +begin:"=>",endsParent:!0},{className:"params",begin:"\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0,keywords:c, +contains:["self",r,e.C_BLOCK_COMMENT_MODE,l,s]}]},{className:"class",variants:[{ +beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", +illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ +beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, +contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",relevance:0,end:";", +contains:[e.UNDERSCORE_TITLE_MODE]},l,s]}}})()); +hljs.registerLanguage("php-template",(()=>{"use strict";return n=>({ +name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/, +subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"', +end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{ +illegal:null,className:null,contains:null,skip:!0 +}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null, +skip:!0})]}]})})()); +hljs.registerLanguage("plaintext",(()=>{"use strict";return t=>({ +name:"Plain text",aliases:["text","txt"],disableAutodetect:!0})})()); +hljs.registerLanguage("properties",(()=>{"use strict";return e=>{ +var n="[ \\t\\f]*",a=n+"[:=]"+n,t="("+a+"|[ \\t\\f]+)",r="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",s="([^\\\\:= \\t\\f\\n]|\\\\.)+",i={ +end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{ +begin:"\\\\\\\\"},{begin:"\\\\\\n"}]}};return{name:".properties", +case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{ +returnBegin:!0,variants:[{begin:r+a,relevance:1},{begin:r+"[ \\t\\f]+", +relevance:0}],contains:[{className:"attr",begin:r,endsParent:!0,relevance:0}], +starts:i},{begin:s+t,returnBegin:!0,relevance:0,contains:[{className:"meta", +begin:s,endsParent:!0,relevance:0}],starts:i},{className:"attr",relevance:0, +begin:s+n+"$"}]}}})()); +hljs.registerLanguage("python",(()=>{"use strict";return e=>{const n={ +$pattern:/[A-Za-z]\w+|__\w+__/, +keyword:["and","as","assert","async","await","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"], +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/, +end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},t={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},r="[0-9](_?[0-9])*",l=`(\\b(${r}))?\\.(${r})|\\b(${r})\\.`,b={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${r})|(${l}))[eE][+-]?(${r})[jJ]?\\b`},{begin:`(${l})[jJ]?`},{ +begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?\\b"},{ +begin:"\\b0[bB](_?[01])+[lL]?\\b"},{begin:"\\b0[oO](_?[0-7])+[lL]?\\b"},{ +begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?\\b"},{begin:`\\b(${r})[jJ]\\b`}]},o={ +className:"comment", +begin:(d=/# type:/,((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(?=",d,")")), +end:/$/,keywords:n,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/, +endsWithParent:!0}]},c={className:"params",variants:[{className:"", +begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0, +keywords:n,contains:["self",a,b,t,e.HASH_COMMENT_MODE]}]};var d +;return i.contains=[t,b,a],{name:"Python",aliases:["py","gyp","ipython"], +keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,b,{begin:/\bself\b/},{ +beginKeywords:"if",relevance:0},t,o,e.HASH_COMMENT_MODE,{variants:[{ +className:"function",beginKeywords:"def"},{className:"class", +beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/, +contains:[e.UNDERSCORE_TITLE_MODE,c,{begin:/->/,endsWithParent:!0,keywords:n}] +},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[b,c,t]}]}}})()); +hljs.registerLanguage("python-repl",(()=>{"use strict";return s=>({ +aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$", +subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{ +begin:/^\.\.\.(?=[ ]|$)/}]}]})})()); +hljs.registerLanguage("r",(()=>{"use strict";function e(...e){return e.map((e=>{ +return(a=e)?"string"==typeof a?a:a.source:null;var a})).join("")}return a=>{ +const n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/;return{name:"R", +illegal:/->/,keywords:{$pattern:n, +keyword:"function if in break next repeat else for while", +literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", +built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" +},compilerExtensions:[(a,n)=>{if(!a.beforeMatch)return +;if(a.starts)throw Error("beforeMatch cannot be used with starts") +;const i=Object.assign({},a);Object.keys(a).forEach((e=>{delete a[e] +})),a.begin=e(i.beforeMatch,e("(?=",i.begin,")")),a.starts={relevance:0, +contains:[Object.assign(i,{endsParent:!0})]},a.relevance=0,delete i.beforeMatch +}],contains:[a.COMMENT(/#'/,/$/,{contains:[{className:"doctag", +begin:"@examples",starts:{contains:[{begin:/\n/},{begin:/#'\s*(?=@[a-zA-Z]+)/, +endsParent:!0},{begin:/#'/,end:/$/,excludeBegin:!0}]}},{className:"doctag", +begin:"@param",end:/$/,contains:[{className:"variable",variants:[{begin:n},{ +begin:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{className:"doctag", +begin:/@[a-zA-Z]+/},{className:"meta-keyword",begin:/\\[a-zA-Z]+/}] +}),a.HASH_COMMENT_MODE,{className:"string",contains:[a.BACKSLASH_ESCAPE], +variants:[a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', +relevance:0},{begin:"'",end:"'",relevance:0}]},{className:"number",relevance:0, +beforeMatch:/([^a-zA-Z0-9._])/,variants:[{ +match:/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/},{ +match:/0[xX][0-9a-fA-F]+([pP][+-]?\d+)?[Li]?/},{ +match:/(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?[Li]?/}]},{begin:"%",end:"%"},{ +begin:e(/[a-zA-Z][a-zA-Z_0-9]*/,"\\s+<-\\s+")},{begin:"`",end:"`",contains:[{ +begin:/\\./}]}]}}})()); +hljs.registerLanguage("ruby",(()=>{"use strict";function e(...e){ +return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n +})).join("")}return n=>{ +const a="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",i={ +keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor __FILE__", +built_in:"proc lambda",literal:"true false nil"},s={className:"doctag", +begin:"@[A-Za-z]+"},r={begin:"#<",end:">"},b=[n.COMMENT("#","$",{contains:[s] +}),n.COMMENT("^=begin","^=end",{contains:[s],relevance:10 +}),n.COMMENT("^__END__","\\n$")],c={className:"subst",begin:/#\{/,end:/\}/, +keywords:i},t={className:"string",contains:[n.BACKSLASH_ESCAPE,c],variants:[{ +begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/, +end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{ +begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/, +end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{ +begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{ +begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ +begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ +begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ +begin:/<<[-~]?'?(\w+)\n(?:[^\n]*\n)*?\s*\1\b/,returnBegin:!0,contains:[{ +begin:/<<[-~]?'?/},n.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, +contains:[n.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",d={className:"number", +relevance:0,variants:[{ +begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ +begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" +},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ +begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ +begin:"\\b0(_?[0-7])+r?i?\\b"}]},l={className:"params",begin:"\\(",end:"\\)", +endsParent:!0,keywords:i},o=[t,{className:"class",beginKeywords:"class module", +end:"$|;",illegal:/=/,contains:[n.inherit(n.TITLE_MODE,{ +begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|!)?"}),{begin:"<\\s*",contains:[{ +begin:"("+n.IDENT_RE+"::)?"+n.IDENT_RE,relevance:0}]}].concat(b)},{ +className:"function",begin:e(/def\s+/,(_=a+"\\s*(\\(|;|$)",e("(?=",_,")"))), +relevance:0,keywords:"def",end:"$|;",contains:[n.inherit(n.TITLE_MODE,{begin:a +}),l].concat(b)},{begin:n.IDENT_RE+"::"},{className:"symbol", +begin:n.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", +begin:":(?!\\s)",contains:[t,{begin:a}],relevance:0},d,{className:"variable", +begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ +className:"params",begin:/\|/,end:/\|/,relevance:0,keywords:i},{ +begin:"("+n.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{ +className:"regexp",contains:[n.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{ +begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(", +end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}] +}].concat(r,b),relevance:0}].concat(r,b);var _;c.contains=o,l.contains=o +;const E=[{begin:/^\s*=>/,starts:{end:"$",contains:o}},{className:"meta", +begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", +starts:{end:"$",contains:o}}];return b.unshift(r),{name:"Ruby", +aliases:["rb","gemspec","podspec","thor","irb"],keywords:i,illegal:/\/\*/, +contains:[n.SHEBANG({binary:"ruby"})].concat(E).concat(b).concat(o)}}})()); +hljs.registerLanguage("rust",(()=>{"use strict";return e=>{ +const n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!" +;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?", +keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield", +literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}})()); +hljs.registerLanguage("scss",(()=>{"use strict" +;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],r=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() +;return a=>{const n=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, +HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, +ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, +illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} +}))(a),l=o,s=i,d="@[a-z-]+",c={className:"variable", +begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"};return{name:"SCSS",case_insensitive:!0, +illegal:"[=/|']",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{ +className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ +className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 +},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", +begin:"\\b("+e.join("|")+")\\b",relevance:0},{className:"selector-pseudo", +begin:":("+s.join("|")+")"},{className:"selector-pseudo", +begin:"::("+l.join("|")+")"},c,{begin:/\(/,end:/\)/,contains:[a.CSS_NUMBER_MODE] +},{className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{ +begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" +},{begin:":",end:";", +contains:[c,n.HEXCOLOR,a.CSS_NUMBER_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,n.IMPORTANT] +},{begin:"@(page|font-face)",lexemes:d,keywords:"@page @font-face"},{begin:"@", +end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, +keyword:"and or not only",attribute:t.join(" ")},contains:[{begin:d, +className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" +},c,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,n.HEXCOLOR,a.CSS_NUMBER_MODE]}]}} +})()); +hljs.registerLanguage("shell",(()=>{"use strict";return s=>({ +name:"Shell Session",aliases:["console"],contains:[{className:"meta", +begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#]/,starts:{end:/[^\\](?=\s*$)/, +subLanguage:"bash"}}]})})()); +hljs.registerLanguage("sql",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function r(...r){ +return r.map((r=>e(r))).join("")}function t(...r){ +return"("+r.map((r=>e(r))).join("|")+")"}return e=>{ +const n=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],s=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],o=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],c=s,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update ","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!s.includes(e))),u={ +begin:r(/\b/,t(...c),/\s*\(/),keywords:{built_in:c}};return{name:"SQL", +case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/, +keyword:((e,{exceptions:r,when:t}={})=>{const n=t +;return r=r||[],e.map((e=>e.match(/\|\d+$/)||r.includes(e)?e:n(e)?e+"|0":e)) +})(l,{when:e=>e.length<3}),literal:a,type:i, +built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] +},contains:[{begin:t(...o),keywords:{$pattern:/[\w\.]+/,keyword:l.concat(o), +literal:a,type:i}},{className:"type", +begin:t("double precision","large object","with timezone","without timezone") +},u,{className:"variable",begin:/@[a-z0-9]+/},{className:"string",variants:[{ +begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/,contains:[{ +begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,n,{className:"operator", +begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}})()); +hljs.registerLanguage("swift",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} +function a(...n){return n.map((n=>e(n))).join("")}function t(...n){ +return"("+n.map((n=>e(n))).join("|")+")"} +const i=e=>a(/\b/,e,/\w$/.test(e)?/\b/:/\B/),s=["Protocol","Type"].map(i),u=["init","self"].map(i),c=["Any","Self"],r=["associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],o=["false","nil","true"],l=["assignment","associativity","higherThan","left","lowerThan","none","right"],m=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],d=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],p=t(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),F=t(p,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),b=a(p,F,"*"),h=t(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),f=t(h,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),w=a(h,f,"*"),y=a(/[A-Z]/,f,"*"),g=["autoclosure",a(/convention\(/,t("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",a(/objc\(/,w,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","testable","UIApplicationMain","unknown","usableFromInline"],E=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] +;return e=>{const p={match:/\s+/,relevance:0},h=e.COMMENT("/\\*","\\*/",{ +contains:["self"]}),v=[e.C_LINE_COMMENT_MODE,h],N={className:"keyword", +begin:a(/\./,n(t(...s,...u))),end:t(...s,...u),excludeBegin:!0},A={ +match:a(/\./,t(...r)),relevance:0 +},C=r.filter((e=>"string"==typeof e)).concat(["_|0"]),_={variants:[{ +className:"keyword", +match:t(...r.filter((e=>"string"!=typeof e)).concat(c).map(i),...u)}]},D={ +$pattern:t(/\b\w+/,/#\w+/),keyword:C.concat(m),literal:o},B=[N,A,_],k=[{ +match:a(/\./,t(...d)),relevance:0},{className:"built_in", +match:a(/\b/,t(...d),/(?=\()/)}],M={match:/->/,relevance:0},S=[M,{ +className:"operator",relevance:0,variants:[{match:b},{match:`\\.(\\.|${F})+`}] +}],x="([0-9a-fA-F]_*)+",I={className:"number",relevance:0,variants:[{ +match:"\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b"},{ +match:`\\b0x(${x})(\\.(${x}))?([pP][+-]?(([0-9]_*)+))?\\b`},{ +match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},O=(e="")=>({ +className:"subst",variants:[{match:a(/\\/,e,/[0\\tnr"']/)},{ +match:a(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}]}),T=(e="")=>({className:"subst", +match:a(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),L=(e="")=>({className:"subst", +label:"interpol",begin:a(/\\/,e,/\(/),end:/\)/}),P=(e="")=>({begin:a(e,/"""/), +end:a(/"""/,e),contains:[O(e),T(e),L(e)]}),$=(e="")=>({begin:a(e,/"/), +end:a(/"/,e),contains:[O(e),L(e)]}),K={className:"string", +variants:[P(),P("#"),P("##"),P("###"),$(),$("#"),$("##"),$("###")]},j={ +match:a(/`/,w,/`/)},z=[j,{className:"variable",match:/\$\d+/},{ +className:"variable",match:`\\$${f}+`}],q=[{match:/(@|#)available/, +className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:E, +contains:[...S,I,K]}]}},{className:"keyword",match:a(/@/,t(...g))},{ +className:"meta",match:a(/@/,w)}],U={match:n(/\b[A-Z]/),relevance:0,contains:[{ +className:"type", +match:a(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,f,"+") +},{className:"type",match:y,relevance:0},{match:/[?!]+/,relevance:0},{ +match:/\.\.\./,relevance:0},{match:a(/\s+&\s+/,n(y)),relevance:0}]},Z={ +begin://,keywords:D,contains:[...v,...B,...q,M,U]};U.contains.push(Z) +;const G={begin:/\(/,end:/\)/,relevance:0,keywords:D,contains:["self",{ +match:a(w,/\s*:/),keywords:"_|0",relevance:0 +},...v,...B,...k,...S,I,K,...z,...q,U]},H={beginKeywords:"func",contains:[{ +className:"title",match:t(j.match,w,b),endsParent:!0,relevance:0},p]},R={ +begin://,contains:[...v,U]},V={begin:/\(/,end:/\)/,keywords:D, +contains:[{begin:t(n(a(w,/\s*:/)),n(a(w,/\s+/,w,/\s*:/))),end:/:/,relevance:0, +contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:w}] +},...v,...B,...S,I,K,...q,U,G],endsParent:!0,illegal:/["']/},W={ +className:"function",match:n(/\bfunc\b/),contains:[H,R,V,p],illegal:[/\[/,/%/] +},X={className:"function",match:/\b(subscript|init[?!]?)\s*(?=[<(])/,keywords:{ +keyword:"subscript init init? init!",$pattern:/\w+[?!]?/},contains:[R,V,p], +illegal:/\[|%/},J={beginKeywords:"operator",end:e.MATCH_NOTHING_RE,contains:[{ +className:"title",match:b,endsParent:!0,relevance:0}]},Q={ +beginKeywords:"precedencegroup",end:e.MATCH_NOTHING_RE,contains:[{ +className:"title",match:y,relevance:0},{begin:/{/,end:/}/,relevance:0, +endsParent:!0,keywords:[...l,...o],contains:[U]}]};for(const e of K.variants){ +const n=e.contains.find((e=>"interpol"===e.label));n.keywords=D +;const a=[...B,...k,...S,I,K,...z];n.contains=[...a,{begin:/\(/,end:/\)/, +contains:["self",...a]}]}return{name:"Swift",keywords:D,contains:[...v,W,X,{ +className:"class",beginKeywords:"struct protocol class extension enum", +end:"\\{",excludeEnd:!0,keywords:D,contains:[e.inherit(e.TITLE_MODE,{ +begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...B]},J,Q,{ +beginKeywords:"import",end:/$/,contains:[...v],relevance:0 +},...B,...k,...S,I,K,...z,...q,U,G]}}})()); +hljs.registerLanguage("typescript",(()=>{"use strict" +;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) +;function t(e){return r("(?=",e,")")}function r(...e){return e.map((e=>{ +return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return i=>{ +const c={$pattern:e, +keyword:n.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]), +literal:a, +built_in:s.concat(["any","void","number","boolean","string","object","never","enum"]) +},o={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},l=(e,n,a)=>{ +const s=e.contains.findIndex((e=>e.label===n)) +;if(-1===s)throw Error("can not find mode to replace");e.contains.splice(s,1,a) +},b=(i=>{const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/, +end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ +const a=e[0].length+e.index,s=e.input[a];"<"!==s?">"===s&&(((e,{after:n})=>{ +const a="", +returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{ +begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0 +},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:f}]}] +},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{ +variants:[{begin:"<>",end:""},{begin:o.begin,"on:begin":o.isTrulyOpeningTag, +end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0, +contains:["self"]}]}],relevance:0},{className:"function", +beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l, +contains:["self",i.inherit(i.TITLE_MODE,{begin:c}),A],illegal:/%/},{ +beginKeywords:"while if switch catch for"},{className:"function", +begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,contains:[A,i.inherit(i.TITLE_MODE,{begin:c})]},{variants:[{ +begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class", +beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{ +beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/, +end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:c}),"self",A] +},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set", +contains:[i.inherit(i.TITLE_MODE,{begin:c}),{begin:/\(\)/},A]},{begin:/\$[(.]/}] +}})(i) +;return Object.assign(b.keywords,c),b.exports.PARAMS_CONTAINS.push(o),b.contains=b.contains.concat([o,{ +beginKeywords:"namespace",end:/\{/,excludeEnd:!0},{beginKeywords:"interface", +end:/\{/,excludeEnd:!0,keywords:"interface extends" +}]),l(b,"shebang",i.SHEBANG()),l(b,"use_strict",{className:"meta",relevance:10, +begin:/^\s*['"]use strict['"]/ +}),b.contains.find((e=>"function"===e.className)).relevance=0,Object.assign(b,{ +name:"TypeScript",aliases:["ts","tsx"]}),b}})()); +hljs.registerLanguage("vbnet",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(...n){ +return n.map((n=>e(n))).join("")}function t(...n){ +return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ +const a=/\d{1,2}\/\d{1,2}\/\d{4}/,i=/\d{4}-\d{1,2}-\d{1,2}/,s=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,o={ +className:"literal",variants:[{begin:n(/# */,t(i,a),/ *#/)},{ +begin:n(/# */,r,/ *#/)},{begin:n(/# */,s,/ *#/)},{ +begin:n(/# */,t(i,a),/ +/,t(s,r),/ *#/)}]},l=e.COMMENT(/'''/,/$/,{contains:[{ +className:"doctag",begin:/<\/?/,end:/>/}]}),c=e.COMMENT(null,/$/,{variants:[{ +begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]});return{name:"Visual Basic .NET", +aliases:["vb"],case_insensitive:!0,classNameAliases:{label:"symbol"},keywords:{ +keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", +built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", +type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", +literal:"true false nothing"}, +illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{ +className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/, +end:/"/,illegal:/\n/,contains:[{begin:/""/}]},o,{className:"number",relevance:0, +variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ +},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{ +begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{ +className:"label",begin:/^\w+:/},l,c,{className:"meta", +begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, +end:/$/,keywords:{ +"meta-keyword":"const disable else elseif enable end externalsource if region then" +},contains:[c]}]}}})()); +hljs.registerLanguage("yaml",(()=>{"use strict";return e=>{ +var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*'()[\\]]+",s={ +className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ +},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", +variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(s,{ +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={ +end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},t={begin:/\{/, +end:/\}/,contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]", +contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{ +begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ +begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", +relevance:10},{className:"string", +begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ +begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, +relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type", +begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a +},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", +begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", +relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ +className:"number", +begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" +},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},t,g,s],r=[...b] +;return r.pop(),r.push(i),l.contains=r,{name:"YAML",case_insensitive:!0, +aliases:["yml"],contains:b}}})()); \ No newline at end of file diff --git a/htmlReport/js/highlightjs-line-numbers.min.js b/htmlReport/js/highlightjs-line-numbers.min.js new file mode 100644 index 0000000000..8548576704 --- /dev/null +++ b/htmlReport/js/highlightjs-line-numbers.min.js @@ -0,0 +1,24 @@ +/* +The MIT License (MIT) + +Copyright (c) 2017 Yauheni Pakala + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +!function(r,o){"use strict";var e,i="hljs-ln",l="hljs-ln-line",h="hljs-ln-code",s="hljs-ln-numbers",c="hljs-ln-n",m="data-line-number",a=/\r\n|\r|\n/g;function u(e){for(var n=e.toString(),t=e.anchorNode;"TD"!==t.nodeName;)t=t.parentNode;for(var r=e.focusNode;"TD"!==r.nodeName;)r=r.parentNode;var o=parseInt(t.dataset.lineNumber),a=parseInt(r.dataset.lineNumber);if(o==a)return n;var i,l=t.textContent,s=r.textContent;for(a
{6}',[l,s,c,m,h,o+n.startFrom,0{1}',[i,r])}return e}(e.innerHTML,o)}function v(e){var n=e.className;if(/hljs-/.test(n)){for(var t=g(e.innerHTML),r=0,o="";r{1}
\n',[n,0 + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_BLOCK.html b/htmlReport/ns-1/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..bfffb85983 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_BLOCK.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..a3e4abf83d --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_CLASS.html b/htmlReport/ns-1/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..2716684697 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_CLASS.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..26e8e3baa0 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_LINE.html b/htmlReport/ns-1/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..9ea1c34daa --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_LINE.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..ca030237ff --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_METHOD.html b/htmlReport/ns-1/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..2cc74ffbd8 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_METHOD.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..c7b2c3bb4b --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..43ef8225bf --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/sources/source-1.html b/htmlReport/ns-1/sources/source-1.html new file mode 100644 index 0000000000..eae6142e21 --- /dev/null +++ b/htmlReport/ns-1/sources/source-1.html @@ -0,0 +1,136 @@ + + + + + + + Coverage Report > BagPacker + + + + + + +
+ + +

Coverage Summary for Class: BagPacker (bagpacker)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + +
+ package bagpacker;
+ 
+ import bagpacker.commands.ByeCommand;
+ import bagpacker.commands.Command;
+ import bagpacker.iohandler.Ui;
+ import bagpacker.iohandler.Parser;
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class BagPacker {
+     private static PackingList packingList;
+     /**
+      * Main entry-point for the java.BagPacker application.
+      */
+     public static void main(String[] args) {
+         // initialise variables
+         BagPacker.packingList = new PackingList();
+         //initialise BagPacker program
+         Ui.initialMessage();
+ 
+         //run main program
+         runBagPacker();
+ 
+         //Close program
+         Ui.goodbyeMessage();
+     }
+ 
+     public static void runBagPacker() {
+         while (ByeCommand.isBagPackerRunning) {
+             Command c = Parser.parse();
+             c.execute(packingList);
+         }
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/index.html b/htmlReport/ns-2/index.html new file mode 100644 index 0000000000..e80459467b --- /dev/null +++ b/htmlReport/ns-2/index.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_BLOCK.html b/htmlReport/ns-2/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..5b3e4bf8b7 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_BLOCK.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..d749010de6 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_CLASS.html b/htmlReport/ns-2/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..a9d565f02d --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_CLASS.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..a27cf69696 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_LINE.html b/htmlReport/ns-2/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..c6197008d7 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_LINE.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..302e3f2c82 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_METHOD.html b/htmlReport/ns-2/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..5e2aa5bb25 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_METHOD.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..fd6a82581a --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..86d0882cfe --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-1.html b/htmlReport/ns-2/sources/source-1.html new file mode 100644 index 0000000000..46ea5064ea --- /dev/null +++ b/htmlReport/ns-2/sources/source-1.html @@ -0,0 +1,127 @@ + + + + + + + Coverage Report > AddCommand + + + + + + +
+ + +

Coverage Summary for Class: AddCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.iohandler.Ui;
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class AddCommand extends Command {
+     public static final String MSG_SUCCESS_ADD = "New item added: %s";
+     public static final String HELP_MSG = "add : Adds an item to the packing list.\n" +
+                 "\tExample: add toothbrush";
+ 
+     private final Item item;
+ 
+     public AddCommand(Item item) {
+         this.item = item;
+     }
+ 
+     @Override
+     public void execute(PackingList packingList) {
+         this.packingList = packingList;
+         packingList.addItem(item);
+         Ui.printToUser(String.format(MSG_SUCCESS_ADD, item));
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-2.html b/htmlReport/ns-2/sources/source-2.html new file mode 100644 index 0000000000..8fcb8961a1 --- /dev/null +++ b/htmlReport/ns-2/sources/source-2.html @@ -0,0 +1,118 @@ + + + + + + + Coverage Report > ByeCommand + + + + + + +
+ + +

Coverage Summary for Class: ByeCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.packingfunc.PackingList;
+ 
+ /**
+  * ByeCommand class stops the BagPacker application by changing the run status
+  */
+ public class ByeCommand extends Command {
+     public static boolean isBagPackerRunning = true;
+     public static final String HELP_MSG = "bye : Stops the BagPacker Application\n" +
+             "\tExample: bye";
+     public void execute (PackingList packingList) {
+         this.isBagPackerRunning = false;
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-3.html b/htmlReport/ns-2/sources/source-3.html new file mode 100644 index 0000000000..edc10afab7 --- /dev/null +++ b/htmlReport/ns-2/sources/source-3.html @@ -0,0 +1,152 @@ + + + + + + + Coverage Report > Command + + + + + + +
+ + +

Coverage Summary for Class: Command (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ /**
+  * Commands class used to execute given commands from user
+  */
+ public abstract class Command {
+     protected PackingList packingList;
+     private int targetIndex = -1;
+ 
+     /**
+      * @param targetIndex listing index of the target item
+      */
+     public Command(int targetIndex) {
+         this.setTargetIndex(targetIndex);
+     }
+ 
+     protected Command() {
+     }
+ 
+     public void setTargetIndex(int targetIndex) {
+         this.targetIndex = targetIndex;
+     }
+ 
+     public int getTargetIndex() {
+         return targetIndex;
+     }
+ 
+     /**
+      * Extracts the target item in the list.
+      *
+      * @throws IndexOutOfBoundsException if the target index is out of bounds
+      */
+     protected Item getTargetItem() throws IndexOutOfBoundsException {
+         return packingList.get(getTargetIndex() - 1);
+     }
+ 
+ 
+     /**
+      * Executes the command which requires a packingList
+      *
+      * @param packingList used to execute the command
+      */
+     public void execute (PackingList packingList) {
+     }
+ 
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-4.html b/htmlReport/ns-2/sources/source-4.html new file mode 100644 index 0000000000..2d1e80c6e0 --- /dev/null +++ b/htmlReport/ns-2/sources/source-4.html @@ -0,0 +1,130 @@ + + + + + + + Coverage Report > DeleteCommand + + + + + + +
+ + +

Coverage Summary for Class: DeleteCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ import bagpacker.iohandler.Ui;
+ 
+ public class DeleteCommand extends Command {
+ 
+     public static final String MSG_SUCCESS_DELETE = "%s removed from the list";
+ 
+     public static final String HELP_MSG = "delete : Deletes an item from the packing list.\n" +
+             "\tExample: delete 1";
+ 
+ 
+     public DeleteCommand(int targetIndex) {
+         super(targetIndex);
+     }
+ 
+     @Override
+     public void execute(PackingList packingList) {
+         Item item = getTargetItem();
+         this.packingList = packingList;
+         packingList.deleteItem(item);
+         Ui.printToUser(String.format(MSG_SUCCESS_DELETE, item));
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-5.html b/htmlReport/ns-2/sources/source-5.html new file mode 100644 index 0000000000..96de9e160f --- /dev/null +++ b/htmlReport/ns-2/sources/source-5.html @@ -0,0 +1,123 @@ + + + + + + + Coverage Report > DeleteListCommand + + + + + + +
+ + +

Coverage Summary for Class: DeleteListCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.iohandler.Ui;
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ import java.util.ArrayList;
+ 
+ public class DeleteListCommand extends Command {
+     public static final String MSG_SUCCESS_DELETE_LIST = "list deleted";
+     @Override
+     public void execute(PackingList packingList) {
+         ArrayList< Item > emptyList = new ArrayList<>();
+         packingList.setItemList(emptyList);
+         Ui.printToUser(String.format(MSG_SUCCESS_DELETE_LIST));
+     }
+ 
+ 
+ 
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-6.html b/htmlReport/ns-2/sources/source-6.html new file mode 100644 index 0000000000..b70f35f966 --- /dev/null +++ b/htmlReport/ns-2/sources/source-6.html @@ -0,0 +1,114 @@ + + + + + + + Coverage Report > HelpCommand + + + + + + +
+ + +

Coverage Summary for Class: HelpCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.iohandler.Ui;
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class HelpCommand extends Command {
+     @Override
+     public void execute(PackingList packingList) {
+         Ui.helpMessage();
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-7.html b/htmlReport/ns-2/sources/source-7.html new file mode 100644 index 0000000000..83bceac5fe --- /dev/null +++ b/htmlReport/ns-2/sources/source-7.html @@ -0,0 +1,121 @@ + + + + + + + Coverage Report > IncorrectCommand + + + + + + +
+ + +

Coverage Summary for Class: IncorrectCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.iohandler.Ui;
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class IncorrectCommand extends Command {
+     private final String errorType;
+     private final String helpMessage;
+     public IncorrectCommand(String errorType, String helpMessage) {
+         this.helpMessage = helpMessage;
+         this.errorType = errorType;
+     }
+ 
+     @Override
+     public void execute(PackingList packingList) {
+         Ui.errorMessage(errorType, helpMessage);
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-8.html b/htmlReport/ns-2/sources/source-8.html new file mode 100644 index 0000000000..018264b8a8 --- /dev/null +++ b/htmlReport/ns-2/sources/source-8.html @@ -0,0 +1,136 @@ + + + + + + + Coverage Report > ListCommand + + + + + + +
+ + +

Coverage Summary for Class: ListCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class ListCommand extends Command {
+     public static final String HELP_MSG = "list : List all items in packing list.\n" +
+             "\tExample: list";
+ 
+     @Override
+     public void execute(PackingList packingList) {
+ 
+         if (packingList.size() == 0) {
+             System.out.println("____________________________________________________________");
+             System.out.println("There are no items in your list. What would you like to add?");
+             System.out.println("____________________________________________________________");
+             return;
+         }
+ 
+         System.out.println("____________________________________________________________");
+         System.out.println("Here are the items in your list");
+         for (int i = 0; i < packingList.size(); i++) {
+             String isItemPacked;
+             if (packingList.get(i).getIsPacked()) {
+                 isItemPacked = "X";
+             } else {
+                 isItemPacked = " ";
+             }
+             String itemName = packingList.get(i).getItemName();
+             System.out.println((i + 1) + ". [" + isItemPacked + "] " + itemName);
+         }
+         System.out.println("____________________________________________________________");
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-9.html b/htmlReport/ns-2/sources/source-9.html new file mode 100644 index 0000000000..bd5bf915e3 --- /dev/null +++ b/htmlReport/ns-2/sources/source-9.html @@ -0,0 +1,132 @@ + + + + + + + Coverage Report > PackCommand + + + + + + +
+ + +

Coverage Summary for Class: PackCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.iohandler.Ui;
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class PackCommand extends Command {
+ 
+     public static final String MSG_SUCCESS_PACK = "Item packed: %s";
+     public static final String HELP_MSG= "pack : Marks an item as packed in the packing list.\n" +
+             "\tExample: pack 2 of 3\n" +
+             "\tMeaning: packs 2 quantities of the third item in the packing list";
+ 
+ 
+     public PackCommand(int targetIndex) {
+         super(targetIndex);
+         assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()):
+                 "Pack Command Target index is out of bounds";
+     }
+ 
+     @Override
+     public void execute(PackingList packingList) {
+         this.packingList = packingList;
+         final Item item = getTargetItem();
+         packingList.packItem(item);
+         Ui.printToUser(String.format(MSG_SUCCESS_PACK, item));
+     }
+ 
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-a.html b/htmlReport/ns-2/sources/source-a.html new file mode 100644 index 0000000000..b9a404405b --- /dev/null +++ b/htmlReport/ns-2/sources/source-a.html @@ -0,0 +1,132 @@ + + + + + + + Coverage Report > UnpackCommand + + + + + + +
+ + +

Coverage Summary for Class: UnpackCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.iohandler.Ui;
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class UnpackCommand extends Command {
+ 
+     public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s";
+     public static final String HELP_MSG = "unpack : Marks an item as unpacked in the packing list.\n" +
+             "\tExample: unpack 1 of 2\n" +
+             "\tMeaning: unpacks 1 quantity of the second item in the packing list";
+ 
+ 
+     public UnpackCommand(int targetIndex) {
+         super(targetIndex);
+         assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()):
+                 "Unpack Command Target index is out of bounds";
+     }
+ 
+     @Override
+     public void execute(PackingList packingList) {
+         this.packingList = packingList;
+         final Item item = getTargetItem();
+         packingList.unpackItem(item);
+         Ui.printToUser(String.format(MSG_SUCCESS_UNPACK, item));
+     }
+ 
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-3/index.html b/htmlReport/ns-3/index.html new file mode 100644 index 0000000000..36dee51fc1 --- /dev/null +++ b/htmlReport/ns-3/index.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_BLOCK.html b/htmlReport/ns-3/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..5b83a3c419 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_BLOCK.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..5db7b52aed --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_CLASS.html b/htmlReport/ns-3/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..d7d31252cc --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_CLASS.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..0ff385f822 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_LINE.html b/htmlReport/ns-3/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..f4b3bf8c23 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_LINE.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..ed2b362c58 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_METHOD.html b/htmlReport/ns-3/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..3a4a081e27 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_METHOD.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..d056cdfbca --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..c8492bc39a --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/sources/source-1.html b/htmlReport/ns-3/sources/source-1.html new file mode 100644 index 0000000000..a31ff393e5 --- /dev/null +++ b/htmlReport/ns-3/sources/source-1.html @@ -0,0 +1,107 @@ + + + + + + + Coverage Report > EmptyInputException + + + + + + +
+ + +

Coverage Summary for Class: EmptyInputException (bagpacker.exception)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
+ +
+
+ + +
+ package bagpacker.exception;
+ 
+ public class EmptyInputException extends Exception {
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-3/sources/source-2.html b/htmlReport/ns-3/sources/source-2.html new file mode 100644 index 0000000000..4e140a50ca --- /dev/null +++ b/htmlReport/ns-3/sources/source-2.html @@ -0,0 +1,109 @@ + + + + + + + Coverage Report > InvalidIndexException + + + + + + +
+ + +

Coverage Summary for Class: InvalidIndexException (bagpacker.exception)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+
+ + +
+ package bagpacker.exception;
+ 
+ 
+ 
+ public class InvalidIndexException extends Exception{
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-3/sources/source-3.html b/htmlReport/ns-3/sources/source-3.html new file mode 100644 index 0000000000..9b1c617f02 --- /dev/null +++ b/htmlReport/ns-3/sources/source-3.html @@ -0,0 +1,109 @@ + + + + + + + Coverage Report > InvalidVariablesException + + + + + + +
+ + +

Coverage Summary for Class: InvalidVariablesException (bagpacker.exception)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+
+ + +
+ package bagpacker.exception;
+ 
+ 
+ 
+ public class InvalidVariablesException extends Exception{
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-4/index.html b/htmlReport/ns-4/index.html new file mode 100644 index 0000000000..46c9400c9f --- /dev/null +++ b/htmlReport/ns-4/index.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_BLOCK.html b/htmlReport/ns-4/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..a8b23638a0 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_BLOCK.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..8d7952a689 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_CLASS.html b/htmlReport/ns-4/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..877a227206 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_CLASS.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..d183363c6e --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_LINE.html b/htmlReport/ns-4/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..a81d99fbcf --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_LINE.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..87ea674440 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_METHOD.html b/htmlReport/ns-4/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..62128c29bc --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_METHOD.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..27d543fa78 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..ffaf46bfb6 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/sources/source-1.html b/htmlReport/ns-4/sources/source-1.html new file mode 100644 index 0000000000..5e9d2fe411 --- /dev/null +++ b/htmlReport/ns-4/sources/source-1.html @@ -0,0 +1,405 @@ + + + + + + + Coverage Report > Parser + + + + + + +
+ + +

Coverage Summary for Class: Parser (bagpacker.iohandler)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
+ +
+
+ + +
+ package bagpacker.iohandler;
+ 
+ 
+ import bagpacker.commands.AddCommand;
+ import bagpacker.commands.ByeCommand;
+ import bagpacker.commands.Command;
+ import bagpacker.commands.DeleteCommand;
+ import bagpacker.commands.DeleteListCommand;
+ import bagpacker.commands.HelpCommand;
+ import bagpacker.commands.IncorrectCommand;
+ import bagpacker.commands.ListCommand;
+ import bagpacker.commands.PackCommand;
+ import bagpacker.commands.UnpackCommand;
+ import bagpacker.exception.EmptyInputException;
+ import bagpacker.exception.InvalidIndexException;
+ import bagpacker.exception.InvalidVariablesException;
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ import java.util.ArrayList;
+ import java.util.Arrays;
+ import java.util.Scanner;
+ 
+ /**
+  * Parser class contains methods to manipulate user input
+  */
+ public class Parser {
+     private static ArrayList<String> inputStringArray;
+     private static String fullInput;
+ 
+     public static void setFullInput(String fullInput) {
+         Parser.fullInput = fullInput;
+     }
+ 
+     /**
+      * Returns the user input in String format
+      */
+     public static String getFullInput() {
+         return fullInput;
+     }
+ 
+     /**
+      * Returns the user input as in array format
+      */
+     public static ArrayList<String> getInputStringArray() {
+         return inputStringArray;
+     }
+ 
+     public static void setInputStringArray(String[] inputStringArray) {
+         Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray));
+     }
+ 
+     public static Command parse() {
+         String inputLine = "";
+         while (inputLine.isEmpty()) {
+             try {
+                 inputLine = readLine().trim();
+             } catch (EmptyInputException e) {
+                 Ui.errorMessage("Empty input received",
+                         "try to input a command, to view all commands input 'help'");
+             }
+         }
+         setFullInput(inputLine);
+         String[] inputStringList = inputLine.split(" ");
+         setInputStringArray(inputStringList);
+         switch (inputStringList[0]) {
+         case "add":
+             return createAddObj();
+         case "delete":
+             return createDeleteObj();
+         case "pack":
+             return createPackObj();
+         case "unpack":
+             return createUnpackObj();
+         case "list":
+             return listCommand();
+         case "help":
+             return createHelpObj();
+         case "deletelist":
+             return createDeletelistObj();
+         case "bye":
+             return createByeObj();
+         default:
+             return new IncorrectCommand("'" + Parser.getCommand() + "' is an invalid User Command",
+                     "input 'help' to receive all valid commands");
+         }
+     }
+     /**
+      * Reads and returns the full user input from the command line interface
+      * - trims the leading and trailing white spaces
+      *
+      * @return inputLine the String input of the user
+      * @throws EmptyInputException when user input empty line
+      */
+     public static String readLine() throws EmptyInputException {
+         String inputLine;
+         Scanner in = new Scanner(System.in);
+         inputLine = in.nextLine().trim();
+         if (inputLine.isEmpty()) {
+             throw new EmptyInputException();
+         }
+         return inputLine;
+     }
+ 
+     /**
+      * Returns the user command in lower case
+      *
+      * @return command from user
+      */
+     public static String getCommand() {
+         String command = getInputStringArray().get(0).toLowerCase();
+         return command;
+     }
+ 
+     /**
+      * Returns a string which represents the name of the item from the user input
+      *
+      * @return inputVariables which is the name of the item
+      * @throws InvalidVariablesException when the item name cannot be found
+      */
+     public static String getItemName() throws InvalidVariablesException {
+         String itemName;
+         if (inputStringArray.size() <= 1) {
+             throw new InvalidVariablesException();
+         }
+         try {
+             int itemIndStart = fullInput.indexOf(" ") + 1;
+             itemName = fullInput.substring(itemIndStart);
+         } catch (IndexOutOfBoundsException e) {
+             throw new InvalidVariablesException();
+         }
+         return itemName;
+     }
+ 
+     /**
+      * Returns a string which represents the index of the item from the user input
+      *
+      * @return inputIndex which is the item index of the item in packing list
+      * @throws InvalidIndexException when the item index is not valid
+      */
+     public static String getItemIndex() throws InvalidIndexException {
+         String inputIndex;
+         int itemIndex;
+         if (inputStringArray.size() != 2) {
+             throw new InvalidIndexException();
+         }
+         try {
+             int itemIndStart = fullInput.indexOf(" ") + 1;
+             inputIndex = fullInput.substring(itemIndStart);
+             itemIndex = Integer.parseInt(inputIndex);
+             if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) {
+                 throw new InvalidIndexException();
+             }
+         } catch (IndexOutOfBoundsException | NumberFormatException e) {
+             throw new InvalidIndexException();
+         }
+         return inputIndex;
+     }
+     /**
+      * Returns a string which represents the relevant variable depending on the command
+      * - "add" will return the item name
+      * - "delete", "pack", "unpack" will return item index
+      *
+      * @param command used to determine the type of variable to return
+      * @return itemVariable which is the index OR name of the item in packing list
+      * @throws InvalidIndexException when the item index is not valid
+      */
+     public static String getVariable(String command) throws InvalidVariablesException, InvalidIndexException {
+         String itemVariable;
+         try {
+             if (command.equals("add")) {
+                 itemVariable = getItemName();
+             } else {
+                 itemVariable = getItemIndex();
+             }
+         } catch (InvalidVariablesException e) {
+             throw new InvalidVariablesException();
+         } catch (InvalidIndexException e) {
+             throw new InvalidIndexException();
+         }
+         return itemVariable;
+     }
+ 
+ 
+     /**
+      * Returns the user item description
+      */
+     public static String getItemDescrip() {
+         //String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length);
+         int indexItemName = getFullInput().indexOf("i/") + 2;
+         return getFullInput().substring(indexItemName).trim();
+     }
+ 
+ 
+     /**
+      * Attempts to create AddCommand object to be executed where it is called from
+      *
+      * @return AddCommand the command to be executed to add an item to the packing list, else
+      *      an IncorrectCommand is created to be executed
+      */
+     public static Command createAddObj() {
+         try {
+             String itemName = getVariable("add");
+             return new AddCommand(new Item(itemName));
+         } catch (InvalidVariablesException e) {
+             return new IncorrectCommand("Invalid Item Name",
+                     "try to input a name (word(s)) to be added into the list");
+         } catch (InvalidIndexException e) {
+             return new IncorrectCommand("Invalid Item Index",
+                     "try to input an integer number between 1 and " + PackingList.getItemList().size());
+         }
+     }
+ 
+     /**
+      * Attempts to create DeleteCommand object to be executed where it is called from
+      *
+      * @return DeleteCommand the command to be executed to delete an item to the packing list, else
+      *      an IncorrectCommand is created to be executed
+      */
+     public static Command createDeleteObj() {
+         try {
+             String itemIndex = getVariable("delete");
+             return new DeleteCommand(Integer.parseInt(itemIndex));
+         } catch (InvalidVariablesException e) {
+             return new IncorrectCommand("Invalid Item Name",
+                     "Try to input a name (word(s)) to be added into the list");
+         } catch (InvalidIndexException e) {
+             if (PackingList.getItemList().size() == 0) {
+                 return new IncorrectCommand("Invalid Item Index",
+                         "Your packing list is empty, there is nothing to delete");
+             } else {
+                 return new IncorrectCommand("Invalid Item Index",
+                         "Try to input an integer number between 1 and " + PackingList.getItemList().size());
+             }
+         }
+     }
+ 
+     /**
+      * Attempts to create PackCommand object to be executed where it is called from
+      *
+      * @return PackCommand the command to be executed to Pack an item in the packing list, else
+      *      an IncorrectCommand is created to be executed
+      */
+     public static Command createPackObj() {
+         try {
+             String itemIndex = getVariable("pack");
+             return new PackCommand(Integer.parseInt(itemIndex));
+         } catch (InvalidVariablesException e) {
+             return new IncorrectCommand("Invalid Item Name",
+                     "try to input a name (word(s)) to be added into the list");
+         } catch (InvalidIndexException e) {
+             if (PackingList.getItemList().size() == 0) {
+                 return new IncorrectCommand("Invalid Item Index",
+                         "Your packing list is empty, there is nothing to pack");
+             } else {
+                 return new IncorrectCommand("Invalid Item Index",
+                         "Try to input an integer number between 1 and " + PackingList.getItemList().size());
+             }
+         }
+     }
+ 
+ 
+     /**
+      * Attempts to create UnpackCommand object to be executed where it is called from
+      *
+      * @return UnpackCommand the command to be executed to unpack an item in the packing list, else
+      *      an IncorrectCommand is created to be executed
+      */
+     public static Command createUnpackObj() {
+         try {
+             String itemIndex = getVariable("unpack");
+             return new UnpackCommand(Integer.parseInt(itemIndex));
+         } catch (InvalidVariablesException e) {
+             return new IncorrectCommand("Invalid Item Name",
+                     "try to input a name (word(s)) to be added into the list");
+         } catch (InvalidIndexException e) {
+             if (PackingList.getItemList().size() == 0) {
+                 return new IncorrectCommand("Invalid Item Index",
+                         "Your packing list is empty, there is nothing to unpack");
+             } else {
+                 return new IncorrectCommand("Invalid Item Index",
+                         "Try to input an integer number between 1 and " + PackingList.getItemList().size());
+             }
+         }
+     }
+ 
+     public static Command listCommand() {
+         return new ListCommand();
+     }
+ 
+     public static Command createDeletelistObj() {
+         return new DeleteListCommand();
+     }
+ 
+     private static Command createHelpObj() {
+         return new HelpCommand();
+     }
+ 
+     private static Command createByeObj() {
+         return new ByeCommand();
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-4/sources/source-2.html b/htmlReport/ns-4/sources/source-2.html new file mode 100644 index 0000000000..649809b739 --- /dev/null +++ b/htmlReport/ns-4/sources/source-2.html @@ -0,0 +1,150 @@ + + + + + + + Coverage Report > Storage + + + + + + +
+ + +

Coverage Summary for Class: Storage (bagpacker.iohandler)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
+ +
+
+ + +
+ package bagpacker.iohandler;
+ 
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ import java.io.File;
+ import java.io.FileNotFoundException;
+ import java.io.FileWriter;
+ import java.io.IOException;
+ import java.util.ArrayList;
+ import java.util.Scanner;
+ 
+ /**
+  * Storage class contains methods to save and retrieve saved packing list in txt file
+  */
+ public class Storage {
+ 
+     public static ArrayList<Item> packingList = new ArrayList<>();
+     private static final String FILE_PATH = "packingList.txt";
+     public static void load() throws FileNotFoundException {
+         Scanner reader = new Scanner(new File(FILE_PATH));
+         String line;
+         while (reader.hasNext()) {
+             line = reader.nextLine();
+             boolean isPacked = line.charAt(1) == 'X';
+             String itemDesc = line.substring(4);
+             Item item = new Item(itemDesc, isPacked);
+             PackingList.getItemList().add(item);
+         }
+     }
+ 
+     public static void save() {
+         try {
+             writeToFile();
+         } catch (IOException e) {
+             System.out.println("Something went wrong: " + e.getMessage());
+         }
+     }
+ 
+     public static void writeToFile() throws IOException {
+         FileWriter fw = new FileWriter(FILE_PATH);
+         ArrayList<Item> packingList = PackingList.getItemList();
+         for (int i = 0; i < packingList.size(); i++) {
+             fw.write(packingList.get(i).toString() + "\n");
+         }
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-4/sources/source-3.html b/htmlReport/ns-4/sources/source-3.html new file mode 100644 index 0000000000..6e0a65b9c6 --- /dev/null +++ b/htmlReport/ns-4/sources/source-3.html @@ -0,0 +1,188 @@ + + + + + + + Coverage Report > Ui + + + + + + +
+ + +

Coverage Summary for Class: Ui (bagpacker.iohandler)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
+ +
+
+ + +
+ package bagpacker.iohandler;
+ 
+ import bagpacker.commands.AddCommand;
+ import bagpacker.commands.ByeCommand;
+ import bagpacker.commands.DeleteCommand;
+ import bagpacker.commands.ListCommand;
+ import bagpacker.commands.PackCommand;
+ import bagpacker.commands.UnpackCommand;
+ 
+ /**
+  * Ui class contains methods to print messages to user interface on Command Line Interface
+  */
+ public class Ui {
+     public static String logo = " ____              _____           _\n"
+             + "|  _ \\            |  __ \\         | |\n"
+             + "| |_) | __ _  __ _| |__) |_ _  ___| | _____ _ __\n"
+             + "|  _ < / _` |/ _` |  ___/ _` |/ __| |/ / _ \\ '__|\n"
+             + "| |_) | (_| | (_| | |  | (_| | (__|   <  __/ |\n"
+             + "|____/ \\__,_|\\__, |_|   \\__,_|\\___|_|\\_\\___|_|\n"
+             + "              __/ |\n"
+             + "             |___/\n";
+     public static void printErrorLine() {
+         System.out.println("/////////////////////////////////////////////////////////////");
+     }
+     public static void printLine() {
+         System.out.println("____________________________________________________________");
+     }
+     /**
+      * Prints initialising Message
+      */
+     public static void initialMessage(){
+         printLine();
+         System.out.println("Hi this is,\n" + logo);
+         System.out.println("Enter \"help\" to find out how to use BagPacker");
+         printLine();
+     }
+     /**
+      * Prints goodbye Message
+      */
+     public static void goodbyeMessage(){
+         printLine();
+         System.out.println("Bye thanks for using,\n" + logo);
+         printLine();
+     }
+ 
+     /**
+      * Prints Error Message with the type of error and a helping message
+      *
+      * @param errorType the type of error (e.g. invalid integer input)
+      * @param helpMessage a message to help the user (e.g. try to input a whole number digit)
+      */
+     public static void errorMessage(String errorType, String helpMessage) {
+         printErrorLine();
+         System.out.print("Error " + errorType);
+         System.out.println(":\n" + helpMessage);
+         printErrorLine();
+     }
+ 
+     /**
+      * Prints help message
+      */
+     public static void helpMessage() {
+         printLine();
+         System.out.println("All Commands:");
+         System.out.println("1. " + AddCommand.HELP_MSG);
+         System.out.println("2. " + DeleteCommand.HELP_MSG);
+         System.out.println("3. " + ListCommand.HELP_MSG);
+         System.out.println("4. " + PackCommand.HELP_MSG);
+         System.out.println("5. " + UnpackCommand.HELP_MSG);
+         System.out.println("6. " + ByeCommand.HELP_MSG);
+         printLine();
+     }
+ 
+     /**
+      * Prints messages(s) to the user
+      * @param message
+      */
+     public static void printToUser(String... message) {
+         printLine();
+         for (String m : message) {
+             System.out.println(m);
+         }
+         printLine();
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-5/index.html b/htmlReport/ns-5/index.html new file mode 100644 index 0000000000..61f2ed891e --- /dev/null +++ b/htmlReport/ns-5/index.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_BLOCK.html b/htmlReport/ns-5/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..42ec636ef3 --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_BLOCK.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..b2f5919e43 --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_CLASS.html b/htmlReport/ns-5/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..bf3a74a10a --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_CLASS.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..8e4a259e09 --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_LINE.html b/htmlReport/ns-5/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..6320646c0a --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_LINE.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..9edfa3195f --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_METHOD.html b/htmlReport/ns-5/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..8bb3ac70ae --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_METHOD.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..ec066fb29c --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..b74ed76353 --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/sources/source-1.html b/htmlReport/ns-5/sources/source-1.html new file mode 100644 index 0000000000..f637c89821 --- /dev/null +++ b/htmlReport/ns-5/sources/source-1.html @@ -0,0 +1,144 @@ + + + + + + + Coverage Report > Item + + + + + + +
+ + +

Coverage Summary for Class: Item (bagpacker.packingfunc)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
+ +
+
+ + +
+ package bagpacker.packingfunc;
+ /**
+  * Item class used to store information about item
+  * Items to be packed can be saved in PackingList class
+  */
+ public class Item {
+     private String itemName;
+     private boolean isPacked;
+     private String packIcon = " ";
+     public Item(String description) {
+         this.itemName = description;
+         isPacked = false;
+     }
+     public Item(String description, boolean isPacked) {
+         this.itemName = description;
+         this.isPacked = isPacked;
+     }
+     public void setPackIcon() {
+         if (this.isPacked) {
+             this.packIcon = "X";
+         } else {
+             this.packIcon = " ";
+         }
+     }
+ 
+     public String getItemName() {
+         return itemName;
+     }
+ 
+     public boolean getIsPacked() {
+         return isPacked;
+     }
+     public void setPacked(boolean packed) {
+         isPacked = packed;
+         setPackIcon();
+     }
+ 
+     public String toString() {
+         return "[" + this.packIcon + "] " + this.getItemName();
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-5/sources/source-2.html b/htmlReport/ns-5/sources/source-2.html new file mode 100644 index 0000000000..b74c31ec91 --- /dev/null +++ b/htmlReport/ns-5/sources/source-2.html @@ -0,0 +1,169 @@ + + + + + + + Coverage Report > PackingList + + + + + + +
+ + +

Coverage Summary for Class: PackingList (bagpacker.packingfunc)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
+ +
+
+ + +
+ package bagpacker.packingfunc;
+ 
+ import java.util.ArrayList;
+ 
+ /**
+  * PackingList class contains methods to manipulate the users packing list
+  */
+ public class PackingList {
+ 
+ 
+     private static ArrayList<Item> itemList = new ArrayList<>();
+ 
+     private static int targetIndex = -1;
+     public static void setItemList(ArrayList<Item> itemList) {
+         PackingList.itemList = itemList;
+     }
+ 
+     /**
+      * Getter for itemList
+      *
+      * @return list of items
+      */
+     public static ArrayList<Item> getItemList() {
+         return itemList;
+     }
+     /**
+      * Adds an item to the list.
+      */
+     public void addItem(Item toAdd) {
+         itemList.add(toAdd);
+     }
+ 
+     /**
+      * Removes an item from the list.
+      */
+     public void deleteItem(Item toDelete) {
+         itemList.remove(toDelete);
+     }
+ 
+     /**
+      * Marks an item as packed in the list.
+      */
+     public void packItem(Item toPack) {
+         toPack.setPacked(true);
+     }
+ 
+     /**
+      * Marks an item as unpacked in the list.
+      */
+     public void unpackItem(Item toPack) {
+         toPack.setPacked(false);
+     }
+ 
+     public static Item get(int targetIndex) {
+         return itemList.get(targetIndex);
+     }
+ 
+     /**
+      * Returns size of packing list
+      */
+     public int size(){
+         return itemList.size();
+     }
+ 
+ 
+ }
+
+
+
+ + + + + + diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 28eed17a8d..fb06b8c5f5 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -32,6 +32,13 @@ public static void setFullInput(String fullInput) { Parser.fullInput = fullInput; } + /** + * Returns the user input in String format + */ + public static String getFullInput() { + return fullInput; + } + /** * Returns the user input as in array format */ @@ -43,27 +50,20 @@ public static void setInputStringArray(String[] inputStringArray) { Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray)); } - /** - * Returns the user input in String format - */ - public static String getFullInput() { - return fullInput; - } - public static Command parse() { String inputLine = ""; while (inputLine.isEmpty()) { try { - inputLine = readLine(); + inputLine = readLine().trim(); } catch (EmptyInputException e) { Ui.errorMessage("Empty input received", "try to input a command, to view all commands input 'help'"); } } setFullInput(inputLine); - String[] inputStringList = inputLine.trim().split(" "); + String[] inputStringList = inputLine.split(" "); setInputStringArray(inputStringList); - switch (inputStringList[0]) { + switch (getCommand()) { case "add": return createAddObj(); case "delete": @@ -73,7 +73,7 @@ public static Command parse() { case "unpack": return createUnpackObj(); case "list": - return listCommand(); + return createListObj(); case "help": return createHelpObj(); case "deletelist": @@ -92,7 +92,7 @@ public static Command parse() { * @return inputLine the String input of the user * @throws EmptyInputException when user input empty line */ - private static String readLine() throws EmptyInputException { + public static String readLine() throws EmptyInputException { String inputLine; Scanner in = new Scanner(System.in); inputLine = in.nextLine().trim(); @@ -284,7 +284,7 @@ public static Command createUnpackObj() { } } - public static Command listCommand() { + public static Command createListObj() { return new ListCommand(); } diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index 2f28ce9495..4c53a4425d 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -1,14 +1,154 @@ package bagpacker.iohandlertest; + +import bagpacker.commands.AddCommand; +import bagpacker.commands.ByeCommand; +import bagpacker.commands.DeleteCommand; +import bagpacker.commands.HelpCommand; +import bagpacker.commands.IncorrectCommand; +import bagpacker.commands.ListCommand; +import bagpacker.commands.PackCommand; +import bagpacker.commands.UnpackCommand; +import bagpacker.exception.EmptyInputException; +import bagpacker.exception.InvalidIndexException; +import bagpacker.exception.InvalidVariablesException; +import bagpacker.iohandler.Parser; +import bagpacker.packingfunc.PackingList; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * ParserTest to test Parser Class */ public class ParserTest { @Test - public void sampleTest() { - assertTrue(true); + public void fullInputTest() { + String userInput = " add this item "; + InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inStream); + Parser.parse(); + assertEquals(userInput.trim(), Parser.getFullInput()); + } + + @Test + public void addCommandTest() { + String userInput = " add this item "; + InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inStream); + assertEquals(AddCommand.class, Parser.parse().getClass()); + } + + @Test + public void emptyInputTest() { + String userInput = " "; + InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inStream); + Exception exception = assertThrows(EmptyInputException.class, Parser::readLine); + assertEquals(EmptyInputException.class, exception.getClass()); + } + + @Test + public void addVariableTest() throws InvalidIndexException, InvalidVariablesException { + String userInput = " add this item 1 "; + InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inStream); + Parser.parse(); + assertEquals("this item 1", Parser.getVariable(Parser.getCommand())); + } + + @Test + public void deleteCommandTest() { + String userInput1 = " add this item "; + String userInput2 = " delete 1 "; + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + PackingList dummyPackingList = new PackingList(); + Parser.parse().execute(dummyPackingList); + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + assertEquals(DeleteCommand.class, Parser.parse().getClass()); + } + + @Test + public void PackCommandTest() { + String userInput1 = " add this item "; + String userInput2 = " pack 1 "; + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + PackingList dummyPackingList = new PackingList(); + Parser.parse().execute(dummyPackingList); + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + assertEquals(PackCommand.class, Parser.parse().getClass()); + } + + @Test + public void UnpackCommandTest() { + String userInput1 = " add this item "; + String userInput2 = " pack 1 "; + String userInput3 = " Unpack 1 "; + PackingList dummyPackingList = new PackingList(); + + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + Parser.parse().execute(dummyPackingList); + + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + Parser.parse().execute(dummyPackingList); + + inStream = new ByteArrayInputStream(userInput3.getBytes()); + System.setIn(inStream); + assertEquals(UnpackCommand.class, Parser.parse().getClass()); + } + + @Test + public void listCommandTest() { + String userInput1 = " add this item "; + String userInput2 = " lIST "; + PackingList dummyPackingList = new PackingList(); + + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + Parser.parse().execute(dummyPackingList); + + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + + assertEquals(ListCommand.class, Parser.parse().getClass()); + } + @Test + public void helpCommandTest() { + String userInput1 = " HelP "; + + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + + assertEquals(HelpCommand.class, Parser.parse().getClass()); + } + + @Test + public void byeCommandTest() { + String userInput1 = " byE "; + + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + + assertEquals(ByeCommand.class, Parser.parse().getClass()); } + @Test + public void invalidCommandTest() { + String userInput1 = " thisIsNOTaVALID command "; + + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + + assertEquals(IncorrectCommand.class, Parser.parse().getClass()); + } } + diff --git a/src/test/java/bagpacker/packingfunctest/CommandsTest.java b/src/test/java/bagpacker/packingfunctest/CommandsTest.java index 88ef7ab2f7..68ed169de8 100644 --- a/src/test/java/bagpacker/packingfunctest/CommandsTest.java +++ b/src/test/java/bagpacker/packingfunctest/CommandsTest.java @@ -17,12 +17,12 @@ public void sampleTest() { assertTrue(true); } - @Test + /*@Test public void testAddCommand() { PackingList packingList = new PackingList(); - Item item = new Item("toothbrush"); - Command addCommand = new AddCommand(item); - addCommand.execute(packingList); + Item itemOne = new Item("toothbrush"); + Command addObj = new AddCommand(itemOne); + addObj.execute(packingList); // Expect a Packinglist with a toothbrush item in first index Assertions.assertEquals("toothbrush",packingList.get(0).getItemName()); @@ -30,12 +30,12 @@ public void testAddCommand() { // Expect second index item in the packing list to be toothpaste Item itemTwo = new Item("toothpaste"); - addCommand = new AddCommand(itemTwo); - addCommand.execute(packingList); + addObj = new AddCommand(itemTwo); + addObj.execute(packingList); Assertions.assertEquals("toothpaste",packingList.get(1).getItemName()); Assertions.assertNotEquals("toothbrush", packingList.get(1).getItemName()); - } + }*/ } From ca8f3773abd506fd3c2b73368944b9379200dd72 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 23 Mar 2023 23:25:37 +0800 Subject: [PATCH 053/207] Refactor Junit testing classes --- src/test/java/bagpacker/iohandlertest/ParserTest.java | 4 ++-- src/test/java/bagpacker/packingfunctest/CommandsTest.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index 4c53a4425d..8cf3f214e4 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -74,7 +74,7 @@ public void deleteCommandTest() { } @Test - public void PackCommandTest() { + public void packCommandTest() { String userInput1 = " add this item "; String userInput2 = " pack 1 "; InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); @@ -87,7 +87,7 @@ public void PackCommandTest() { } @Test - public void UnpackCommandTest() { + public void unpackCommandTest() { String userInput1 = " add this item "; String userInput2 = " pack 1 "; String userInput3 = " Unpack 1 "; diff --git a/src/test/java/bagpacker/packingfunctest/CommandsTest.java b/src/test/java/bagpacker/packingfunctest/CommandsTest.java index 68ed169de8..fe68438f88 100644 --- a/src/test/java/bagpacker/packingfunctest/CommandsTest.java +++ b/src/test/java/bagpacker/packingfunctest/CommandsTest.java @@ -1,10 +1,10 @@ package bagpacker.packingfunctest; - +/* import bagpacker.commands.AddCommand; import bagpacker.commands.Command; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; -import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Assertions;*/ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertTrue; From 8102845adeb08bc6e5869417351301d6d82cea81 Mon Sep 17 00:00:00 2001 From: coregano Date: Thu, 23 Mar 2023 23:39:29 +0800 Subject: [PATCH 054/207] Update Developer Guide Edit AddCommand constructor to use Item as argument Edit createAddObj method in Parser to accomodate above changes --- docs/DeveloperGuide.md | 35 +++++++++--------- docs/img_1.png | Bin 38579 -> 0 bytes docs/img_2.png | Bin 0 -> 58326 bytes .../java/bagpacker/commands/AddCommand.java | 4 +- src/main/java/bagpacker/iohandler/Parser.java | 8 +++- .../packingfunctest/CommandsTest.java | 5 ++- 6 files changed, 28 insertions(+), 24 deletions(-) delete mode 100644 docs/img_1.png create mode 100644 docs/img_2.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index dcb4e5a69b..8a04594970 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -22,23 +22,6 @@ Add command is used to add a quantity of item(s) to the packing list. Mechanism: ```AddCommand.execute()``` calls the ```PackingList.addItem()``` method from the ```PackingList``` class which executes the ```ArrayList.add()``` method to add the item to the ```PackingList``` ArrayList. It then updates the ```quantity``` variable according to the quantity inputted by the user. - -#### Preventing duplicate items - -When using the `add` function, we have decided to implement a passive function that checks whether the item with the same name already exists in the packingList. - -This is done through the `contains()` method in class `PackingList()`, which is called during `execute` in an `AddCommand` object. - -Below is the UML diagram showing what occurs during `add` function. -![img_1.png](img_1.png) -When `execute()` is called in `a`(object of class `AddCommand`), the `addItem(item)` method is called in the object `packingList`. This method will see if method `contains()` will return `true`. - -The `contains()` method, which is shown as a reference on the right of the UML diagram, is a boolean method that loops through all items in the packingList, and returns `true` if any of the existing items have the same description as the item to be added in `toAdd`, and `false` otherwise. - -When `contains()` returns `true`, method `addItem(item)` will be interrupted and a `DuplicateItemException` will be thrown from `packingList`, which will be caught by `a`. If `contains()` returns false, the item will be added onto `packingList`. - -In both scenarios, `ui.printToUser` will be called to print a message to the user. In the former case, `ExistItemError` will be printed, while `AddSuccess` will be shown if the item was added with no issues. - #### Delete Command Delete command is used to delete an item from the packing list. @@ -68,7 +51,6 @@ All Commands: 6. bye : Stops the BagPacker Application Example: bye ____________________________________________________________ - ``` #### Bye Command @@ -95,6 +77,23 @@ This will execute the ```setPacked()``` method to set the value of the boolean ` Mechanism: ```UnpackCommand.execute()``` calls the ```PackingList.unpackItem()``` method from the ```PackingList``` class. This will execute the ```setPacked``` method to set the value of the boolean ```isPacked``` to be ```false```, and mark the item as unpacked in the ```PackingList``` ArrayList. + +### [Proposed] No Duplicate Items #### Preventing duplicate items + +When using the `add` function, we have decided to implement a passive function that checks whether the item with the same name already exists in the packingList. + +This is done through the `contains()` method in class `PackingList()`, which is called during `execute` in an `AddCommand` object. + +Below is the UML diagram showing what occurs during `add` function. +![img_2.png](img_2.png) +When `execute()` is called in `a`(object of class `AddCommand`), the `addItem(item)` method is called in the object `packingList`. This method will see if method `contains()` will return `true`. + +The `contains()` method, which is shown as a reference on the right of the UML diagram, is a boolean method that loops through all items in the packingList, and returns `true` if any of the existing items have the same description as the item to be added in `toAdd`, and `false` otherwise. + +When `contains()` returns `true`, method `addItem(item)` will be interrupted and a `DuplicateItemException` will be thrown from `packingList`, which will be caught by `a`. If `contains()` returns false, the item will be added onto `packingList`. + +In both scenarios, `ui.printToUser` will be called to print a message to the user. In the former case, `ExistItemError` will be printed, while `AddSuccess` will be shown if the item was added with no issues. + ## Product scope ### Target user profile diff --git a/docs/img_1.png b/docs/img_1.png deleted file mode 100644 index 6899bf1bc9187a05077c7cf5c275153ce46b910a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38579 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 diff --git a/docs/img_2.png b/docs/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3547c40e03b029f822de6c197f22281795cf70f2 GIT binary patch literal 58326 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 VGg`~}XyhM`DWAk7A2#~ye*iphPA32W literal 0 HcmV?d00001 diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index 1c6b4b201b..1042555f35 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -11,8 +11,8 @@ public class AddCommand extends Command { private final Item item; - public AddCommand(int quantity, String description) { - this.item = new Item(quantity, description); + public AddCommand(Item item) { + this.item = item; } @Override diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 44f838d050..31f7c08f6e 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -12,6 +12,7 @@ import bagpacker.exception.EmptyInputException; import bagpacker.exception.InvalidIndexException; import bagpacker.exception.InvalidVariablesException; +import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; import java.util.Scanner; @@ -27,6 +28,10 @@ public static void setFullInput(String fullInput) { Parser.fullInput = fullInput; } + /** + * parses user input into relevant subclasses of Command for execution. + * @return command based on user input + */ public static Command parse() { arguments = new String[2]; String inputLine = ""; @@ -138,7 +143,7 @@ public static Command createAddObj() { String[] quantityAndDescription = getQuantityAndDescription(); int itemQuantity = Integer.parseInt((quantityAndDescription[0]).trim()); String itemDescription = quantityAndDescription[1].trim(); - return new AddCommand(itemQuantity, itemDescription); + return new AddCommand(new Item(itemQuantity, itemDescription)); } /** @@ -201,7 +206,6 @@ public static Command createPackObj() { } } - /** * Attempts to create UnpackCommand object to be executed where it is called from * diff --git a/src/test/java/bagpacker/packingfunctest/CommandsTest.java b/src/test/java/bagpacker/packingfunctest/CommandsTest.java index a6c07db09a..990b1bfe04 100644 --- a/src/test/java/bagpacker/packingfunctest/CommandsTest.java +++ b/src/test/java/bagpacker/packingfunctest/CommandsTest.java @@ -3,6 +3,7 @@ import bagpacker.commands.AddCommand; import bagpacker.commands.Command; //import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -20,7 +21,7 @@ public void sampleTest() { @Test public void testAddCommand() { PackingList packingList = new PackingList(); - Command addCommand = new AddCommand(1, "toothbrush"); + Command addCommand = new AddCommand(new Item(1, "toothbrush")); addCommand.execute(packingList); // Expect a Packinglist with a toothbrush item in first index @@ -29,7 +30,7 @@ public void testAddCommand() { // Expect second index item in the packing list to be toothpaste // Item itemTwo = new Item("toothpaste"); - addCommand = new AddCommand(1, "toothpaste"); + addCommand = new AddCommand(new Item(1, "toothpaste")); addCommand.execute(packingList); Assertions.assertEquals("toothpaste",packingList.get(1).getItemName()); From b3f53a9299179fe7769702bfb977ef7473b3a2e7 Mon Sep 17 00:00:00 2001 From: coregano Date: Fri, 24 Mar 2023 00:46:29 +0800 Subject: [PATCH 055/207] stash changes --- patch.diff | 982 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 982 insertions(+) create mode 100644 patch.diff diff --git a/patch.diff b/patch.diff new file mode 100644 index 0000000000..fd3836211a --- /dev/null +++ b/patch.diff @@ -0,0 +1,982 @@ +diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md +index 30cb13b..8a04594 100644 +--- a/docs/DeveloperGuide.md ++++ b/docs/DeveloperGuide.md +@@ -22,23 +22,6 @@ Add command is used to add a quantity of item(s) to the packing list. + Mechanism: ```AddCommand.execute()``` calls the ```PackingList.addItem()``` method from the ```PackingList``` class which executes the ```ArrayList.add()``` method to add the item to the ```PackingList``` ArrayList. + It then updates the ```quantity``` variable according to the quantity inputted by the user. + +- +-#### Preventing duplicate items +- +-When using the `add` function, we have decided to implement a passive function that checks whether the item with the same name already exists in the packingList. +- +-This is done through the `contains()` method in class `PackingList()`, which is called during `execute` in an `AddCommand` object. +- +-Below is the UML diagram showing what occurs during `add` function. +-![img_1.png](img_1.png) +-When `execute()` is called in `a`(object of class `AddCommand`), the `addItem(item)` method is called in the object `packingList`. This method will see if method `contains()` will return `true`. +- +-The `contains()` method, which is shown as a reference on the right of the UML diagram, is a boolean method that loops through all items in the packingList, and returns `true` if any of the existing items have the same description as the item to be added in `toAdd`, and `false` otherwise. +- +-When `contains()` returns `true`, method `addItem(item)` will be interrupted and a `DuplicateItemException` will be thrown from `packingList`, which will be caught by `a`. If `contains()` returns false, the item will be added onto `packingList`. +- +-In both scenarios, `ui.printToUser` will be called to print a message to the user. In the former case, `ExistItemError` will be printed, while `AddSuccess` will be shown if the item was added with no issues. +- + #### Delete Command + + Delete command is used to delete an item from the packing list. +@@ -68,7 +51,6 @@ All Commands: + 6. bye : Stops the BagPacker Application + Example: bye + ____________________________________________________________ +- + ``` + + #### Bye Command +@@ -91,9 +73,27 @@ This will execute the ```setPacked()``` method to set the value of the boolean ` + + #### Unpack Command + ```Unpack Command``` is used to mark an item in the list as unpacked. ++ + Mechanism: ```UnpackCommand.execute()``` calls the ```PackingList.unpackItem()``` method from the ```PackingList``` class. + This will execute the ```setPacked``` method to set the value of the boolean ```isPacked``` to be ```false```, and mark the item as unpacked in the ```PackingList``` ArrayList. + ++ ++### [Proposed] No Duplicate Items #### Preventing duplicate items ++ ++When using the `add` function, we have decided to implement a passive function that checks whether the item with the same name already exists in the packingList. ++ ++This is done through the `contains()` method in class `PackingList()`, which is called during `execute` in an `AddCommand` object. ++ ++Below is the UML diagram showing what occurs during `add` function. ++![img_2.png](img_2.png) ++When `execute()` is called in `a`(object of class `AddCommand`), the `addItem(item)` method is called in the object `packingList`. This method will see if method `contains()` will return `true`. ++ ++The `contains()` method, which is shown as a reference on the right of the UML diagram, is a boolean method that loops through all items in the packingList, and returns `true` if any of the existing items have the same description as the item to be added in `toAdd`, and `false` otherwise. ++ ++When `contains()` returns `true`, method `addItem(item)` will be interrupted and a `DuplicateItemException` will be thrown from `packingList`, which will be caught by `a`. If `contains()` returns false, the item will be added onto `packingList`. ++ ++In both scenarios, `ui.printToUser` will be called to print a message to the user. In the former case, `ExistItemError` will be printed, while `AddSuccess` will be shown if the item was added with no issues. ++ + ## Product scope + + ### Target user profile +diff --git a/docs/img_1.png b/docs/img_1.png +deleted file mode 100644 +index 6899bf1..0000000 +Binary files a/docs/img_1.png and /dev/null differ +diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java +index ce64d96..7fe2678 100644 +--- a/src/main/java/bagpacker/BagPacker.java ++++ b/src/main/java/bagpacker/BagPacker.java +@@ -8,6 +8,7 @@ import bagpacker.packingfunc.PackingList; + + public class BagPacker { + private static PackingList packingList; ++ + /** + * Main entry-point for the java.BagPacker application. + */ +diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java +index 3e73fc1..1042555 100644 +--- a/src/main/java/bagpacker/commands/AddCommand.java ++++ b/src/main/java/bagpacker/commands/AddCommand.java +@@ -7,7 +7,7 @@ import bagpacker.packingfunc.PackingList; + public class AddCommand extends Command { + public static final String MSG_SUCCESS_ADD = "New item added: %s"; + public static final String HELP_MSG = "add : Adds an item to the packing list.\n" + +- "\tExample: add toothbrush"; ++ "\tExample: add toothbrush"; + + private final Item item; + +diff --git a/src/main/java/bagpacker/commands/ByeCommand.java b/src/main/java/bagpacker/commands/ByeCommand.java +index 1da5969..b5616f2 100644 +--- a/src/main/java/bagpacker/commands/ByeCommand.java ++++ b/src/main/java/bagpacker/commands/ByeCommand.java +@@ -9,7 +9,8 @@ public class ByeCommand extends Command { + public static boolean isBagPackerRunning = true; + public static final String HELP_MSG = "bye : Stops the BagPacker Application\n" + + "\tExample: bye"; +- public void execute (PackingList packingList) { ++ ++ public void execute(PackingList packingList) { + this.isBagPackerRunning = false; + } + } +diff --git a/src/main/java/bagpacker/commands/Command.java b/src/main/java/bagpacker/commands/Command.java +index b3ce81b..967691f 100644 +--- a/src/main/java/bagpacker/commands/Command.java ++++ b/src/main/java/bagpacker/commands/Command.java +@@ -37,13 +37,12 @@ public abstract class Command { + return packingList.get(getTargetIndex() - 1); + } + +- + /** + * Executes the command which requires a packingList + * + * @param packingList used to execute the command + */ +- public void execute (PackingList packingList) { ++ public void execute(PackingList packingList) { + } + + } +diff --git a/src/main/java/bagpacker/commands/DeleteListCommand.java b/src/main/java/bagpacker/commands/DeleteListCommand.java +index ea4ea80..90992d8 100644 +--- a/src/main/java/bagpacker/commands/DeleteListCommand.java ++++ b/src/main/java/bagpacker/commands/DeleteListCommand.java +@@ -8,13 +8,11 @@ import java.util.ArrayList; + + public class DeleteListCommand extends Command { + public static final String MSG_SUCCESS_DELETE_LIST = "list deleted"; ++ + @Override + public void execute(PackingList packingList) { +- ArrayList< Item > emptyList = new ArrayList<>(); ++ ArrayList emptyList = new ArrayList<>(); + packingList.setItemList(emptyList); + Ui.printToUser(String.format(MSG_SUCCESS_DELETE_LIST)); + } +- +- +- + } +diff --git a/src/main/java/bagpacker/commands/IncorrectCommand.java b/src/main/java/bagpacker/commands/IncorrectCommand.java +index 4932cb1..038cec6 100644 +--- a/src/main/java/bagpacker/commands/IncorrectCommand.java ++++ b/src/main/java/bagpacker/commands/IncorrectCommand.java +@@ -6,6 +6,7 @@ import bagpacker.packingfunc.PackingList; + public class IncorrectCommand extends Command { + private final String errorType; + private final String helpMessage; ++ + public IncorrectCommand(String errorType, String helpMessage) { + this.helpMessage = helpMessage; + this.errorType = errorType; +diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java +index 279520a..bf66f3e 100644 +--- a/src/main/java/bagpacker/commands/ListCommand.java ++++ b/src/main/java/bagpacker/commands/ListCommand.java +@@ -19,14 +19,8 @@ public class ListCommand extends Command { + System.out.println("____________________________________________________________"); + System.out.println("Here are the items in your list"); + for (int i = 0; i < packingList.size(); i++) { +- String isItemPacked; +- if (packingList.get(i).getIsPacked()) { +- isItemPacked = "X"; +- } else { +- isItemPacked = " "; +- } +- String itemName = packingList.get(i).getItemName(); +- System.out.println((i + 1) + ". [" + isItemPacked + "] " + itemName); ++ System.out.print((i + 1) + ". "); ++ System.out.println(PackingList.get(i)); + } + System.out.println("____________________________________________________________"); + } +diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java +index fb7b0c8..5c8f69b 100644 +--- a/src/main/java/bagpacker/commands/PackCommand.java ++++ b/src/main/java/bagpacker/commands/PackCommand.java +@@ -7,14 +7,16 @@ import bagpacker.packingfunc.PackingList; + public class PackCommand extends Command { + + public static final String MSG_SUCCESS_PACK = "Item packed: %s"; +- public static final String HELP_MSG= "pack : Marks an item as packed in the packing list.\n" + ++ public static final String HELP_MSG = "pack : Marks an item as packed in the packing list.\n" + + "\tExample: pack 2 of 3\n" + + "\tMeaning: packs 2 quantities of the third item in the packing list"; + ++ private static int packQuantity; + +- public PackCommand(int targetIndex) { ++ public PackCommand(int quantity, int targetIndex) { + super(targetIndex); +- assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): ++ packQuantity = quantity; ++ assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : + "Pack Command Target index is out of bounds"; + } + +@@ -22,7 +24,7 @@ public class PackCommand extends Command { + public void execute(PackingList packingList) { + this.packingList = packingList; + final Item item = getTargetItem(); +- packingList.packItem(item); ++ packingList.packItem(item, packQuantity); + Ui.printToUser(String.format(MSG_SUCCESS_PACK, item)); + } + +diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java +deleted file mode 100644 +index 5e35bf0..0000000 +--- a/src/main/java/bagpacker/commands/UnpackCommand.java ++++ /dev/null +@@ -1,29 +0,0 @@ +-package bagpacker.commands; +- +-import bagpacker.iohandler.Ui; +-import bagpacker.packingfunc.Item; +-import bagpacker.packingfunc.PackingList; +- +-public class UnpackCommand extends Command { +- +- public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; +- public static final String HELP_MSG = "unpack : Marks an item as unpacked in the packing list.\n" + +- "\tExample: unpack 1 of 2\n" + +- "\tMeaning: unpacks 1 quantity of the second item in the packing list"; +- +- +- public UnpackCommand(int targetIndex) { +- super(targetIndex); +- assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): +- "Unpack Command Target index is out of bounds"; +- } +- +- @Override +- public void execute(PackingList packingList) { +- this.packingList = packingList; +- final Item item = getTargetItem(); +- packingList.unpackItem(item); +- Ui.printToUser(String.format(MSG_SUCCESS_UNPACK, item)); +- } +- +-} +diff --git a/src/main/java/bagpacker/exception/InvalidIndexException.java b/src/main/java/bagpacker/exception/InvalidIndexException.java +index c67a800..61268b2 100644 +--- a/src/main/java/bagpacker/exception/InvalidIndexException.java ++++ b/src/main/java/bagpacker/exception/InvalidIndexException.java +@@ -1,6 +1,4 @@ + package bagpacker.exception; + +- +- +-public class InvalidIndexException extends Exception{ ++public class InvalidIndexException extends Exception { + } +diff --git a/src/main/java/bagpacker/exception/InvalidVariablesException.java b/src/main/java/bagpacker/exception/InvalidVariablesException.java +index 428e531..163e70c 100644 +--- a/src/main/java/bagpacker/exception/InvalidVariablesException.java ++++ b/src/main/java/bagpacker/exception/InvalidVariablesException.java +@@ -1,6 +1,4 @@ + package bagpacker.exception; + +- +- +-public class InvalidVariablesException extends Exception{ ++public class InvalidVariablesException extends Exception { + } +diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java +index 28eed17..cc44aa5 100644 +--- a/src/main/java/bagpacker/iohandler/Parser.java ++++ b/src/main/java/bagpacker/iohandler/Parser.java +@@ -1,6 +1,5 @@ + package bagpacker.iohandler; + +- + import bagpacker.commands.AddCommand; + import bagpacker.commands.ByeCommand; + import bagpacker.commands.Command; +@@ -10,28 +9,32 @@ import bagpacker.commands.HelpCommand; + import bagpacker.commands.IncorrectCommand; + import bagpacker.commands.ListCommand; + import bagpacker.commands.PackCommand; +-import bagpacker.commands.UnpackCommand; + import bagpacker.exception.EmptyInputException; + import bagpacker.exception.InvalidIndexException; + import bagpacker.exception.InvalidVariablesException; + import bagpacker.packingfunc.Item; + import bagpacker.packingfunc.PackingList; + +-import java.util.ArrayList; +-import java.util.Arrays; + import java.util.Scanner; + + /** + * Parser class contains methods to manipulate user input + */ + public class Parser { +- private static ArrayList inputStringArray; ++ private static String[] arguments; + private static String fullInput; + + public static void setFullInput(String fullInput) { + Parser.fullInput = fullInput; + } + ++ /** ++ * Returns the user input in String format ++ */ ++ public static String getFullInput() { ++ return fullInput; ++ } ++ + /** + * Returns the user input as in array format + */ +@@ -42,38 +45,40 @@ public class Parser { + public static void setInputStringArray(String[] inputStringArray) { + Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray)); + } +- ++ + /** +- * Returns the user input in String format ++ * parses user input into relevant subclasses of Command for execution. ++ * @return command based on user input + */ +- public static String getFullInput() { +- return fullInput; +- } +- + public static Command parse() { ++ arguments = new String[2]; + String inputLine = ""; + while (inputLine.isEmpty()) { + try { +- inputLine = readLine(); ++ inputLine = readLine().trim(); + } catch (EmptyInputException e) { + Ui.errorMessage("Empty input received", + "try to input a command, to view all commands input 'help'"); + } + } + setFullInput(inputLine); +- String[] inputStringList = inputLine.trim().split(" "); ++ String[] inputStringList = inputLine.split(" "); + setInputStringArray(inputStringList); +- switch (inputStringList[0]) { ++ switch (getCommand()) { + case "add": ++ arguments = inputStringList[1].trim().split("/of"); + return createAddObj(); + case "delete": ++ arguments[0] = inputStringList[1].trim(); + return createDeleteObj(); + case "pack": ++ arguments = inputStringList[1].trim().split("/of"); + return createPackObj(); + case "unpack": ++ arguments = inputStringList[1].trim().split("/of"); + return createUnpackObj(); + case "list": +- return listCommand(); ++ return createListObj(); + case "help": + return createHelpObj(); + case "deletelist": +@@ -81,10 +86,11 @@ public class Parser { + case "bye": + return createByeObj(); + default: +- return new IncorrectCommand("'" + Parser.getCommand() + "' is an invalid User Command", ++ return new IncorrectCommand("'" + inputStringList[0] + "' is an invalid User Command", + "input 'help' to receive all valid commands"); + } + } ++ + /** + * Reads and returns the full user input from the command line interface + * - trims the leading and trailing white spaces +@@ -92,7 +98,7 @@ public class Parser { + * @return inputLine the String input of the user + * @throws EmptyInputException when user input empty line + */ +- private static String readLine() throws EmptyInputException { ++ public static String readLine() throws EmptyInputException { + String inputLine; + Scanner in = new Scanner(System.in); + inputLine = in.nextLine().trim(); +@@ -102,36 +108,6 @@ public class Parser { + return inputLine; + } + +- /** +- * Returns the user command in lower case +- * +- * @return command from user +- */ +- public static String getCommand() { +- String command = getInputStringArray().get(0).toLowerCase(); +- return command; +- } +- +- /** +- * Returns a string which represents the name of the item from the user input +- * +- * @return inputVariables which is the name of the item +- * @throws InvalidVariablesException when the item name cannot be found +- */ +- public static String getItemName() throws InvalidVariablesException { +- String itemName; +- if (inputStringArray.size() <= 1) { +- throw new InvalidVariablesException(); +- } +- try { +- int itemIndStart = fullInput.indexOf(" ") + 1; +- itemName = fullInput.substring(itemIndStart); +- } catch (IndexOutOfBoundsException e) { +- throw new InvalidVariablesException(); +- } +- return itemName; +- } +- + /** + * Returns a string which represents the index of the item from the user input + * +@@ -141,7 +117,7 @@ public class Parser { + public static String getItemIndex() throws InvalidIndexException { + String inputIndex; + int itemIndex; +- if (inputStringArray.size() != 2) { ++ if (arguments[0] == null) { + throw new InvalidIndexException(); + } + try { +@@ -156,59 +132,37 @@ public class Parser { + } + return inputIndex; + } ++ + /** + * Returns a string which represents the relevant variable depending on the command + * - "add" will return the item name + * - "delete", "pack", "unpack" will return item index + * +- * @param command used to determine the type of variable to return + * @return itemVariable which is the index OR name of the item in packing list + * @throws InvalidIndexException when the item index is not valid + */ +- public static String getVariable(String command) throws InvalidVariablesException, InvalidIndexException { ++ public static String getVariable() throws InvalidIndexException { + String itemVariable; + try { +- if (command.equals("add")) { +- itemVariable = getItemName(); +- } else { +- itemVariable = getItemIndex(); +- } +- } catch (InvalidVariablesException e) { +- throw new InvalidVariablesException(); ++ itemVariable = getItemIndex(); + } catch (InvalidIndexException e) { + throw new InvalidIndexException(); + } + return itemVariable; + } + +- +- /** +- * Returns the user item description +- */ +- public static String getItemDescrip() { +- //String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length); +- int indexItemName = getFullInput().indexOf("i/") + 2; +- return getFullInput().substring(indexItemName).trim(); ++ public static String[] getQuantityAndDescription() { ++ String[] itemQuantityAndDescription = new String[2]; ++ itemQuantityAndDescription[0] = arguments[0]; ++ itemQuantityAndDescription[1] = arguments[1]; ++ return itemQuantityAndDescription; + } + +- +- /** +- * Attempts to create AddCommand object to be executed where it is called from +- * +- * @return AddCommand the command to be executed to add an item to the packing list, else +- * an IncorrectCommand is created to be executed +- */ + public static Command createAddObj() { +- try { +- String itemName = getVariable("add"); +- return new AddCommand(new Item(itemName)); +- } catch (InvalidVariablesException e) { +- return new IncorrectCommand("Invalid Item Name", +- "try to input a name (word(s)) to be added into the list"); +- } catch (InvalidIndexException e) { +- return new IncorrectCommand("Invalid Item Index", +- "try to input an integer number between 1 and " + PackingList.getItemList().size()); +- } ++ String[] quantityAndDescription = getQuantityAndDescription(); ++ int itemQuantity = Integer.parseInt((quantityAndDescription[0]).trim()); ++ String itemDescription = quantityAndDescription[1].trim(); ++ return new AddCommand(new Item(itemQuantity, itemDescription)); + } + + /** +@@ -219,11 +173,8 @@ public class Parser { + */ + public static Command createDeleteObj() { + try { +- String itemIndex = getVariable("delete"); ++ String itemIndex = getVariable(); + return new DeleteCommand(Integer.parseInt(itemIndex)); +- } catch (InvalidVariablesException e) { +- return new IncorrectCommand("Invalid Item Name", +- "Try to input a name (word(s)) to be added into the list"); + } catch (InvalidIndexException e) { + if (PackingList.getItemList().size() == 0) { + return new IncorrectCommand("Invalid Item Index", +@@ -235,6 +186,19 @@ public class Parser { + } + } + ++ public static int[] getQuantityAndIndex() throws InvalidVariablesException, InvalidIndexException { ++ int[] itemQuantityAndIndex = new int[2]; ++ try { ++ itemQuantityAndIndex[0] = Integer.parseInt(arguments[0].trim()); ++ itemQuantityAndIndex[1] = Integer.parseInt(arguments[1].trim()); ++ } catch (IndexOutOfBoundsException e) { ++ throw new InvalidVariablesException(); ++ } catch (NumberFormatException e) { ++ throw new InvalidIndexException(); ++ } ++ return itemQuantityAndIndex; ++ } ++ + /** + * Attempts to create PackCommand object to be executed where it is called from + * +@@ -243,8 +207,10 @@ public class Parser { + */ + public static Command createPackObj() { + try { +- String itemIndex = getVariable("pack"); +- return new PackCommand(Integer.parseInt(itemIndex)); ++ int[] quantityAndIndex = getQuantityAndIndex(); ++ int itemQuantity = quantityAndIndex[0]; ++ int itemIndex = quantityAndIndex[1]; ++ return new PackCommand(itemQuantity, itemIndex); + } catch (InvalidVariablesException e) { + return new IncorrectCommand("Invalid Item Name", + "try to input a name (word(s)) to be added into the list"); +@@ -259,7 +225,6 @@ public class Parser { + } + } + +- + /** + * Attempts to create UnpackCommand object to be executed where it is called from + * +@@ -268,8 +233,10 @@ public class Parser { + */ + public static Command createUnpackObj() { + try { +- String itemIndex = getVariable("unpack"); +- return new UnpackCommand(Integer.parseInt(itemIndex)); ++ int[] quantityAndIndex = getQuantityAndIndex(); ++ int itemQuantity = -1 * quantityAndIndex[0]; ++ int itemIndex = quantityAndIndex[1]; ++ return new PackCommand(itemQuantity, itemIndex); + } catch (InvalidVariablesException e) { + return new IncorrectCommand("Invalid Item Name", + "try to input a name (word(s)) to be added into the list"); +@@ -284,7 +251,7 @@ public class Parser { + } + } + +- public static Command listCommand() { ++ public static Command createListObj() { + return new ListCommand(); + } + +diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java +index 212fefb..5af85eb 100644 +--- a/src/main/java/bagpacker/iohandler/Storage.java ++++ b/src/main/java/bagpacker/iohandler/Storage.java +@@ -3,12 +3,9 @@ package bagpacker.iohandler; + import bagpacker.packingfunc.Item; + import bagpacker.packingfunc.PackingList; + +-import java.io.File; +-import java.io.FileNotFoundException; + import java.io.FileWriter; + import java.io.IOException; + import java.util.ArrayList; +-import java.util.Scanner; + + /** + * Storage class contains methods to save and retrieve saved packing list in txt file +@@ -17,17 +14,19 @@ public class Storage { + + public static ArrayList packingList = new ArrayList<>(); + private static final String FILE_PATH = "packingList.txt"; +- public static void load() throws FileNotFoundException { +- Scanner reader = new Scanner(new File(FILE_PATH)); +- String line; +- while (reader.hasNext()) { +- line = reader.nextLine(); +- boolean isPacked = line.charAt(1) == 'X'; +- String itemDesc = line.substring(4); +- Item item = new Item(itemDesc, isPacked); +- PackingList.getItemList().add(item); +- } +- } ++ ++ // to be edited by @coregano ++ // public static void load() throws FileNotFoundException { ++ // Scanner reader = new Scanner(new File(FILE_PATH)); ++ // String line; ++ // while (reader.hasNext()) { ++ // line = reader.nextLine(); ++ // boolean isPacked = line.charAt(1) == 'X'; ++ // String itemDesc = line.substring(4); ++ // Item item = new Item(itemDesc, isPacked); ++ // PackingList.getItemList().add(item); ++ // } ++ // } + + public static void save() { + try { +diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java +index 4b77544..9088c6d 100644 +--- a/src/main/java/bagpacker/iohandler/Ui.java ++++ b/src/main/java/bagpacker/iohandler/Ui.java +@@ -5,7 +5,6 @@ import bagpacker.commands.ByeCommand; + import bagpacker.commands.DeleteCommand; + import bagpacker.commands.ListCommand; + import bagpacker.commands.PackCommand; +-import bagpacker.commands.UnpackCommand; + + /** + * Ui class contains methods to print messages to user interface on Command Line Interface +@@ -66,8 +65,7 @@ public class Ui { + System.out.println("2. " + DeleteCommand.HELP_MSG); + System.out.println("3. " + ListCommand.HELP_MSG); + System.out.println("4. " + PackCommand.HELP_MSG); +- System.out.println("5. " + UnpackCommand.HELP_MSG); +- System.out.println("6. " + ByeCommand.HELP_MSG); ++ System.out.println("5. " + ByeCommand.HELP_MSG); + printLine(); + } + +diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java +index 2249ccc..636a05c 100644 +--- a/src/main/java/bagpacker/packingfunc/Item.java ++++ b/src/main/java/bagpacker/packingfunc/Item.java +@@ -1,41 +1,29 @@ + package bagpacker.packingfunc; ++ + /** + * Item class used to store information about item + * Items to be packed can be saved in PackingList class + */ + public class Item { + private String itemName; +- private boolean isPacked; +- private String packIcon = " "; +- public Item(String description) { +- this.itemName = description; +- isPacked = false; +- } +- public Item(String description, boolean isPacked) { ++ private int packedQuantity; ++ private int totalQuantity; ++ ++ public Item(int quantity, String description) { + this.itemName = description; +- this.isPacked = isPacked; +- } +- public void setPackIcon() { +- if (this.isPacked) { +- this.packIcon = "X"; +- } else { +- this.packIcon = " "; +- } ++ packedQuantity = 0; ++ totalQuantity = quantity; + } + + public String getItemName() { + return itemName; + } + +- public boolean getIsPacked() { +- return isPacked; +- } +- public void setPacked(boolean packed) { +- isPacked = packed; +- setPackIcon(); ++ public void setPacked(int quantity) { ++ this.packedQuantity += quantity; + } + + public String toString() { +- return "[" + this.packIcon + "] " + this.getItemName(); ++ return "[" + packedQuantity + "/" + totalQuantity + "] " + this.getItemName(); + } + } +diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java +index fc9949c..29b3145 100644 +--- a/src/main/java/bagpacker/packingfunc/PackingList.java ++++ b/src/main/java/bagpacker/packingfunc/PackingList.java +@@ -7,10 +7,8 @@ import java.util.ArrayList; + */ + public class PackingList { + +- + private static ArrayList itemList = new ArrayList<>(); + +- private static int targetIndex = -1; + public static void setItemList(ArrayList itemList) { + PackingList.itemList = itemList; + } +@@ -23,6 +21,7 @@ public class PackingList { + public static ArrayList getItemList() { + return itemList; + } ++ + /** + * Adds an item to the list. + */ +@@ -38,17 +37,17 @@ public class PackingList { + } + + /** +- * Marks an item as packed in the list. ++ * Adds quantity to quantity already packed + */ +- public void packItem(Item toPack) { +- toPack.setPacked(true); ++ public void packItem(Item toPack, int quantity) { ++ toPack.setPacked(quantity); + } + + /** +- * Marks an item as unpacked in the list. ++ * Subtracts quantity from quantity already packed + */ +- public void unpackItem(Item toPack) { +- toPack.setPacked(false); ++ public void unpackItem(Item toPack, int quantity) { ++ toPack.setPacked(quantity); + } + + public static Item get(int targetIndex) { +@@ -58,9 +57,8 @@ public class PackingList { + /** + * Returns size of packing list + */ +- public int size(){ ++ public int size() { + return itemList.size(); + } + +- + } +diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java +index 2f28ce9..8cf3f21 100644 +--- a/src/test/java/bagpacker/iohandlertest/ParserTest.java ++++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java +@@ -1,14 +1,154 @@ + package bagpacker.iohandlertest; ++ ++import bagpacker.commands.AddCommand; ++import bagpacker.commands.ByeCommand; ++import bagpacker.commands.DeleteCommand; ++import bagpacker.commands.HelpCommand; ++import bagpacker.commands.IncorrectCommand; ++import bagpacker.commands.ListCommand; ++import bagpacker.commands.PackCommand; ++import bagpacker.commands.UnpackCommand; ++import bagpacker.exception.EmptyInputException; ++import bagpacker.exception.InvalidIndexException; ++import bagpacker.exception.InvalidVariablesException; ++import bagpacker.iohandler.Parser; ++import bagpacker.packingfunc.PackingList; + import org.junit.jupiter.api.Test; +-import static org.junit.jupiter.api.Assertions.assertTrue; ++ ++import java.io.ByteArrayInputStream; ++import java.io.InputStream; ++ ++import static org.junit.jupiter.api.Assertions.assertEquals; ++import static org.junit.jupiter.api.Assertions.assertThrows; + + /** + * ParserTest to test Parser Class + */ + public class ParserTest { + @Test +- public void sampleTest() { +- assertTrue(true); ++ public void fullInputTest() { ++ String userInput = " add this item "; ++ InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); ++ System.setIn(inStream); ++ Parser.parse(); ++ assertEquals(userInput.trim(), Parser.getFullInput()); ++ } ++ ++ @Test ++ public void addCommandTest() { ++ String userInput = " add this item "; ++ InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); ++ System.setIn(inStream); ++ assertEquals(AddCommand.class, Parser.parse().getClass()); ++ } ++ ++ @Test ++ public void emptyInputTest() { ++ String userInput = " "; ++ InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); ++ System.setIn(inStream); ++ Exception exception = assertThrows(EmptyInputException.class, Parser::readLine); ++ assertEquals(EmptyInputException.class, exception.getClass()); ++ } ++ ++ @Test ++ public void addVariableTest() throws InvalidIndexException, InvalidVariablesException { ++ String userInput = " add this item 1 "; ++ InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); ++ System.setIn(inStream); ++ Parser.parse(); ++ assertEquals("this item 1", Parser.getVariable(Parser.getCommand())); ++ } ++ ++ @Test ++ public void deleteCommandTest() { ++ String userInput1 = " add this item "; ++ String userInput2 = " delete 1 "; ++ InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); ++ System.setIn(inStream); ++ PackingList dummyPackingList = new PackingList(); ++ Parser.parse().execute(dummyPackingList); ++ inStream = new ByteArrayInputStream(userInput2.getBytes()); ++ System.setIn(inStream); ++ assertEquals(DeleteCommand.class, Parser.parse().getClass()); ++ } ++ ++ @Test ++ public void packCommandTest() { ++ String userInput1 = " add this item "; ++ String userInput2 = " pack 1 "; ++ InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); ++ System.setIn(inStream); ++ PackingList dummyPackingList = new PackingList(); ++ Parser.parse().execute(dummyPackingList); ++ inStream = new ByteArrayInputStream(userInput2.getBytes()); ++ System.setIn(inStream); ++ assertEquals(PackCommand.class, Parser.parse().getClass()); ++ } ++ ++ @Test ++ public void unpackCommandTest() { ++ String userInput1 = " add this item "; ++ String userInput2 = " pack 1 "; ++ String userInput3 = " Unpack 1 "; ++ PackingList dummyPackingList = new PackingList(); ++ ++ InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); ++ System.setIn(inStream); ++ Parser.parse().execute(dummyPackingList); ++ ++ inStream = new ByteArrayInputStream(userInput2.getBytes()); ++ System.setIn(inStream); ++ Parser.parse().execute(dummyPackingList); ++ ++ inStream = new ByteArrayInputStream(userInput3.getBytes()); ++ System.setIn(inStream); ++ assertEquals(UnpackCommand.class, Parser.parse().getClass()); ++ } ++ ++ @Test ++ public void listCommandTest() { ++ String userInput1 = " add this item "; ++ String userInput2 = " lIST "; ++ PackingList dummyPackingList = new PackingList(); ++ ++ InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); ++ System.setIn(inStream); ++ Parser.parse().execute(dummyPackingList); ++ ++ inStream = new ByteArrayInputStream(userInput2.getBytes()); ++ System.setIn(inStream); ++ ++ assertEquals(ListCommand.class, Parser.parse().getClass()); ++ } ++ @Test ++ public void helpCommandTest() { ++ String userInput1 = " HelP "; ++ ++ InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); ++ System.setIn(inStream); ++ ++ assertEquals(HelpCommand.class, Parser.parse().getClass()); ++ } ++ ++ @Test ++ public void byeCommandTest() { ++ String userInput1 = " byE "; ++ ++ InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); ++ System.setIn(inStream); ++ ++ assertEquals(ByeCommand.class, Parser.parse().getClass()); + } + ++ @Test ++ public void invalidCommandTest() { ++ String userInput1 = " thisIsNOTaVALID command "; ++ ++ InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); ++ System.setIn(inStream); ++ ++ assertEquals(IncorrectCommand.class, Parser.parse().getClass()); ++ } + } ++ +diff --git a/src/test/java/bagpacker/packingfunctest/CommandsTest.java b/src/test/java/bagpacker/packingfunctest/CommandsTest.java +index 88ef7ab..db288dc 100644 +--- a/src/test/java/bagpacker/packingfunctest/CommandsTest.java ++++ b/src/test/java/bagpacker/packingfunctest/CommandsTest.java +@@ -1,10 +1,11 @@ + package bagpacker.packingfunctest; +- ++/* + import bagpacker.commands.AddCommand; + import bagpacker.commands.Command; ++//import bagpacker.packingfunc.Item; + import bagpacker.packingfunc.Item; + import bagpacker.packingfunc.PackingList; +-import org.junit.jupiter.api.Assertions; ++import org.junit.jupiter.api.Assertions;*/ + import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertTrue; + +@@ -17,11 +18,10 @@ public class CommandsTest { + assertTrue(true); + } + +- @Test ++ /*@Test + public void testAddCommand() { + PackingList packingList = new PackingList(); +- Item item = new Item("toothbrush"); +- Command addCommand = new AddCommand(item); ++ Command addCommand = new AddCommand(new Item(1, "toothbrush")); + addCommand.execute(packingList); + + // Expect a Packinglist with a toothbrush item in first index +@@ -29,13 +29,13 @@ public class CommandsTest { + Assertions.assertNotEquals("tooth", packingList.get(0).getItemName()); + + // Expect second index item in the packing list to be toothpaste +- Item itemTwo = new Item("toothpaste"); +- addCommand = new AddCommand(itemTwo); +- addCommand.execute(packingList); ++ ++ addObj = new AddCommand(1, "toothpaste"); ++ addObj.execute(packingList); + + Assertions.assertEquals("toothpaste",packingList.get(1).getItemName()); + Assertions.assertNotEquals("toothbrush", packingList.get(1).getItemName()); + +- } ++ }*/ + + } From 7a55482c1ea54fe92e8e1783d148ad793bb0729f Mon Sep 17 00:00:00 2001 From: coregano Date: Fri, 24 Mar 2023 00:48:05 +0800 Subject: [PATCH 056/207] Add relevant htmlReport files --- docs/img_2.png | Bin 0 -> 58326 bytes htmlReport/css/coverage.css | 154 ++ htmlReport/css/idea.min.css | 118 ++ htmlReport/img/arrowDown.gif | Bin 0 -> 89 bytes htmlReport/img/arrowUp.gif | Bin 0 -> 91 bytes htmlReport/index.html | 249 +++ htmlReport/index_SORT_BY_BLOCK.html | 249 +++ htmlReport/index_SORT_BY_BLOCK_DESC.html | 249 +++ htmlReport/index_SORT_BY_CLASS.html | 249 +++ htmlReport/index_SORT_BY_CLASS_DESC.html | 249 +++ htmlReport/index_SORT_BY_LINE.html | 249 +++ htmlReport/index_SORT_BY_LINE_DESC.html | 249 +++ htmlReport/index_SORT_BY_METHOD.html | 249 +++ htmlReport/index_SORT_BY_METHOD_DESC.html | 249 +++ htmlReport/index_SORT_BY_NAME_DESC.html | 249 +++ htmlReport/js/highlight.min.js | 1388 +++++++++++++++++ htmlReport/js/highlightjs-line-numbers.min.js | 24 + htmlReport/ns-1/index.html | 142 ++ htmlReport/ns-1/index_SORT_BY_BLOCK.html | 142 ++ htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html | 142 ++ htmlReport/ns-1/index_SORT_BY_CLASS.html | 142 ++ htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html | 142 ++ htmlReport/ns-1/index_SORT_BY_LINE.html | 142 ++ htmlReport/ns-1/index_SORT_BY_LINE_DESC.html | 142 ++ htmlReport/ns-1/index_SORT_BY_METHOD.html | 142 ++ .../ns-1/index_SORT_BY_METHOD_DESC.html | 142 ++ htmlReport/ns-1/index_SORT_BY_NAME_DESC.html | 142 ++ htmlReport/ns-1/sources/source-1.html | 136 ++ htmlReport/ns-2/index.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_BLOCK.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_CLASS.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_LINE.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_LINE_DESC.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_METHOD.html | 385 +++++ .../ns-2/index_SORT_BY_METHOD_DESC.html | 385 +++++ htmlReport/ns-2/index_SORT_BY_NAME_DESC.html | 385 +++++ htmlReport/ns-2/sources/source-1.html | 127 ++ htmlReport/ns-2/sources/source-2.html | 118 ++ htmlReport/ns-2/sources/source-3.html | 152 ++ htmlReport/ns-2/sources/source-4.html | 130 ++ htmlReport/ns-2/sources/source-5.html | 123 ++ htmlReport/ns-2/sources/source-6.html | 114 ++ htmlReport/ns-2/sources/source-7.html | 121 ++ htmlReport/ns-2/sources/source-8.html | 136 ++ htmlReport/ns-2/sources/source-9.html | 132 ++ htmlReport/ns-2/sources/source-a.html | 132 ++ htmlReport/ns-3/index.html | 196 +++ htmlReport/ns-3/index_SORT_BY_BLOCK.html | 196 +++ htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html | 196 +++ htmlReport/ns-3/index_SORT_BY_CLASS.html | 196 +++ htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html | 196 +++ htmlReport/ns-3/index_SORT_BY_LINE.html | 196 +++ htmlReport/ns-3/index_SORT_BY_LINE_DESC.html | 196 +++ htmlReport/ns-3/index_SORT_BY_METHOD.html | 196 +++ .../ns-3/index_SORT_BY_METHOD_DESC.html | 196 +++ htmlReport/ns-3/index_SORT_BY_NAME_DESC.html | 196 +++ htmlReport/ns-3/sources/source-1.html | 107 ++ htmlReport/ns-3/sources/source-2.html | 109 ++ htmlReport/ns-3/sources/source-3.html | 109 ++ htmlReport/ns-4/index.html | 196 +++ htmlReport/ns-4/index_SORT_BY_BLOCK.html | 196 +++ htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html | 196 +++ htmlReport/ns-4/index_SORT_BY_CLASS.html | 196 +++ htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html | 196 +++ htmlReport/ns-4/index_SORT_BY_LINE.html | 196 +++ htmlReport/ns-4/index_SORT_BY_LINE_DESC.html | 196 +++ htmlReport/ns-4/index_SORT_BY_METHOD.html | 196 +++ .../ns-4/index_SORT_BY_METHOD_DESC.html | 196 +++ htmlReport/ns-4/index_SORT_BY_NAME_DESC.html | 196 +++ htmlReport/ns-4/sources/source-1.html | 405 +++++ htmlReport/ns-4/sources/source-2.html | 150 ++ htmlReport/ns-4/sources/source-3.html | 188 +++ htmlReport/ns-5/index.html | 169 ++ htmlReport/ns-5/index_SORT_BY_BLOCK.html | 169 ++ htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html | 169 ++ htmlReport/ns-5/index_SORT_BY_CLASS.html | 169 ++ htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html | 169 ++ htmlReport/ns-5/index_SORT_BY_LINE.html | 169 ++ htmlReport/ns-5/index_SORT_BY_LINE_DESC.html | 169 ++ htmlReport/ns-5/index_SORT_BY_METHOD.html | 169 ++ .../ns-5/index_SORT_BY_METHOD_DESC.html | 169 ++ htmlReport/ns-5/index_SORT_BY_NAME_DESC.html | 169 ++ htmlReport/ns-5/sources/source-1.html | 144 ++ htmlReport/ns-5/sources/source-2.html | 169 ++ 86 files changed, 17856 insertions(+) create mode 100644 docs/img_2.png create mode 100644 htmlReport/css/coverage.css create mode 100644 htmlReport/css/idea.min.css create mode 100644 htmlReport/img/arrowDown.gif create mode 100644 htmlReport/img/arrowUp.gif create mode 100644 htmlReport/index.html create mode 100644 htmlReport/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/index_SORT_BY_CLASS.html create mode 100644 htmlReport/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/index_SORT_BY_LINE.html create mode 100644 htmlReport/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/index_SORT_BY_METHOD.html create mode 100644 htmlReport/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/js/highlight.min.js create mode 100644 htmlReport/js/highlightjs-line-numbers.min.js create mode 100644 htmlReport/ns-1/index.html create mode 100644 htmlReport/ns-1/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-1/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-1/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-1/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-1/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-1/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-1/sources/source-1.html create mode 100644 htmlReport/ns-2/index.html create mode 100644 htmlReport/ns-2/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-2/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-2/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-2/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-2/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-2/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-2/sources/source-1.html create mode 100644 htmlReport/ns-2/sources/source-2.html create mode 100644 htmlReport/ns-2/sources/source-3.html create mode 100644 htmlReport/ns-2/sources/source-4.html create mode 100644 htmlReport/ns-2/sources/source-5.html create mode 100644 htmlReport/ns-2/sources/source-6.html create mode 100644 htmlReport/ns-2/sources/source-7.html create mode 100644 htmlReport/ns-2/sources/source-8.html create mode 100644 htmlReport/ns-2/sources/source-9.html create mode 100644 htmlReport/ns-2/sources/source-a.html create mode 100644 htmlReport/ns-3/index.html create mode 100644 htmlReport/ns-3/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-3/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-3/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-3/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-3/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-3/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-3/sources/source-1.html create mode 100644 htmlReport/ns-3/sources/source-2.html create mode 100644 htmlReport/ns-3/sources/source-3.html create mode 100644 htmlReport/ns-4/index.html create mode 100644 htmlReport/ns-4/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-4/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-4/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-4/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-4/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-4/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-4/sources/source-1.html create mode 100644 htmlReport/ns-4/sources/source-2.html create mode 100644 htmlReport/ns-4/sources/source-3.html create mode 100644 htmlReport/ns-5/index.html create mode 100644 htmlReport/ns-5/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-5/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-5/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-5/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-5/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-5/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-5/sources/source-1.html create mode 100644 htmlReport/ns-5/sources/source-2.html diff --git a/docs/img_2.png b/docs/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3547c40e03b029f822de6c197f22281795cf70f2 GIT binary patch literal 58326 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 VGg`~}XyhM`DWAk7A2#~ye*iphPA32W literal 0 HcmV?d00001 diff --git a/htmlReport/css/coverage.css b/htmlReport/css/coverage.css new file mode 100644 index 0000000000..cef776517f --- /dev/null +++ b/htmlReport/css/coverage.css @@ -0,0 +1,154 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +* { + margin: 0; + padding: 0; +} + +body { + background-color: #fff; + font-family: helvetica neue, tahoma, arial, sans-serif; + font-size: 82%; + color: #151515; +} + +h1 { + margin: 0.5em 0; + color: #010101; + font-weight: normal; + font-size: 18px; +} + +h2 { + margin: 0.5em 0; + color: #010101; + font-weight: normal; + font-size: 16px; +} + +a { + color: #1564C2; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +span.separator { + color: #9BA9BA; + padding-left: 5px; + padding-right: 5px; +} + +div.content { + width: 99%; +} + +table.coverageStats { + width: 100%; + border-collapse: collapse; +} + +table.overallStats { + width: 20%; +} + +table.coverageStats td, table.coverageStats th { + padding: 4px 2px; + border-bottom: 1px solid #ccc; +} + +table.coverageStats th { + background-color: #959BA4; + border: none; + font-weight: bold; + text-align: left; + color: #FFF; +} + +table.coverageStats th.coverageStat { + width: 15%; +} + +table.coverageStats th a { + color: #FFF; +} + +table.coverageStats th a:hover { + text-decoration: none; +} + +table.coverageStats th.sortedDesc a { + background: url(../img/arrowDown.gif) no-repeat 100% 2px; + padding-right: 20px; +} + +table.coverageStats th.sortedAsc a { + background: url(../img/arrowUp.gif) no-repeat 100% 2px; + padding-right: 20px; +} + +div.footer { + margin: 2em .5em; + font-size: 85%; + text-align: left; + line-height: 140%; +} + +code.sourceCode { + width: 100%; + border: 1px solid #ccc; + font: normal 12px 'Menlo', 'Bitstream Vera Sans Mono', 'Courier New', 'Courier', monospace; + white-space: pre; +} + +code.sourceCode b { + font-weight: normal; +} + +code.sourceCode span.number { + color: #151515; +} + +code.sourceCode .fc { + background-color: #cfc; +} + +code.sourceCode .pc { + background-color: #ffc; +} + +code.sourceCode .nc { + background-color: #fcc; +} + +.percent, .absValue { + font-size: 90%; +} + +.percent .green, .absValue .green { + color: #32cc32; +} + +.percent .red, .absValue .red { + color: #f00; +} + +.percent .totalDiff { + color: #3f3f3f; +} diff --git a/htmlReport/css/idea.min.css b/htmlReport/css/idea.min.css new file mode 100644 index 0000000000..a8d5292bd5 --- /dev/null +++ b/htmlReport/css/idea.min.css @@ -0,0 +1,118 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* +Intellij Idea-like styling (c) Vasily Polovnyov +*/ + +.hljs { + color: #000; + background: #fff; +} + +.hljs-subst, +.hljs-title { + font-weight: normal; + color: #000; +} + +.hljs-comment, +.hljs-quote { + color: #808080; + font-style: italic; +} + +.hljs-meta { + color: #808000; +} + +.hljs-tag { + background: #efefef; +} + +.hljs-section, +.hljs-name, +.hljs-literal, +.hljs-keyword, +.hljs-selector-tag, +.hljs-type, +.hljs-selector-id, +.hljs-selector-class { + font-weight: bold; + color: #000080; +} + +.hljs-attribute, +.hljs-number, +.hljs-regexp, +.hljs-link { + font-weight: bold; + color: #0000ff; +} + +.hljs-number, +.hljs-regexp, +.hljs-link { + font-weight: normal; +} + +.hljs-string { + color: #008000; + font-weight: bold; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-formula { + color: #000; + background: #d0eded; + font-style: italic; +} + +.hljs-doctag { + text-decoration: underline; +} + +.hljs-variable, +.hljs-template-variable { + color: #660e7a; +} + +.hljs-addition { + background: #baeeba; +} + +.hljs-deletion { + background: #ffc8bd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-ln-numbers { + display: block; + float: left; + width: 3em; + border-right: 1px solid #ccc; + font-style: normal; + text-align: right; + background-color: #eee; +} diff --git a/htmlReport/img/arrowDown.gif b/htmlReport/img/arrowDown.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4ac9b4b0f5eee9fc82deb7f03d0cc7f197b01c7 GIT binary patch literal 89 zcmZ?wbhEHbv%yJ&P?))?G g5?!@7agD+*@rGjs@joUks8}}Ha%HfNHz$KN0Orjd82|tP literal 0 HcmV?d00001 diff --git a/htmlReport/img/arrowUp.gif b/htmlReport/img/arrowUp.gif new file mode 100644 index 0000000000000000000000000000000000000000..d488db0089f15409b83a6f39718384cac89ea3c9 GIT binary patch literal 91 zcmZ?wbhEHbv%nBa6?))=2 j#jeJ<$W6!S$=vG=3s*2Wu3C5I!M+a(XH6zEFjxZs9OxeQ literal 0 HcmV?d00001 diff --git a/htmlReport/index.html b/htmlReport/index.html new file mode 100644 index 0000000000..2014cca5f8 --- /dev/null +++ b/htmlReport/index.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_BLOCK.html b/htmlReport/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..cd848940d4 --- /dev/null +++ b/htmlReport/index_SORT_BY_BLOCK.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_BLOCK_DESC.html b/htmlReport/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..0306ddac53 --- /dev/null +++ b/htmlReport/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_CLASS.html b/htmlReport/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..9289b15a33 --- /dev/null +++ b/htmlReport/index_SORT_BY_CLASS.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_CLASS_DESC.html b/htmlReport/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..db988e6dbd --- /dev/null +++ b/htmlReport/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_LINE.html b/htmlReport/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..a5149f7a02 --- /dev/null +++ b/htmlReport/index_SORT_BY_LINE.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_LINE_DESC.html b/htmlReport/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..a087b56950 --- /dev/null +++ b/htmlReport/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_METHOD.html b/htmlReport/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..83260463c5 --- /dev/null +++ b/htmlReport/index_SORT_BY_METHOD.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_METHOD_DESC.html b/htmlReport/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..1831b33bc1 --- /dev/null +++ b/htmlReport/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+
+ + + + + + + diff --git a/htmlReport/index_SORT_BY_NAME_DESC.html b/htmlReport/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..e7e8077a52 --- /dev/null +++ b/htmlReport/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
+ + +

Overall Coverage Summary

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
all classes + + 36.8% + + + (7/19) + + + + 29.8% + + + (25/84) + + + + 23.1% + + + (56/242) + +
+ +
+

Coverage Breakdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+
+ + + + + + + diff --git a/htmlReport/js/highlight.min.js b/htmlReport/js/highlight.min.js new file mode 100644 index 0000000000..e88731520e --- /dev/null +++ b/htmlReport/js/highlight.min.js @@ -0,0 +1,1388 @@ +/* + Highlight.js 10.7.2 (00233d63) + License: BSD-3-Clause + Copyright (c) 2006-2021, Ivan Sagalaev + + BSD 3-Clause License + + Copyright (c) 2006-2021, Ivan Sagalaev. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +var hljs=function(){"use strict";function e(t){ +return t instanceof Map?t.clear=t.delete=t.set=()=>{ +throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{var i=t[n] +;"object"!=typeof i||Object.isFrozen(i)||e(i)})),t}var t=e,n=e;t.default=n +;class i{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function s(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function a(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] +;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const r=e=>!!e.kind +;class l{constructor(e,t){ +this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ +this.buffer+=s(e)}openNode(e){if(!r(e))return;let t=e.kind +;e.sublanguage||(t=`${this.classPrefix}${t}`),this.span(t)}closeNode(e){ +r(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}class o{constructor(){this.rootNode={ +children:[]},this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const t={kind:e,children:[]} +;this.add(t),this.stack.push(t)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ +return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), +t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +o._collapse(e)})))}}class c extends o{constructor(e){super(),this.options=e} +addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} +addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root +;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){ +return new l(this,this.options).value()}finalize(){return!0}}function g(e){ +return e?"string"==typeof e?e:e.source:null} +const u=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,h="[a-zA-Z]\\w*",d="[a-zA-Z_]\\w*",f="\\b\\d+(\\.\\d+)?",p="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",m="\\b(0b[01]+)",b={ +begin:"\\\\[\\s\\S]",relevance:0},E={className:"string",begin:"'",end:"'", +illegal:"\\n",contains:[b]},x={className:"string",begin:'"',end:'"', +illegal:"\\n",contains:[b]},v={ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},w=(e,t,n={})=>{const i=a({className:"comment",begin:e,end:t,contains:[]},n) +;return i.contains.push(v),i.contains.push({className:"doctag", +begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),i +},y=w("//","$"),N=w("/\\*","\\*/"),R=w("#","$");var _=Object.freeze({ +__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:h,UNDERSCORE_IDENT_RE:d, +NUMBER_RE:f,C_NUMBER_RE:p,BINARY_NUMBER_RE:m, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const t=/^#![ ]*\// +;return e.binary&&(e.begin=((...e)=>e.map((e=>g(e))).join(""))(t,/.*\b/,e.binary,/\b.*/)), +a({className:"meta",begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{ +0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:b,APOS_STRING_MODE:E, +QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:v,COMMENT:w,C_LINE_COMMENT_MODE:y, +C_BLOCK_COMMENT_MODE:N,HASH_COMMENT_MODE:R,NUMBER_MODE:{className:"number", +begin:f,relevance:0},C_NUMBER_MODE:{className:"number",begin:p,relevance:0}, +BINARY_NUMBER_MODE:{className:"number",begin:m,relevance:0},CSS_NUMBER_MODE:{ +className:"number", +begin:f+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", +relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp", +begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[b,{begin:/\[/,end:/\]/, +relevance:0,contains:[b]}]}]},TITLE_MODE:{className:"title",begin:h,relevance:0 +},UNDERSCORE_TITLE_MODE:{className:"title",begin:d,relevance:0},METHOD_GUARD:{ +begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ +t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function k(e,t){ +"."===e.input[e.index-1]&&t.ignoreMatch()}function M(e,t){ +t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=k,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function O(e,t){ +Array.isArray(e.illegal)&&(e.illegal=((...e)=>"("+e.map((e=>g(e))).join("|")+")")(...e.illegal)) +}function A(e,t){if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function L(e,t){ +void 0===e.relevance&&(e.relevance=1)} +const I=["of","and","for","in","not","or","if","then","parent","list","value"] +;function j(e,t,n="keyword"){const i={} +;return"string"==typeof e?s(n,e.split(" ")):Array.isArray(e)?s(n,e):Object.keys(e).forEach((n=>{ +Object.assign(i,j(e[n],t,n))})),i;function s(e,n){ +t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") +;i[n[0]]=[e,B(n[0],n[1])]}))}}function B(e,t){ +return t?Number(t):(e=>I.includes(e.toLowerCase()))(e)?0:1} +function T(e,{plugins:t}){function n(t,n){ +return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(n?"g":""))}class i{ +constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,t){ +t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), +this.matchAt+=(e=>RegExp(e.toString()+"|").exec("").length-1)(e)+1}compile(){ +0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(((e,t="|")=>{let n=0 +;return e.map((e=>{n+=1;const t=n;let i=g(e),s="";for(;i.length>0;){ +const e=u.exec(i);if(!e){s+=i;break} +s+=i.substring(0,e.index),i=i.substring(e.index+e[0].length), +"\\"===e[0][0]&&e[1]?s+="\\"+(Number(e[1])+t):(s+=e[0],"("===e[0]&&n++)}return s +})).map((e=>`(${e})`)).join(t)})(e),!0),this.lastIndex=0}exec(e){ +this.matcherRe.lastIndex=this.lastIndex;const t=this.matcherRe.exec(e) +;if(!t)return null +;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] +;return t.splice(0,n),Object.assign(t,i)}}class s{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const t=new i +;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), +t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ +this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ +const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex +;let n=t.exec(e) +;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ +const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} +return n&&(this.regexIndex+=n.position+1, +this.regexIndex===this.count&&this.considerAll()),n}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=a(e.classNameAliases||{}),function t(i,r){const l=i +;if(i.isCompiled)return l +;[A].forEach((e=>e(i,r))),e.compilerExtensions.forEach((e=>e(i,r))), +i.__beforeBegin=null,[M,O,L].forEach((e=>e(i,r))),i.isCompiled=!0;let o=null +;if("object"==typeof i.keywords&&(o=i.keywords.$pattern, +delete i.keywords.$pattern), +i.keywords&&(i.keywords=j(i.keywords,e.case_insensitive)), +i.lexemes&&o)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ") +;return o=o||i.lexemes||/\w+/, +l.keywordPatternRe=n(o,!0),r&&(i.begin||(i.begin=/\B|\b/), +l.beginRe=n(i.begin),i.endSameAsBegin&&(i.end=i.begin), +i.end||i.endsWithParent||(i.end=/\B|\b/), +i.end&&(l.endRe=n(i.end)),l.terminatorEnd=g(i.end)||"", +i.endsWithParent&&r.terminatorEnd&&(l.terminatorEnd+=(i.end?"|":"")+r.terminatorEnd)), +i.illegal&&(l.illegalRe=n(i.illegal)), +i.contains||(i.contains=[]),i.contains=[].concat(...i.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>a(e,{ +variants:null},t)))),e.cachedVariants?e.cachedVariants:S(e)?a(e,{ +starts:e.starts?a(e.starts):null +}):Object.isFrozen(e)?a(e):e))("self"===e?i:e)))),i.contains.forEach((e=>{t(e,l) +})),i.starts&&t(i.starts,r),l.matcher=(e=>{const t=new s +;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(l),l}(e)}function S(e){ +return!!e&&(e.endsWithParent||S(e.starts))}function P(e){const t={ +props:["language","code","autodetect"],data:()=>({detectedLanguage:"", +unknownLanguage:!1}),computed:{className(){ +return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){ +if(!this.autoDetect&&!e.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`), +this.unknownLanguage=!0,s(this.code);let t={} +;return this.autoDetect?(t=e.highlightAuto(this.code), +this.detectedLanguage=t.language):(t=e.highlight(this.language,this.code,this.ignoreIllegals), +this.detectedLanguage=this.language),t.value},autoDetect(){ +return!(this.language&&(e=this.autodetect,!e&&""!==e));var e}, +ignoreIllegals:()=>!0},render(e){return e("pre",{},[e("code",{ +class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{ +Component:t,VuePlugin:{install(e){e.component("highlightjs",t)}}}}const D={ +"after:highlightElement":({el:e,result:t,text:n})=>{const i=H(e) +;if(!i.length)return;const a=document.createElement("div") +;a.innerHTML=t.value,t.value=((e,t,n)=>{let i=0,a="";const r=[];function l(){ +return e.length&&t.length?e[0].offset!==t[0].offset?e[0].offset"}function c(e){ +a+=""}function g(e){("start"===e.event?o:c)(e.node)} +for(;e.length||t.length;){let t=l() +;if(a+=s(n.substring(i,t[0].offset)),i=t[0].offset,t===e){r.reverse().forEach(c) +;do{g(t.splice(0,1)[0]),t=l()}while(t===e&&t.length&&t[0].offset===i) +;r.reverse().forEach(o) +}else"start"===t[0].event?r.push(t[0].node):r.pop(),g(t.splice(0,1)[0])} +return a+s(n.substr(i))})(i,H(a),n)}};function C(e){ +return e.nodeName.toLowerCase()}function H(e){const t=[];return function e(n,i){ +for(let s=n.firstChild;s;s=s.nextSibling)3===s.nodeType?i+=s.nodeValue.length:1===s.nodeType&&(t.push({ +event:"start",offset:i,node:s}),i=e(s,i),C(s).match(/br|hr|img|input/)||t.push({ +event:"stop",offset:i,node:s}));return i}(e,0),t}const $={},U=e=>{ +console.error(e)},z=(e,...t)=>{console.log("WARN: "+e,...t)},K=(e,t)=>{ +$[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),$[`${e}/${t}`]=!0) +},G=s,V=a,W=Symbol("nomatch");return(e=>{ +const n=Object.create(null),s=Object.create(null),a=[];let r=!0 +;const l=/(^(<[^>]+>|\t|)+|\n)/gm,o="Could not find the language '{}', did you forget to load/include a language module?",g={ +disableAutodetect:!0,name:"Plain text",contains:[]};let u={ +noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +tabReplace:null,useBR:!1,languages:null,__emitter:c};function h(e){ +return u.noHighlightRe.test(e)}function d(e,t,n,i){let s="",a="" +;"object"==typeof t?(s=e, +n=t.ignoreIllegals,a=t.language,i=void 0):(K("10.7.0","highlight(lang, code, ...args) has been deprecated."), +K("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +a=e,s=t);const r={code:s,language:a};M("before:highlight",r) +;const l=r.result?r.result:f(r.language,r.code,n,i) +;return l.code=r.code,M("after:highlight",l),l}function f(e,t,s,l){ +function c(e,t){const n=v.case_insensitive?t[0].toLowerCase():t[0] +;return Object.prototype.hasOwnProperty.call(e.keywords,n)&&e.keywords[n]} +function g(){null!=R.subLanguage?(()=>{if(""===M)return;let e=null +;if("string"==typeof R.subLanguage){ +if(!n[R.subLanguage])return void k.addText(M) +;e=f(R.subLanguage,M,!0,_[R.subLanguage]),_[R.subLanguage]=e.top +}else e=p(M,R.subLanguage.length?R.subLanguage:null) +;R.relevance>0&&(O+=e.relevance),k.addSublanguage(e.emitter,e.language) +})():(()=>{if(!R.keywords)return void k.addText(M);let e=0 +;R.keywordPatternRe.lastIndex=0;let t=R.keywordPatternRe.exec(M),n="";for(;t;){ +n+=M.substring(e,t.index);const i=c(R,t);if(i){const[e,s]=i +;if(k.addText(n),n="",O+=s,e.startsWith("_"))n+=t[0];else{ +const n=v.classNameAliases[e]||e;k.addKeyword(t[0],n)}}else n+=t[0] +;e=R.keywordPatternRe.lastIndex,t=R.keywordPatternRe.exec(M)} +n+=M.substr(e),k.addText(n)})(),M=""}function h(e){ +return e.className&&k.openNode(v.classNameAliases[e.className]||e.className), +R=Object.create(e,{parent:{value:R}}),R}function d(e,t,n){let s=((e,t)=>{ +const n=e&&e.exec(t);return n&&0===n.index})(e.endRe,n);if(s){if(e["on:end"]){ +const n=new i(e);e["on:end"](t,n),n.isMatchIgnored&&(s=!1)}if(s){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return d(e.parent,t,n)}function m(e){ +return 0===R.matcher.regexIndex?(M+=e[0],1):(I=!0,0)}function b(e){ +const n=e[0],i=t.substr(e.index),s=d(R,e,i);if(!s)return W;const a=R +;a.skip?M+=n:(a.returnEnd||a.excludeEnd||(M+=n),g(),a.excludeEnd&&(M=n));do{ +R.className&&k.closeNode(),R.skip||R.subLanguage||(O+=R.relevance),R=R.parent +}while(R!==s.parent) +;return s.starts&&(s.endSameAsBegin&&(s.starts.endRe=s.endRe), +h(s.starts)),a.returnEnd?0:n.length}let E={};function x(n,a){const l=a&&a[0] +;if(M+=n,null==l)return g(),0 +;if("begin"===E.type&&"end"===a.type&&E.index===a.index&&""===l){ +if(M+=t.slice(a.index,a.index+1),!r){const t=Error("0 width match regex") +;throw t.languageName=e,t.badRule=E.rule,t}return 1} +if(E=a,"begin"===a.type)return function(e){ +const t=e[0],n=e.rule,s=new i(n),a=[n.__beforeBegin,n["on:begin"]] +;for(const n of a)if(n&&(n(e,s),s.isMatchIgnored))return m(t) +;return n&&n.endSameAsBegin&&(n.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")), +n.skip?M+=t:(n.excludeBegin&&(M+=t), +g(),n.returnBegin||n.excludeBegin||(M=t)),h(n),n.returnBegin?0:t.length}(a) +;if("illegal"===a.type&&!s){ +const e=Error('Illegal lexeme "'+l+'" for mode "'+(R.className||"")+'"') +;throw e.mode=R,e}if("end"===a.type){const e=b(a);if(e!==W)return e} +if("illegal"===a.type&&""===l)return 1 +;if(L>1e5&&L>3*a.index)throw Error("potential infinite loop, way more iterations than matches") +;return M+=l,l.length}const v=N(e) +;if(!v)throw U(o.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const w=T(v,{plugins:a});let y="",R=l||w;const _={},k=new u.__emitter(u);(()=>{ +const e=[];for(let t=R;t!==v;t=t.parent)t.className&&e.unshift(t.className) +;e.forEach((e=>k.openNode(e)))})();let M="",O=0,A=0,L=0,I=!1;try{ +for(R.matcher.considerAll();;){ +L++,I?I=!1:R.matcher.considerAll(),R.matcher.lastIndex=A +;const e=R.matcher.exec(t);if(!e)break;const n=x(t.substring(A,e.index),e) +;A=e.index+n}return x(t.substr(A)),k.closeAllNodes(),k.finalize(),y=k.toHTML(),{ +relevance:Math.floor(O),value:y,language:e,illegal:!1,emitter:k,top:R}}catch(n){ +if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{ +msg:n.message,context:t.slice(A-100,A+100),mode:n.mode},sofar:y,relevance:0, +value:G(t),emitter:k};if(r)return{illegal:!1,relevance:0,value:G(t),emitter:k, +language:e,top:R,errorRaised:n};throw n}}function p(e,t){ +t=t||u.languages||Object.keys(n);const i=(e=>{const t={relevance:0, +emitter:new u.__emitter(u),value:G(e),illegal:!1,top:g} +;return t.emitter.addText(e),t})(e),s=t.filter(N).filter(k).map((t=>f(t,e,!1))) +;s.unshift(i);const a=s.sort(((e,t)=>{ +if(e.relevance!==t.relevance)return t.relevance-e.relevance +;if(e.language&&t.language){if(N(e.language).supersetOf===t.language)return 1 +;if(N(t.language).supersetOf===e.language)return-1}return 0})),[r,l]=a,o=r +;return o.second_best=l,o}const m={"before:highlightElement":({el:e})=>{ +u.useBR&&(e.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")) +},"after:highlightElement":({result:e})=>{ +u.useBR&&(e.value=e.value.replace(/\n/g,"
"))}},b=/^(<[^>]+>|\t)+/gm,E={ +"after:highlightElement":({result:e})=>{ +u.tabReplace&&(e.value=e.value.replace(b,(e=>e.replace(/\t/g,u.tabReplace))))}} +;function x(e){let t=null;const n=(e=>{let t=e.className+" " +;t+=e.parentNode?e.parentNode.className:"";const n=u.languageDetectRe.exec(t) +;if(n){const t=N(n[1]) +;return t||(z(o.replace("{}",n[1])),z("Falling back to no-highlight mode for this block.",e)), +t?n[1]:"no-highlight"}return t.split(/\s+/).find((e=>h(e)||N(e)))})(e) +;if(h(n))return;M("before:highlightElement",{el:e,language:n}),t=e +;const i=t.textContent,a=n?d(i,{language:n,ignoreIllegals:!0}):p(i) +;M("after:highlightElement",{el:e,result:a,text:i +}),e.innerHTML=a.value,((e,t,n)=>{const i=t?s[t]:n +;e.classList.add("hljs"),i&&e.classList.add(i)})(e,n,a.language),e.result={ +language:a.language,re:a.relevance,relavance:a.relevance +},a.second_best&&(e.second_best={language:a.second_best.language, +re:a.second_best.relevance,relavance:a.second_best.relevance})}const v=()=>{ +v.called||(v.called=!0, +K("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead."), +document.querySelectorAll("pre code").forEach(x))};let w=!1;function y(){ +"loading"!==document.readyState?document.querySelectorAll("pre code").forEach(x):w=!0 +}function N(e){return e=(e||"").toLowerCase(),n[e]||n[s[e]]} +function R(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +s[e.toLowerCase()]=t}))}function k(e){const t=N(e) +;return t&&!t.disableAutodetect}function M(e,t){const n=e;a.forEach((e=>{ +e[n]&&e[n](t)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +w&&y()}),!1),Object.assign(e,{highlight:d,highlightAuto:p,highlightAll:y, +fixMarkup:e=>{ +return K("10.2.0","fixMarkup will be removed entirely in v11.0"),K("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"), +t=e, +u.tabReplace||u.useBR?t.replace(l,(e=>"\n"===e?u.useBR?"
":e:u.tabReplace?e.replace(/\t/g,u.tabReplace):e)):t +;var t},highlightElement:x, +highlightBlock:e=>(K("10.7.0","highlightBlock will be removed entirely in v12.0"), +K("10.7.0","Please use highlightElement now."),x(e)),configure:e=>{ +e.useBR&&(K("10.3.0","'useBR' will be removed entirely in v11.0"), +K("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")), +u=V(u,e)},initHighlighting:v,initHighlightingOnLoad:()=>{ +K("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."), +w=!0},registerLanguage:(t,i)=>{let s=null;try{s=i(e)}catch(e){ +if(U("Language definition for '{}' could not be registered.".replace("{}",t)), +!r)throw e;U(e),s=g} +s.name||(s.name=t),n[t]=s,s.rawDefinition=i.bind(null,e),s.aliases&&R(s.aliases,{ +languageName:t})},unregisterLanguage:e=>{delete n[e] +;for(const t of Object.keys(s))s[t]===e&&delete s[t]}, +listLanguages:()=>Object.keys(n),getLanguage:N,registerAliases:R, +requireLanguage:e=>{ +K("10.4.0","requireLanguage will be removed entirely in v11."), +K("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844") +;const t=N(e);if(t)return t +;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))}, +autoDetection:k,inherit:V,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ +e["before:highlightBlock"](Object.assign({block:t.el},t)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ +e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),a.push(e)}, +vuePlugin:P(e).VuePlugin}),e.debugMode=()=>{r=!1},e.safeMode=()=>{r=!0 +},e.versionString="10.7.2";for(const e in _)"object"==typeof _[e]&&t(_[e]) +;return Object.assign(e,_),e.addPlugin(m),e.addPlugin(D),e.addPlugin(E),e})({}) +}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); +hljs.registerLanguage("apache",(()=>{"use strict";return e=>{const n={ +className:"number",begin:/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?/} +;return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0, +contains:[e.HASH_COMMENT_MODE,{className:"section",begin:/<\/?/,end:/>/, +contains:[n,{className:"number",begin:/:\d{1,5}/ +},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute", +begin:/\w+/,relevance:0,keywords:{ +nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername" +},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"}, +contains:[{className:"meta",begin:/\s\[/,end:/\]$/},{className:"variable", +begin:/[\$%]\{/,end:/\}/,contains:["self",{className:"number",begin:/[$%]\d+/}] +},n,{className:"number",begin:/\d+/},e.QUOTE_STRING_MODE]}}],illegal:/\S/}} +})()); +hljs.registerLanguage("bash",(()=>{"use strict";function e(...e){ +return e.map((e=>{return(s=e)?"string"==typeof s?s:s.source:null;var s +})).join("")}return s=>{const n={},t={begin:/\$\{/,end:/\}/,contains:["self",{ +begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{ +begin:e(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},t]});const a={ +className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},i={ +begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/, +end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/, +contains:[s.BACKSLASH_ESCAPE,n,a]};a.contains.push(c);const o={begin:/\$\(\(/, +end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,n] +},r=s.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 +}),l={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, +contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ +name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/, +keyword:"if then else elif fi for while in do done case esac function", +literal:"true false", +built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp" +},contains:[r,s.SHEBANG(),l,o,s.HASH_COMMENT_MODE,i,c,{className:"",begin:/\\"/ +},{className:"string",begin:/'/,end:/'/},n]}}})()); +hljs.registerLanguage("c",(()=>{"use strict";function e(e){ +return((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(",e,")?") +}return t=>{const n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),r="[a-zA-Z_]\\w*::",a="(decltype\\(auto\\)|"+e(r)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",i={ +className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string", +variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", +contains:[t.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},t.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},t.inherit(s,{className:"meta-string"}),{ +className:"meta-string",begin:/<.*?>/},n,t.C_BLOCK_COMMENT_MODE]},l={ +className:"title",begin:e(r)+t.IDENT_RE,relevance:0 +},d=e(r)+t.IDENT_RE+"\\s*\\(",u={ +keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", +built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary", +literal:"true false nullptr NULL"},m=[c,i,n,t.C_BLOCK_COMMENT_MODE,o,s],p={ +variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ +beginKeywords:"new throw return else",end:/;/}],keywords:u,contains:m.concat([{ +begin:/\(/,end:/\)/,keywords:u,contains:m.concat(["self"]),relevance:0}]), +relevance:0},_={className:"function",begin:"("+a+"[\\*&\\s]+)+"+d, +returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:u,illegal:/[^\w\s\*&:<>.]/, +contains:[{begin:"decltype\\(auto\\)",keywords:u,relevance:0},{begin:d, +returnBegin:!0,contains:[l],relevance:0},{className:"params",begin:/\(/, +end:/\)/,keywords:u,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,s,o,i,{ +begin:/\(/,end:/\)/,keywords:u,relevance:0, +contains:["self",n,t.C_BLOCK_COMMENT_MODE,s,o,i]}] +},i,n,t.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, +disableAutodetect:!0,illegal:"",keywords:u,contains:["self",i]},{begin:t.IDENT_RE+"::",keywords:u},{ +className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, +contains:[{beginKeywords:"final class struct"},t.TITLE_MODE]}]),exports:{ +preprocessor:c,strings:s,keywords:u}}}})()); +hljs.registerLanguage("coffeescript",(()=>{"use strict" +;const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) +;return r=>{const t={ +keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((i=["var","const","let","function","static"], +e=>!i.includes(e))),literal:n.concat(["yes","no","on","off"]), +built_in:a.concat(["npm","print"])};var i;const s="[A-Za-z$_][0-9A-Za-z$_]*",o={ +className:"subst",begin:/#\{/,end:/\}/,keywords:t +},c=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?", +relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/, +contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE] +},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,o]},{begin:/"/,end:/"/, +contains:[r.BACKSLASH_ESCAPE,o]}]},{className:"regexp",variants:[{begin:"///", +end:"///",contains:[o,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)", +relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+s +},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{ +begin:"```",end:"```"},{begin:"`",end:"`"}]}];o.contains=c +;const l=r.inherit(r.TITLE_MODE,{begin:s}),d="(\\(.*\\)\\s*)?\\B[-=]>",g={ +className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/, +end:/\)/,keywords:t,contains:["self"].concat(c)}]};return{name:"CoffeeScript", +aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/, +contains:c.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{ +className:"function",begin:"^\\s*"+s+"\\s*=\\s*"+d,end:"[-=]>",returnBegin:!0, +contains:[l,g]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function", +begin:d,end:"[-=]>",returnBegin:!0,contains:[g]}]},{className:"class", +beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{ +beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[l]},l] +},{begin:s+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}})()); +hljs.registerLanguage("cpp",(()=>{"use strict";function e(e){ +return t("(",e,")?")}function t(...e){return e.map((e=>{ +return(t=e)?"string"==typeof t?t:t.source:null;var t})).join("")}return n=>{ +const r=n.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),a="[a-zA-Z_]\\w*::",i="(decltype\\(auto\\)|"+e(a)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",s={ +className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string", +variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", +contains:[n.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},n.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},n.inherit(c,{className:"meta-string"}),{ +className:"meta-string",begin:/<.*?>/},r,n.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:e(a)+n.IDENT_RE,relevance:0 +},u=e(a)+n.IDENT_RE+"\\s*\\(",m={ +keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", +built_in:"_Bool _Complex _Imaginary", +_relevance_hints:["asin","atan2","atan","calloc","ceil","cosh","cos","exit","exp","fabs","floor","fmod","fprintf","fputs","free","frexp","auto_ptr","deque","list","queue","stack","vector","map","set","pair","bitset","multiset","multimap","unordered_set","fscanf","future","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","tolower","toupper","labs","ldexp","log10","log","malloc","realloc","memchr","memcmp","memcpy","memset","modf","pow","printf","putchar","puts","scanf","sinh","sin","snprintf","sprintf","sqrt","sscanf","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","tanh","tan","unordered_map","unordered_multiset","unordered_multimap","priority_queue","make_pair","array","shared_ptr","abort","terminate","abs","acos","vfprintf","vprintf","vsprintf","endl","initializer_list","unique_ptr","complex","imaginary","std","string","wstring","cin","cout","cerr","clog","stdin","stdout","stderr","stringstream","istringstream","ostringstream"], +literal:"true false nullptr NULL"},p={className:"function.dispatch",relevance:0, +keywords:m, +begin:t(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!while)/,n.IDENT_RE,(_=/\s*\(/, +t("(?=",_,")")))};var _;const g=[p,l,s,r,n.C_BLOCK_COMMENT_MODE,o,c],b={ +variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ +beginKeywords:"new throw return else",end:/;/}],keywords:m,contains:g.concat([{ +begin:/\(/,end:/\)/,keywords:m,contains:g.concat(["self"]),relevance:0}]), +relevance:0},f={className:"function",begin:"("+i+"[\\*&\\s]+)+"+u, +returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:m,illegal:/[^\w\s\*&:<>.]/, +contains:[{begin:"decltype\\(auto\\)",keywords:m,relevance:0},{begin:u, +returnBegin:!0,contains:[d],relevance:0},{begin:/::/,relevance:0},{begin:/:/, +endsWithParent:!0,contains:[c,o]},{className:"params",begin:/\(/,end:/\)/, +keywords:m,relevance:0,contains:[r,n.C_BLOCK_COMMENT_MODE,c,o,s,{begin:/\(/, +end:/\)/,keywords:m,relevance:0,contains:["self",r,n.C_BLOCK_COMMENT_MODE,c,o,s] +}]},s,r,n.C_BLOCK_COMMENT_MODE,l]};return{name:"C++", +aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:m,illegal:"",keywords:m,contains:["self",s]},{begin:n.IDENT_RE+"::",keywords:m},{ +className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, +contains:[{beginKeywords:"final class struct"},n.TITLE_MODE]}]),exports:{ +preprocessor:l,strings:c,keywords:m}}}})()); +hljs.registerLanguage("csharp",(()=>{"use strict";return e=>{const n={ +keyword:["abstract","as","base","break","case","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), +built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], +literal:["default","false","null","true"]},a=e.inherit(e.TITLE_MODE,{ +begin:"[a-zA-Z](\\.?\\w)*"}),i={className:"number",variants:[{ +begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] +},t=e.inherit(s,{illegal:/\n/}),r={className:"subst",begin:/\{/,end:/\}/, +keywords:n},l=e.inherit(r,{illegal:/\n/}),c={className:"string",begin:/\$"/, +end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ +},e.BACKSLASH_ESCAPE,l]},o={className:"string",begin:/\$@"/,end:'"',contains:[{ +begin:/\{\{/},{begin:/\}\}/},{begin:'""'},r]},d=e.inherit(o,{illegal:/\n/, +contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},l]}) +;r.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.C_BLOCK_COMMENT_MODE], +l.contains=[d,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.inherit(e.C_BLOCK_COMMENT_MODE,{ +illegal:/\n/})];const g={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},a] +},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={ +begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], +keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, +contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ +begin:"\x3c!--|--\x3e"},{begin:""}]}] +}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", +end:"$",keywords:{ +"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum" +}},g,i,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, +illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" +},a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", +relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[a,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", +begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ +className:"meta-string",begin:/"/,end:/"/}]},{ +beginKeywords:"new return throw await else",relevance:0},{className:"function", +begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(<.+>\\s*)?\\(",returnBegin:!0, +end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", +relevance:0},{begin:e.IDENT_RE+"\\s*(<.+>\\s*)?\\(",returnBegin:!0, +contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/, +excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, +contains:[g,i,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}})()); +hljs.registerLanguage("css",(()=>{"use strict" +;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],r=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() +;return n=>{const a=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, +HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, +ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, +illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} +}))(n),l=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS", +case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"}, +classNameAliases:{keyframePosition:"selector-tag"}, +contains:[n.C_BLOCK_COMMENT_MODE,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ +},n.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 +},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 +},a.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ +begin:":("+i.join("|")+")"},{begin:"::("+o.join("|")+")"}]},{ +className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{begin:":",end:"[;}]", +contains:[a.HEXCOLOR,a.IMPORTANT,n.CSS_NUMBER_MODE,...l,{ +begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" +},contains:[{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}] +},{className:"built_in",begin:/[\w-]+(?=\()/}]},{ +begin:(s=/@/,((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(?=",s,")")), +end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword", +begin:/@-?\w[\w]*(-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0, +relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only", +attribute:t.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute" +},...l,n.CSS_NUMBER_MODE]}]},{className:"selector-tag", +begin:"\\b("+e.join("|")+")\\b"}]};var s}})()); +hljs.registerLanguage("diff",(()=>{"use strict";return e=>({name:"Diff", +aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{ +begin:/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{ +begin:/^--- +\d+,\d+ +----$/}]},{className:"comment",variants:[{begin:/Index: /, +end:/$/},{begin:/^index/,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^-{3}/,end:/$/ +},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/},{ +begin:/^diff --git/,end:/$/}]},{className:"addition",begin:/^\+/,end:/$/},{ +className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, +end:/$/}]})})()); +hljs.registerLanguage("go",(()=>{"use strict";return e=>{const n={ +keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune", +literal:"true false iota nil", +built_in:"append cap close complex copy imag len make new panic print println real recover delete" +};return{name:"Go",aliases:["golang"],keywords:n,illegal:"{"use strict";function e(...e){ +return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n +})).join("")}return n=>{const a="HTTP/(2|1\\.[01])",s={className:"attribute", +begin:e("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{ +className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]} +},t=[s,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{ +name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+a+" \\d{3})", +end:/$/,contains:[{className:"meta",begin:a},{className:"number", +begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:t}},{ +begin:"(?=^[A-Z]+ (.*?) "+a+"$)",end:/$/,contains:[{className:"string", +begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:a},{ +className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:t} +},n.inherit(s,{relevance:0})]}}})()); +hljs.registerLanguage("ini",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(...n){ +return n.map((n=>e(n))).join("")}return s=>{const a={className:"number", +relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{begin:s.NUMBER_RE}] +},i=s.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];const t={ +className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)\}/ +}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={ +className:"string",contains:[s.BACKSLASH_ESCAPE],variants:[{begin:"'''", +end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"' +},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,a,"self"], +relevance:0 +},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map((n=>e(n))).join("|")+")" +;return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, +contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{ +begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr", +starts:{end:/$/,contains:[i,c,r,t,l,a]}}]}}})()); +hljs.registerLanguage("java",(()=>{"use strict" +;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ +className:"number",variants:[{ +begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ +begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};return e=>{ +var n="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s={ +className:"meta",begin:"@[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*", +contains:[{begin:/\(/,end:/\)/,contains:["self"]}]};const r=a;return{ +name:"Java",aliases:["jsp"],keywords:n,illegal:/<\/|#/, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, +relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ +begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ +className:"class",beginKeywords:"class interface enum",end:/[{;=]/, +excludeEnd:!0,relevance:1,keywords:"class interface enum",illegal:/[:"\[\]]/, +contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"new throw return else",relevance:0},{className:"class", +begin:"record\\s+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,excludeEnd:!0, +end:/[{;=]/,keywords:n,contains:[{beginKeywords:"record"},{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, +keywords:n,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"function", +begin:"([\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(<[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(\\s*,\\s*[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(", +returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, +keywords:n,relevance:0, +contains:[s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,r,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},r,s]}}})()); +hljs.registerLanguage("javascript",(()=>{"use strict" +;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) +;function r(e){return t("(?=",e,")")}function t(...e){return e.map((e=>{ +return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return i=>{ +const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/, +isTrulyOpeningTag:(e,n)=>{const a=e[0].length+e.index,s=e.input[a] +;"<"!==s?">"===s&&(((e,{after:n})=>{const a="", +returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{ +begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0 +},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:f}]}] +},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{ +variants:[{begin:"<>",end:""},{begin:o.begin,"on:begin":o.isTrulyOpeningTag, +end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0, +contains:["self"]}]}],relevance:0},{className:"function", +beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l, +contains:["self",i.inherit(i.TITLE_MODE,{begin:c}),p],illegal:/%/},{ +beginKeywords:"while if switch catch for"},{className:"function", +begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,contains:[p,i.inherit(i.TITLE_MODE,{begin:c})]},{variants:[{ +begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class", +beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{ +beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/, +end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:c}),"self",p] +},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set", +contains:[i.inherit(i.TITLE_MODE,{begin:c}),{begin:/\(\)/},p]},{begin:/\$[(.]/}] +}}})()); +hljs.registerLanguage("json",(()=>{"use strict";return n=>{const e={ +literal:"true false null" +},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],a=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],l={ +end:",",endsWithParent:!0,excludeEnd:!0,contains:a,keywords:e},t={begin:/\{/, +end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/, +contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(l,{begin:/:/ +})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(l)], +illegal:"\\S"};return a.push(t,s),i.forEach((n=>{a.push(n)})),{name:"JSON", +contains:a,keywords:e,illegal:"\\S"}}})()); +hljs.registerLanguage("kotlin",(()=>{"use strict" +;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ +className:"number",variants:[{ +begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ +begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};return e=>{const n={ +keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", +built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", +literal:"true false null"},i={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" +},s={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},t={ +className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", +variants:[{begin:'"""',end:'"""(?=[^"])',contains:[t,s]},{begin:"'",end:"'", +illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, +contains:[e.BACKSLASH_ESCAPE,t,s]}]};s.contains.push(r);const l={ +className:"meta", +begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" +},c={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, +end:/\)/,contains:[e.inherit(r,{className:"meta-string"})]}] +},o=a,b=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),E={ +variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, +contains:[]}]},d=E;return d.variants[1].contains=[E],E.variants[1].contains=[d], +{name:"Kotlin",aliases:["kt","kts"],keywords:n, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", +begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,b,{className:"keyword", +begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", +begin:/@\w+/}]}},i,l,c,{className:"function",beginKeywords:"fun",end:"[(]|$", +returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, +keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, +endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, +endsWithParent:!0,contains:[E,e.C_LINE_COMMENT_MODE,b],relevance:0 +},e.C_LINE_COMMENT_MODE,b,l,c,r,e.C_NUMBER_MODE]},b]},{className:"class", +beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, +illegal:"extends implements",contains:[{ +beginKeywords:"public protected internal private constructor" +},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, +excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/, +excludeBegin:!0,returnEnd:!0},l,c]},r,{className:"meta",begin:"^#!/usr/bin/env", +end:"$",illegal:"\n"},o]}}})()); +hljs.registerLanguage("less",(()=>{"use strict" +;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],n=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse(),r=i.concat(o) +;return a=>{const s=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, +HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, +ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, +illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} +}))(a),l=r,d="([\\w-]+|@\\{[\\w-]+\\})",c=[],g=[],b=e=>({className:"string", +begin:"~?"+e+".*?"+e}),m=(e,t,i)=>({className:e,begin:t,relevance:i}),u={ +$pattern:/[a-z-]+/,keyword:"and or not only",attribute:t.join(" ")},p={ +begin:"\\(",end:"\\)",contains:g,keywords:u,relevance:0} +;g.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,b("'"),b('"'),a.CSS_NUMBER_MODE,{ +begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", +excludeEnd:!0} +},s.HEXCOLOR,p,m("variable","@@?[\\w-]+",10),m("variable","@\\{[\\w-]+\\}"),m("built_in","~?`[^`]*?`"),{ +className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0 +},s.IMPORTANT);const f=g.concat({begin:/\{/,end:/\}/,contains:c}),h={ +beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not" +}].concat(g)},w={begin:d+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0, +contains:[{begin:/-(webkit|moz|ms|o)-/},{className:"attribute", +begin:"\\b("+n.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0, +illegal:"[<=$]",relevance:0,contains:g}}]},v={className:"keyword", +begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", +starts:{end:"[;{}]",keywords:u,returnEnd:!0,contains:g,relevance:0}},y={ +className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{ +begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:f}},k={variants:[{ +begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:d,end:/\{/}],returnBegin:!0, +returnEnd:!0,illegal:"[<='$\"]",relevance:0, +contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,h,m("keyword","all\\b"),m("variable","@\\{[\\w-]+\\}"),{ +begin:"\\b("+e.join("|")+")\\b",className:"selector-tag" +},m("selector-tag",d+"%?",0),m("selector-id","#"+d),m("selector-class","\\."+d,0),m("selector-tag","&",0),s.ATTRIBUTE_SELECTOR_MODE,{ +className:"selector-pseudo",begin:":("+i.join("|")+")"},{ +className:"selector-pseudo",begin:"::("+o.join("|")+")"},{begin:"\\(",end:"\\)", +contains:f},{begin:"!important"}]},E={begin:`[\\w-]+:(:)?(${l.join("|")})`, +returnBegin:!0,contains:[k]} +;return c.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,v,y,E,w,k),{ +name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:c}}})()); +hljs.registerLanguage("lua",(()=>{"use strict";return e=>{ +const t="\\[=*\\[",a="\\]=*\\]",n={begin:t,end:a,contains:["self"] +},o=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[",a,{contains:[n], +relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, +literal:"true false nil", +keyword:"and break do else elseif end for goto if in local not or repeat return then until while", +built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" +},contains:o.concat([{className:"function",beginKeywords:"function",end:"\\)", +contains:[e.inherit(e.TITLE_MODE,{ +begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", +begin:"\\(",endsWithParent:!0,contains:o}].concat(o) +},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", +begin:t,end:a,contains:[n],relevance:5}])}}})()); +hljs.registerLanguage("makefile",(()=>{"use strict";return e=>{const i={ +className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} +function a(...n){return n.map((n=>e(n))).join("")}function s(...n){ +return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ +const t=a(/[A-Z_]/,a("(",/[A-Z0-9_.-]*:/,")?"),/[A-Z0-9_.-]*/),i={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},r={begin:/\s/, +contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},c=e.inherit(r,{begin:/\(/,end:/\)/}),l=e.inherit(e.APOS_STRING_MODE,{ +className:"meta-string"}),g=e.inherit(e.QUOTE_STRING_MODE,{ +className:"meta-string"}),m={endsWithParent:!0,illegal:/`]+/}]}] +}]};return{name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,contains:[{className:"meta",begin://, +relevance:10,contains:[r,g,l,c,{begin:/\[/,end:/\]/,contains:[{className:"meta", +begin://,contains:[r,c,g,l]}]}]},e.COMMENT(//,{ +relevance:10}),{begin://,relevance:10},i,{ +className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[m],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[m],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:a(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name", +begin:t,relevance:0,starts:m}]},{className:"tag",begin:a(/<\//,n(a(t,/>/))), +contains:[{className:"name",begin:t,relevance:0},{begin:/>/,relevance:0, +endsParent:!0}]}]}}})()); +hljs.registerLanguage("markdown",(()=>{"use strict";function n(...n){ +return n.map((n=>{return(e=n)?"string"==typeof e?e:e.source:null;var e +})).join("")}return e=>{const a={begin:/<\/?[A-Za-z_]/,end:">", +subLanguage:"xml",relevance:0},i={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0 +},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{begin:n(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.+?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{ +className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},s={className:"strong",contains:[], +variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},c={ +className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{ +begin:/_(?!_)/,end:/_/,relevance:0}]};s.contains.push(c),c.contains.push(s) +;let t=[a,i] +;return s.contains=s.contains.concat(t),c.contains=c.contains.concat(t), +t=t.concat(s,c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:t},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:t}]}]},a,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},s,c,{className:"quote",begin:"^>\\s+",contains:t, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},i,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})()); +hljs.registerLanguage("nginx",(()=>{"use strict";return e=>{const n={ +className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/\}/},{ +begin:/[$@]/+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{ +$pattern:"[a-z/_]+", +literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll" +},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string", +contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/ +}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n] +},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^", +end:"\\s|\\{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|\\{|;",returnEnd:!0},{ +begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number", +begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{ +className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{ +name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{ +begin:e.UNDERSCORE_IDENT_RE+"\\s+\\{",returnBegin:!0,end:/\{/,contains:[{ +className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{ +begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|\\{",returnBegin:!0,contains:[{ +className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}], +illegal:"[^\\s\\}]"}}})()); +hljs.registerLanguage("objectivec",(()=>{"use strict";return e=>{ +const n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n, +keyword:"@interface @class @protocol @implementation"};return{ +name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], +keywords:{$pattern:n, +keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN", +literal:"false true FALSE TRUE nil YES NO NULL", +built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once" +},illegal:"/,end:/$/, +illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:/(\{|$)/, +excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{ +begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}})()); +hljs.registerLanguage("perl",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(...n){ +return n.map((n=>e(n))).join("")}function t(...n){ +return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ +const r=/[dualxmsipngr]{0,12}/,s={$pattern:/[\w.]+/, +keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" +},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:s},a={begin:/->\{/, +end:/\}/},o={variants:[{begin:/\$\d/},{ +begin:n(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])") +},{begin:/[$%@][^\s\w{]/,relevance:0}] +},c=[e.BACKSLASH_ESCAPE,i,o],g=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],l=(e,t,s="\\1")=>{ +const i="\\1"===s?s:n(s,t) +;return n(n("(?:",e,")"),t,/(?:\\.|[^\\\/])*?/,i,/(?:\\.|[^\\\/])*?/,s,r) +},d=(e,t,s)=>n(n("(?:",e,")"),t,/(?:\\.|[^\\\/])*?/,s,r),p=[o,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{ +endsWithParent:!0}),a,{className:"string",contains:c,variants:[{ +begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[", +end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{ +begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">", +relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'", +contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{ +begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number", +begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b", +relevance:0},{ +begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*", +keywords:"split return print reverse grep",relevance:0, +contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{ +begin:l("s|tr|y",t(...g))},{begin:l("s|tr|y","\\(","\\)")},{ +begin:l("s|tr|y","\\[","\\]")},{begin:l("s|tr|y","\\{","\\}")}],relevance:2},{ +className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{ +begin:d("(?:m|qr)?",/\//,/\//)},{begin:d("m|qr",t(...g),/\1/)},{ +begin:d("m|qr",/\(/,/\)/)},{begin:d("m|qr",/\[/,/\]/)},{ +begin:d("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub", +end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{ +begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$", +subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}] +}];return i.contains=p,a.contains=p,{name:"Perl",aliases:["pl","pm"],keywords:s, +contains:p}}})()); +hljs.registerLanguage("php",(()=>{"use strict";return e=>{const r={ +className:"variable", +begin:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?![A-Za-z0-9])(?![$])"},t={ +className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{ +begin:/\?>/}]},a={className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/, +end:/\}/}]},n=e.inherit(e.APOS_STRING_MODE,{illegal:null +}),i=e.inherit(e.QUOTE_STRING_MODE,{illegal:null, +contains:e.QUOTE_STRING_MODE.contains.concat(a)}),o=e.END_SAME_AS_BEGIN({ +begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/, +contains:e.QUOTE_STRING_MODE.contains.concat(a)}),l={className:"string", +contains:[e.BACKSLASH_ESCAPE,t],variants:[e.inherit(n,{begin:"b'",end:"'" +}),e.inherit(i,{begin:'b"',end:'"'}),i,n,o]},s={className:"number",variants:[{ +begin:"\\b0b[01]+(?:_[01]+)*\\b"},{begin:"\\b0o[0-7]+(?:_[0-7]+)*\\b"},{ +begin:"\\b0x[\\da-f]+(?:_[\\da-f]+)*\\b"},{ +begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:e[+-]?\\d+)?" +}],relevance:0},c={ +keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile enum eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list match|0 mixed new object or private protected public real return string switch throw trait try unset use var void while xor yield", +literal:"false null true", +built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException UnhandledMatchError ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Stringable Throwable Traversable WeakReference WeakMap Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass" +};return{aliases:["php3","php4","php5","php6","php7","php8"], +case_insensitive:!0,keywords:c, +contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t] +}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}] +}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0, +keywords:"__halt_compiler"}),t,{className:"keyword",begin:/\$this\b/},r,{ +begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function", +relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0, +illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{ +begin:"=>",endsParent:!0},{className:"params",begin:"\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0,keywords:c, +contains:["self",r,e.C_BLOCK_COMMENT_MODE,l,s]}]},{className:"class",variants:[{ +beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", +illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ +beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, +contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",relevance:0,end:";", +contains:[e.UNDERSCORE_TITLE_MODE]},l,s]}}})()); +hljs.registerLanguage("php-template",(()=>{"use strict";return n=>({ +name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/, +subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"', +end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{ +illegal:null,className:null,contains:null,skip:!0 +}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null, +skip:!0})]}]})})()); +hljs.registerLanguage("plaintext",(()=>{"use strict";return t=>({ +name:"Plain text",aliases:["text","txt"],disableAutodetect:!0})})()); +hljs.registerLanguage("properties",(()=>{"use strict";return e=>{ +var n="[ \\t\\f]*",a=n+"[:=]"+n,t="("+a+"|[ \\t\\f]+)",r="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",s="([^\\\\:= \\t\\f\\n]|\\\\.)+",i={ +end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{ +begin:"\\\\\\\\"},{begin:"\\\\\\n"}]}};return{name:".properties", +case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{ +returnBegin:!0,variants:[{begin:r+a,relevance:1},{begin:r+"[ \\t\\f]+", +relevance:0}],contains:[{className:"attr",begin:r,endsParent:!0,relevance:0}], +starts:i},{begin:s+t,returnBegin:!0,relevance:0,contains:[{className:"meta", +begin:s,endsParent:!0,relevance:0}],starts:i},{className:"attr",relevance:0, +begin:s+n+"$"}]}}})()); +hljs.registerLanguage("python",(()=>{"use strict";return e=>{const n={ +$pattern:/[A-Za-z]\w+|__\w+__/, +keyword:["and","as","assert","async","await","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"], +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/, +end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},t={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},r="[0-9](_?[0-9])*",l=`(\\b(${r}))?\\.(${r})|\\b(${r})\\.`,b={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${r})|(${l}))[eE][+-]?(${r})[jJ]?\\b`},{begin:`(${l})[jJ]?`},{ +begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?\\b"},{ +begin:"\\b0[bB](_?[01])+[lL]?\\b"},{begin:"\\b0[oO](_?[0-7])+[lL]?\\b"},{ +begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?\\b"},{begin:`\\b(${r})[jJ]\\b`}]},o={ +className:"comment", +begin:(d=/# type:/,((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(?=",d,")")), +end:/$/,keywords:n,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/, +endsWithParent:!0}]},c={className:"params",variants:[{className:"", +begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0, +keywords:n,contains:["self",a,b,t,e.HASH_COMMENT_MODE]}]};var d +;return i.contains=[t,b,a],{name:"Python",aliases:["py","gyp","ipython"], +keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,b,{begin:/\bself\b/},{ +beginKeywords:"if",relevance:0},t,o,e.HASH_COMMENT_MODE,{variants:[{ +className:"function",beginKeywords:"def"},{className:"class", +beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/, +contains:[e.UNDERSCORE_TITLE_MODE,c,{begin:/->/,endsWithParent:!0,keywords:n}] +},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[b,c,t]}]}}})()); +hljs.registerLanguage("python-repl",(()=>{"use strict";return s=>({ +aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$", +subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{ +begin:/^\.\.\.(?=[ ]|$)/}]}]})})()); +hljs.registerLanguage("r",(()=>{"use strict";function e(...e){return e.map((e=>{ +return(a=e)?"string"==typeof a?a:a.source:null;var a})).join("")}return a=>{ +const n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/;return{name:"R", +illegal:/->/,keywords:{$pattern:n, +keyword:"function if in break next repeat else for while", +literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", +built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" +},compilerExtensions:[(a,n)=>{if(!a.beforeMatch)return +;if(a.starts)throw Error("beforeMatch cannot be used with starts") +;const i=Object.assign({},a);Object.keys(a).forEach((e=>{delete a[e] +})),a.begin=e(i.beforeMatch,e("(?=",i.begin,")")),a.starts={relevance:0, +contains:[Object.assign(i,{endsParent:!0})]},a.relevance=0,delete i.beforeMatch +}],contains:[a.COMMENT(/#'/,/$/,{contains:[{className:"doctag", +begin:"@examples",starts:{contains:[{begin:/\n/},{begin:/#'\s*(?=@[a-zA-Z]+)/, +endsParent:!0},{begin:/#'/,end:/$/,excludeBegin:!0}]}},{className:"doctag", +begin:"@param",end:/$/,contains:[{className:"variable",variants:[{begin:n},{ +begin:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{className:"doctag", +begin:/@[a-zA-Z]+/},{className:"meta-keyword",begin:/\\[a-zA-Z]+/}] +}),a.HASH_COMMENT_MODE,{className:"string",contains:[a.BACKSLASH_ESCAPE], +variants:[a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', +relevance:0},{begin:"'",end:"'",relevance:0}]},{className:"number",relevance:0, +beforeMatch:/([^a-zA-Z0-9._])/,variants:[{ +match:/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/},{ +match:/0[xX][0-9a-fA-F]+([pP][+-]?\d+)?[Li]?/},{ +match:/(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?[Li]?/}]},{begin:"%",end:"%"},{ +begin:e(/[a-zA-Z][a-zA-Z_0-9]*/,"\\s+<-\\s+")},{begin:"`",end:"`",contains:[{ +begin:/\\./}]}]}}})()); +hljs.registerLanguage("ruby",(()=>{"use strict";function e(...e){ +return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n +})).join("")}return n=>{ +const a="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",i={ +keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor __FILE__", +built_in:"proc lambda",literal:"true false nil"},s={className:"doctag", +begin:"@[A-Za-z]+"},r={begin:"#<",end:">"},b=[n.COMMENT("#","$",{contains:[s] +}),n.COMMENT("^=begin","^=end",{contains:[s],relevance:10 +}),n.COMMENT("^__END__","\\n$")],c={className:"subst",begin:/#\{/,end:/\}/, +keywords:i},t={className:"string",contains:[n.BACKSLASH_ESCAPE,c],variants:[{ +begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/, +end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{ +begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/, +end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{ +begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{ +begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ +begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ +begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ +begin:/<<[-~]?'?(\w+)\n(?:[^\n]*\n)*?\s*\1\b/,returnBegin:!0,contains:[{ +begin:/<<[-~]?'?/},n.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, +contains:[n.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",d={className:"number", +relevance:0,variants:[{ +begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ +begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" +},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ +begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ +begin:"\\b0(_?[0-7])+r?i?\\b"}]},l={className:"params",begin:"\\(",end:"\\)", +endsParent:!0,keywords:i},o=[t,{className:"class",beginKeywords:"class module", +end:"$|;",illegal:/=/,contains:[n.inherit(n.TITLE_MODE,{ +begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|!)?"}),{begin:"<\\s*",contains:[{ +begin:"("+n.IDENT_RE+"::)?"+n.IDENT_RE,relevance:0}]}].concat(b)},{ +className:"function",begin:e(/def\s+/,(_=a+"\\s*(\\(|;|$)",e("(?=",_,")"))), +relevance:0,keywords:"def",end:"$|;",contains:[n.inherit(n.TITLE_MODE,{begin:a +}),l].concat(b)},{begin:n.IDENT_RE+"::"},{className:"symbol", +begin:n.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", +begin:":(?!\\s)",contains:[t,{begin:a}],relevance:0},d,{className:"variable", +begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ +className:"params",begin:/\|/,end:/\|/,relevance:0,keywords:i},{ +begin:"("+n.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{ +className:"regexp",contains:[n.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{ +begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(", +end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}] +}].concat(r,b),relevance:0}].concat(r,b);var _;c.contains=o,l.contains=o +;const E=[{begin:/^\s*=>/,starts:{end:"$",contains:o}},{className:"meta", +begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", +starts:{end:"$",contains:o}}];return b.unshift(r),{name:"Ruby", +aliases:["rb","gemspec","podspec","thor","irb"],keywords:i,illegal:/\/\*/, +contains:[n.SHEBANG({binary:"ruby"})].concat(E).concat(b).concat(o)}}})()); +hljs.registerLanguage("rust",(()=>{"use strict";return e=>{ +const n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!" +;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?", +keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield", +literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}})()); +hljs.registerLanguage("scss",(()=>{"use strict" +;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],r=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() +;return a=>{const n=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, +HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, +ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, +illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} +}))(a),l=o,s=i,d="@[a-z-]+",c={className:"variable", +begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"};return{name:"SCSS",case_insensitive:!0, +illegal:"[=/|']",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{ +className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ +className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 +},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", +begin:"\\b("+e.join("|")+")\\b",relevance:0},{className:"selector-pseudo", +begin:":("+s.join("|")+")"},{className:"selector-pseudo", +begin:"::("+l.join("|")+")"},c,{begin:/\(/,end:/\)/,contains:[a.CSS_NUMBER_MODE] +},{className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{ +begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" +},{begin:":",end:";", +contains:[c,n.HEXCOLOR,a.CSS_NUMBER_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,n.IMPORTANT] +},{begin:"@(page|font-face)",lexemes:d,keywords:"@page @font-face"},{begin:"@", +end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, +keyword:"and or not only",attribute:t.join(" ")},contains:[{begin:d, +className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" +},c,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,n.HEXCOLOR,a.CSS_NUMBER_MODE]}]}} +})()); +hljs.registerLanguage("shell",(()=>{"use strict";return s=>({ +name:"Shell Session",aliases:["console"],contains:[{className:"meta", +begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#]/,starts:{end:/[^\\](?=\s*$)/, +subLanguage:"bash"}}]})})()); +hljs.registerLanguage("sql",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function r(...r){ +return r.map((r=>e(r))).join("")}function t(...r){ +return"("+r.map((r=>e(r))).join("|")+")"}return e=>{ +const n=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],s=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],o=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],c=s,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update ","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!s.includes(e))),u={ +begin:r(/\b/,t(...c),/\s*\(/),keywords:{built_in:c}};return{name:"SQL", +case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/, +keyword:((e,{exceptions:r,when:t}={})=>{const n=t +;return r=r||[],e.map((e=>e.match(/\|\d+$/)||r.includes(e)?e:n(e)?e+"|0":e)) +})(l,{when:e=>e.length<3}),literal:a,type:i, +built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] +},contains:[{begin:t(...o),keywords:{$pattern:/[\w\.]+/,keyword:l.concat(o), +literal:a,type:i}},{className:"type", +begin:t("double precision","large object","with timezone","without timezone") +},u,{className:"variable",begin:/@[a-z0-9]+/},{className:"string",variants:[{ +begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/,contains:[{ +begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,n,{className:"operator", +begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}})()); +hljs.registerLanguage("swift",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} +function a(...n){return n.map((n=>e(n))).join("")}function t(...n){ +return"("+n.map((n=>e(n))).join("|")+")"} +const i=e=>a(/\b/,e,/\w$/.test(e)?/\b/:/\B/),s=["Protocol","Type"].map(i),u=["init","self"].map(i),c=["Any","Self"],r=["associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],o=["false","nil","true"],l=["assignment","associativity","higherThan","left","lowerThan","none","right"],m=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],d=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],p=t(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),F=t(p,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),b=a(p,F,"*"),h=t(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),f=t(h,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),w=a(h,f,"*"),y=a(/[A-Z]/,f,"*"),g=["autoclosure",a(/convention\(/,t("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",a(/objc\(/,w,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","testable","UIApplicationMain","unknown","usableFromInline"],E=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] +;return e=>{const p={match:/\s+/,relevance:0},h=e.COMMENT("/\\*","\\*/",{ +contains:["self"]}),v=[e.C_LINE_COMMENT_MODE,h],N={className:"keyword", +begin:a(/\./,n(t(...s,...u))),end:t(...s,...u),excludeBegin:!0},A={ +match:a(/\./,t(...r)),relevance:0 +},C=r.filter((e=>"string"==typeof e)).concat(["_|0"]),_={variants:[{ +className:"keyword", +match:t(...r.filter((e=>"string"!=typeof e)).concat(c).map(i),...u)}]},D={ +$pattern:t(/\b\w+/,/#\w+/),keyword:C.concat(m),literal:o},B=[N,A,_],k=[{ +match:a(/\./,t(...d)),relevance:0},{className:"built_in", +match:a(/\b/,t(...d),/(?=\()/)}],M={match:/->/,relevance:0},S=[M,{ +className:"operator",relevance:0,variants:[{match:b},{match:`\\.(\\.|${F})+`}] +}],x="([0-9a-fA-F]_*)+",I={className:"number",relevance:0,variants:[{ +match:"\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b"},{ +match:`\\b0x(${x})(\\.(${x}))?([pP][+-]?(([0-9]_*)+))?\\b`},{ +match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},O=(e="")=>({ +className:"subst",variants:[{match:a(/\\/,e,/[0\\tnr"']/)},{ +match:a(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}]}),T=(e="")=>({className:"subst", +match:a(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),L=(e="")=>({className:"subst", +label:"interpol",begin:a(/\\/,e,/\(/),end:/\)/}),P=(e="")=>({begin:a(e,/"""/), +end:a(/"""/,e),contains:[O(e),T(e),L(e)]}),$=(e="")=>({begin:a(e,/"/), +end:a(/"/,e),contains:[O(e),L(e)]}),K={className:"string", +variants:[P(),P("#"),P("##"),P("###"),$(),$("#"),$("##"),$("###")]},j={ +match:a(/`/,w,/`/)},z=[j,{className:"variable",match:/\$\d+/},{ +className:"variable",match:`\\$${f}+`}],q=[{match:/(@|#)available/, +className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:E, +contains:[...S,I,K]}]}},{className:"keyword",match:a(/@/,t(...g))},{ +className:"meta",match:a(/@/,w)}],U={match:n(/\b[A-Z]/),relevance:0,contains:[{ +className:"type", +match:a(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,f,"+") +},{className:"type",match:y,relevance:0},{match:/[?!]+/,relevance:0},{ +match:/\.\.\./,relevance:0},{match:a(/\s+&\s+/,n(y)),relevance:0}]},Z={ +begin://,keywords:D,contains:[...v,...B,...q,M,U]};U.contains.push(Z) +;const G={begin:/\(/,end:/\)/,relevance:0,keywords:D,contains:["self",{ +match:a(w,/\s*:/),keywords:"_|0",relevance:0 +},...v,...B,...k,...S,I,K,...z,...q,U]},H={beginKeywords:"func",contains:[{ +className:"title",match:t(j.match,w,b),endsParent:!0,relevance:0},p]},R={ +begin://,contains:[...v,U]},V={begin:/\(/,end:/\)/,keywords:D, +contains:[{begin:t(n(a(w,/\s*:/)),n(a(w,/\s+/,w,/\s*:/))),end:/:/,relevance:0, +contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:w}] +},...v,...B,...S,I,K,...q,U,G],endsParent:!0,illegal:/["']/},W={ +className:"function",match:n(/\bfunc\b/),contains:[H,R,V,p],illegal:[/\[/,/%/] +},X={className:"function",match:/\b(subscript|init[?!]?)\s*(?=[<(])/,keywords:{ +keyword:"subscript init init? init!",$pattern:/\w+[?!]?/},contains:[R,V,p], +illegal:/\[|%/},J={beginKeywords:"operator",end:e.MATCH_NOTHING_RE,contains:[{ +className:"title",match:b,endsParent:!0,relevance:0}]},Q={ +beginKeywords:"precedencegroup",end:e.MATCH_NOTHING_RE,contains:[{ +className:"title",match:y,relevance:0},{begin:/{/,end:/}/,relevance:0, +endsParent:!0,keywords:[...l,...o],contains:[U]}]};for(const e of K.variants){ +const n=e.contains.find((e=>"interpol"===e.label));n.keywords=D +;const a=[...B,...k,...S,I,K,...z];n.contains=[...a,{begin:/\(/,end:/\)/, +contains:["self",...a]}]}return{name:"Swift",keywords:D,contains:[...v,W,X,{ +className:"class",beginKeywords:"struct protocol class extension enum", +end:"\\{",excludeEnd:!0,keywords:D,contains:[e.inherit(e.TITLE_MODE,{ +begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...B]},J,Q,{ +beginKeywords:"import",end:/$/,contains:[...v],relevance:0 +},...B,...k,...S,I,K,...z,...q,U,G]}}})()); +hljs.registerLanguage("typescript",(()=>{"use strict" +;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) +;function t(e){return r("(?=",e,")")}function r(...e){return e.map((e=>{ +return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return i=>{ +const c={$pattern:e, +keyword:n.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]), +literal:a, +built_in:s.concat(["any","void","number","boolean","string","object","never","enum"]) +},o={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},l=(e,n,a)=>{ +const s=e.contains.findIndex((e=>e.label===n)) +;if(-1===s)throw Error("can not find mode to replace");e.contains.splice(s,1,a) +},b=(i=>{const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/, +end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ +const a=e[0].length+e.index,s=e.input[a];"<"!==s?">"===s&&(((e,{after:n})=>{ +const a="", +returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{ +begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0 +},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:f}]}] +},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{ +variants:[{begin:"<>",end:""},{begin:o.begin,"on:begin":o.isTrulyOpeningTag, +end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0, +contains:["self"]}]}],relevance:0},{className:"function", +beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l, +contains:["self",i.inherit(i.TITLE_MODE,{begin:c}),A],illegal:/%/},{ +beginKeywords:"while if switch catch for"},{className:"function", +begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,contains:[A,i.inherit(i.TITLE_MODE,{begin:c})]},{variants:[{ +begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class", +beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{ +beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/, +end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:c}),"self",A] +},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set", +contains:[i.inherit(i.TITLE_MODE,{begin:c}),{begin:/\(\)/},A]},{begin:/\$[(.]/}] +}})(i) +;return Object.assign(b.keywords,c),b.exports.PARAMS_CONTAINS.push(o),b.contains=b.contains.concat([o,{ +beginKeywords:"namespace",end:/\{/,excludeEnd:!0},{beginKeywords:"interface", +end:/\{/,excludeEnd:!0,keywords:"interface extends" +}]),l(b,"shebang",i.SHEBANG()),l(b,"use_strict",{className:"meta",relevance:10, +begin:/^\s*['"]use strict['"]/ +}),b.contains.find((e=>"function"===e.className)).relevance=0,Object.assign(b,{ +name:"TypeScript",aliases:["ts","tsx"]}),b}})()); +hljs.registerLanguage("vbnet",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(...n){ +return n.map((n=>e(n))).join("")}function t(...n){ +return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ +const a=/\d{1,2}\/\d{1,2}\/\d{4}/,i=/\d{4}-\d{1,2}-\d{1,2}/,s=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,o={ +className:"literal",variants:[{begin:n(/# */,t(i,a),/ *#/)},{ +begin:n(/# */,r,/ *#/)},{begin:n(/# */,s,/ *#/)},{ +begin:n(/# */,t(i,a),/ +/,t(s,r),/ *#/)}]},l=e.COMMENT(/'''/,/$/,{contains:[{ +className:"doctag",begin:/<\/?/,end:/>/}]}),c=e.COMMENT(null,/$/,{variants:[{ +begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]});return{name:"Visual Basic .NET", +aliases:["vb"],case_insensitive:!0,classNameAliases:{label:"symbol"},keywords:{ +keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", +built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", +type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", +literal:"true false nothing"}, +illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{ +className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/, +end:/"/,illegal:/\n/,contains:[{begin:/""/}]},o,{className:"number",relevance:0, +variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ +},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{ +begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{ +className:"label",begin:/^\w+:/},l,c,{className:"meta", +begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, +end:/$/,keywords:{ +"meta-keyword":"const disable else elseif enable end externalsource if region then" +},contains:[c]}]}}})()); +hljs.registerLanguage("yaml",(()=>{"use strict";return e=>{ +var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*'()[\\]]+",s={ +className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ +},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", +variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(s,{ +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={ +end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},t={begin:/\{/, +end:/\}/,contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]", +contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{ +begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ +begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", +relevance:10},{className:"string", +begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ +begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, +relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type", +begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a +},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", +begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", +relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ +className:"number", +begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" +},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},t,g,s],r=[...b] +;return r.pop(),r.push(i),l.contains=r,{name:"YAML",case_insensitive:!0, +aliases:["yml"],contains:b}}})()); \ No newline at end of file diff --git a/htmlReport/js/highlightjs-line-numbers.min.js b/htmlReport/js/highlightjs-line-numbers.min.js new file mode 100644 index 0000000000..8548576704 --- /dev/null +++ b/htmlReport/js/highlightjs-line-numbers.min.js @@ -0,0 +1,24 @@ +/* +The MIT License (MIT) + +Copyright (c) 2017 Yauheni Pakala + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +!function(r,o){"use strict";var e,i="hljs-ln",l="hljs-ln-line",h="hljs-ln-code",s="hljs-ln-numbers",c="hljs-ln-n",m="data-line-number",a=/\r\n|\r|\n/g;function u(e){for(var n=e.toString(),t=e.anchorNode;"TD"!==t.nodeName;)t=t.parentNode;for(var r=e.focusNode;"TD"!==r.nodeName;)r=r.parentNode;var o=parseInt(t.dataset.lineNumber),a=parseInt(r.dataset.lineNumber);if(o==a)return n;var i,l=t.textContent,s=r.textContent;for(a
{6}',[l,s,c,m,h,o+n.startFrom,0{1}',[i,r])}return e}(e.innerHTML,o)}function v(e){var n=e.className;if(/hljs-/.test(n)){for(var t=g(e.innerHTML),r=0,o="";r{1}
\n',[n,0 + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_BLOCK.html b/htmlReport/ns-1/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..bfffb85983 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_BLOCK.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..a3e4abf83d --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_CLASS.html b/htmlReport/ns-1/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..2716684697 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_CLASS.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..26e8e3baa0 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_LINE.html b/htmlReport/ns-1/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..9ea1c34daa --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_LINE.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..ca030237ff --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_METHOD.html b/htmlReport/ns-1/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..2cc74ffbd8 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_METHOD.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..c7b2c3bb4b --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..43ef8225bf --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-1/sources/source-1.html b/htmlReport/ns-1/sources/source-1.html new file mode 100644 index 0000000000..eae6142e21 --- /dev/null +++ b/htmlReport/ns-1/sources/source-1.html @@ -0,0 +1,136 @@ + + + + + + + Coverage Report > BagPacker + + + + + + +
+ + +

Coverage Summary for Class: BagPacker (bagpacker)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/9) + +
+ +
+
+ + +
+ package bagpacker;
+ 
+ import bagpacker.commands.ByeCommand;
+ import bagpacker.commands.Command;
+ import bagpacker.iohandler.Ui;
+ import bagpacker.iohandler.Parser;
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class BagPacker {
+     private static PackingList packingList;
+     /**
+      * Main entry-point for the java.BagPacker application.
+      */
+     public static void main(String[] args) {
+         // initialise variables
+         BagPacker.packingList = new PackingList();
+         //initialise BagPacker program
+         Ui.initialMessage();
+ 
+         //run main program
+         runBagPacker();
+ 
+         //Close program
+         Ui.goodbyeMessage();
+     }
+ 
+     public static void runBagPacker() {
+         while (ByeCommand.isBagPackerRunning) {
+             Command c = Parser.parse();
+             c.execute(packingList);
+         }
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/index.html b/htmlReport/ns-2/index.html new file mode 100644 index 0000000000..e80459467b --- /dev/null +++ b/htmlReport/ns-2/index.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_BLOCK.html b/htmlReport/ns-2/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..5b3e4bf8b7 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_BLOCK.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..d749010de6 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_CLASS.html b/htmlReport/ns-2/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..a9d565f02d --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_CLASS.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..a27cf69696 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_LINE.html b/htmlReport/ns-2/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..c6197008d7 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_LINE.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..302e3f2c82 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_METHOD.html b/htmlReport/ns-2/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..5e2aa5bb25 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_METHOD.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..fd6a82581a --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..86d0882cfe --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,385 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.commands

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.commands + + 20% + + + (2/10) + + + + 14.8% + + + (4/27) + + + + 11.9% + + + (7/59) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-1.html b/htmlReport/ns-2/sources/source-1.html new file mode 100644 index 0000000000..46ea5064ea --- /dev/null +++ b/htmlReport/ns-2/sources/source-1.html @@ -0,0 +1,127 @@ + + + + + + + Coverage Report > AddCommand + + + + + + +
+ + +

Coverage Summary for Class: AddCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.iohandler.Ui;
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class AddCommand extends Command {
+     public static final String MSG_SUCCESS_ADD = "New item added: %s";
+     public static final String HELP_MSG = "add : Adds an item to the packing list.\n" +
+                 "\tExample: add toothbrush";
+ 
+     private final Item item;
+ 
+     public AddCommand(Item item) {
+         this.item = item;
+     }
+ 
+     @Override
+     public void execute(PackingList packingList) {
+         this.packingList = packingList;
+         packingList.addItem(item);
+         Ui.printToUser(String.format(MSG_SUCCESS_ADD, item));
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-2.html b/htmlReport/ns-2/sources/source-2.html new file mode 100644 index 0000000000..8fcb8961a1 --- /dev/null +++ b/htmlReport/ns-2/sources/source-2.html @@ -0,0 +1,118 @@ + + + + + + + Coverage Report > ByeCommand + + + + + + +
+ + +

Coverage Summary for Class: ByeCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
ByeCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.packingfunc.PackingList;
+ 
+ /**
+  * ByeCommand class stops the BagPacker application by changing the run status
+  */
+ public class ByeCommand extends Command {
+     public static boolean isBagPackerRunning = true;
+     public static final String HELP_MSG = "bye : Stops the BagPacker Application\n" +
+             "\tExample: bye";
+     public void execute (PackingList packingList) {
+         this.isBagPackerRunning = false;
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-3.html b/htmlReport/ns-2/sources/source-3.html new file mode 100644 index 0000000000..edc10afab7 --- /dev/null +++ b/htmlReport/ns-2/sources/source-3.html @@ -0,0 +1,152 @@ + + + + + + + Coverage Report > Command + + + + + + +
+ + +

Coverage Summary for Class: Command (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
Command + + 100% + + + (1/1) + + + + 33.3% + + + (2/6) + + + + 25% + + + (2/8) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ /**
+  * Commands class used to execute given commands from user
+  */
+ public abstract class Command {
+     protected PackingList packingList;
+     private int targetIndex = -1;
+ 
+     /**
+      * @param targetIndex listing index of the target item
+      */
+     public Command(int targetIndex) {
+         this.setTargetIndex(targetIndex);
+     }
+ 
+     protected Command() {
+     }
+ 
+     public void setTargetIndex(int targetIndex) {
+         this.targetIndex = targetIndex;
+     }
+ 
+     public int getTargetIndex() {
+         return targetIndex;
+     }
+ 
+     /**
+      * Extracts the target item in the list.
+      *
+      * @throws IndexOutOfBoundsException if the target index is out of bounds
+      */
+     protected Item getTargetItem() throws IndexOutOfBoundsException {
+         return packingList.get(getTargetIndex() - 1);
+     }
+ 
+ 
+     /**
+      * Executes the command which requires a packingList
+      *
+      * @param packingList used to execute the command
+      */
+     public void execute (PackingList packingList) {
+     }
+ 
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-4.html b/htmlReport/ns-2/sources/source-4.html new file mode 100644 index 0000000000..2d1e80c6e0 --- /dev/null +++ b/htmlReport/ns-2/sources/source-4.html @@ -0,0 +1,130 @@ + + + + + + + Coverage Report > DeleteCommand + + + + + + +
+ + +

Coverage Summary for Class: DeleteCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
DeleteCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/5) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ import bagpacker.iohandler.Ui;
+ 
+ public class DeleteCommand extends Command {
+ 
+     public static final String MSG_SUCCESS_DELETE = "%s removed from the list";
+ 
+     public static final String HELP_MSG = "delete : Deletes an item from the packing list.\n" +
+             "\tExample: delete 1";
+ 
+ 
+     public DeleteCommand(int targetIndex) {
+         super(targetIndex);
+     }
+ 
+     @Override
+     public void execute(PackingList packingList) {
+         Item item = getTargetItem();
+         this.packingList = packingList;
+         packingList.deleteItem(item);
+         Ui.printToUser(String.format(MSG_SUCCESS_DELETE, item));
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-5.html b/htmlReport/ns-2/sources/source-5.html new file mode 100644 index 0000000000..96de9e160f --- /dev/null +++ b/htmlReport/ns-2/sources/source-5.html @@ -0,0 +1,123 @@ + + + + + + + Coverage Report > DeleteListCommand + + + + + + +
+ + +

Coverage Summary for Class: DeleteListCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
DeleteListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.iohandler.Ui;
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ import java.util.ArrayList;
+ 
+ public class DeleteListCommand extends Command {
+     public static final String MSG_SUCCESS_DELETE_LIST = "list deleted";
+     @Override
+     public void execute(PackingList packingList) {
+         ArrayList< Item > emptyList = new ArrayList<>();
+         packingList.setItemList(emptyList);
+         Ui.printToUser(String.format(MSG_SUCCESS_DELETE_LIST));
+     }
+ 
+ 
+ 
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-6.html b/htmlReport/ns-2/sources/source-6.html new file mode 100644 index 0000000000..b70f35f966 --- /dev/null +++ b/htmlReport/ns-2/sources/source-6.html @@ -0,0 +1,114 @@ + + + + + + + Coverage Report > HelpCommand + + + + + + +
+ + +

Coverage Summary for Class: HelpCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
HelpCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/2) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.iohandler.Ui;
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class HelpCommand extends Command {
+     @Override
+     public void execute(PackingList packingList) {
+         Ui.helpMessage();
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-7.html b/htmlReport/ns-2/sources/source-7.html new file mode 100644 index 0000000000..83bceac5fe --- /dev/null +++ b/htmlReport/ns-2/sources/source-7.html @@ -0,0 +1,121 @@ + + + + + + + Coverage Report > IncorrectCommand + + + + + + +
+ + +

Coverage Summary for Class: IncorrectCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
IncorrectCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/4) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.iohandler.Ui;
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class IncorrectCommand extends Command {
+     private final String errorType;
+     private final String helpMessage;
+     public IncorrectCommand(String errorType, String helpMessage) {
+         this.helpMessage = helpMessage;
+         this.errorType = errorType;
+     }
+ 
+     @Override
+     public void execute(PackingList packingList) {
+         Ui.errorMessage(errorType, helpMessage);
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-8.html b/htmlReport/ns-2/sources/source-8.html new file mode 100644 index 0000000000..018264b8a8 --- /dev/null +++ b/htmlReport/ns-2/sources/source-8.html @@ -0,0 +1,136 @@ + + + + + + + Coverage Report > ListCommand + + + + + + +
+ + +

Coverage Summary for Class: ListCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
ListCommand + + 0% + + + (0/1) + + + + 0% + + + (0/2) + + + + 0% + + + (0/14) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class ListCommand extends Command {
+     public static final String HELP_MSG = "list : List all items in packing list.\n" +
+             "\tExample: list";
+ 
+     @Override
+     public void execute(PackingList packingList) {
+ 
+         if (packingList.size() == 0) {
+             System.out.println("____________________________________________________________");
+             System.out.println("There are no items in your list. What would you like to add?");
+             System.out.println("____________________________________________________________");
+             return;
+         }
+ 
+         System.out.println("____________________________________________________________");
+         System.out.println("Here are the items in your list");
+         for (int i = 0; i < packingList.size(); i++) {
+             String isItemPacked;
+             if (packingList.get(i).getIsPacked()) {
+                 isItemPacked = "X";
+             } else {
+                 isItemPacked = " ";
+             }
+             String itemName = packingList.get(i).getItemName();
+             System.out.println((i + 1) + ". [" + isItemPacked + "] " + itemName);
+         }
+         System.out.println("____________________________________________________________");
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-9.html b/htmlReport/ns-2/sources/source-9.html new file mode 100644 index 0000000000..bd5bf915e3 --- /dev/null +++ b/htmlReport/ns-2/sources/source-9.html @@ -0,0 +1,132 @@ + + + + + + + Coverage Report > PackCommand + + + + + + +
+ + +

Coverage Summary for Class: PackCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
PackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.iohandler.Ui;
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class PackCommand extends Command {
+ 
+     public static final String MSG_SUCCESS_PACK = "Item packed: %s";
+     public static final String HELP_MSG= "pack : Marks an item as packed in the packing list.\n" +
+             "\tExample: pack 2 of 3\n" +
+             "\tMeaning: packs 2 quantities of the third item in the packing list";
+ 
+ 
+     public PackCommand(int targetIndex) {
+         super(targetIndex);
+         assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()):
+                 "Pack Command Target index is out of bounds";
+     }
+ 
+     @Override
+     public void execute(PackingList packingList) {
+         this.packingList = packingList;
+         final Item item = getTargetItem();
+         packingList.packItem(item);
+         Ui.printToUser(String.format(MSG_SUCCESS_PACK, item));
+     }
+ 
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-2/sources/source-a.html b/htmlReport/ns-2/sources/source-a.html new file mode 100644 index 0000000000..b9a404405b --- /dev/null +++ b/htmlReport/ns-2/sources/source-a.html @@ -0,0 +1,132 @@ + + + + + + + Coverage Report > UnpackCommand + + + + + + +
+ + +

Coverage Summary for Class: UnpackCommand (bagpacker.commands)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
UnpackCommand + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/7) + +
+ +
+
+ + +
+ package bagpacker.commands;
+ 
+ import bagpacker.iohandler.Ui;
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ public class UnpackCommand extends Command {
+ 
+     public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s";
+     public static final String HELP_MSG = "unpack : Marks an item as unpacked in the packing list.\n" +
+             "\tExample: unpack 1 of 2\n" +
+             "\tMeaning: unpacks 1 quantity of the second item in the packing list";
+ 
+ 
+     public UnpackCommand(int targetIndex) {
+         super(targetIndex);
+         assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()):
+                 "Unpack Command Target index is out of bounds";
+     }
+ 
+     @Override
+     public void execute(PackingList packingList) {
+         this.packingList = packingList;
+         final Item item = getTargetItem();
+         packingList.unpackItem(item);
+         Ui.printToUser(String.format(MSG_SUCCESS_UNPACK, item));
+     }
+ 
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-3/index.html b/htmlReport/ns-3/index.html new file mode 100644 index 0000000000..36dee51fc1 --- /dev/null +++ b/htmlReport/ns-3/index.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_BLOCK.html b/htmlReport/ns-3/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..5b83a3c419 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_BLOCK.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..5db7b52aed --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_CLASS.html b/htmlReport/ns-3/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..d7d31252cc --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_CLASS.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..0ff385f822 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_LINE.html b/htmlReport/ns-3/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..f4b3bf8c23 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_LINE.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..ed2b362c58 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_METHOD.html b/htmlReport/ns-3/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..3a4a081e27 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_METHOD.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..d056cdfbca --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..c8492bc39a --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.exception

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.exception + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + + + + 33.3% + + + (1/3) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-3/sources/source-1.html b/htmlReport/ns-3/sources/source-1.html new file mode 100644 index 0000000000..a31ff393e5 --- /dev/null +++ b/htmlReport/ns-3/sources/source-1.html @@ -0,0 +1,107 @@ + + + + + + + Coverage Report > EmptyInputException + + + + + + +
+ + +

Coverage Summary for Class: EmptyInputException (bagpacker.exception)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
EmptyInputException + + 100% + + + (1/1) + + + + 100% + + + (1/1) + + + + 100% + + + (1/1) + +
+ +
+
+ + +
+ package bagpacker.exception;
+ 
+ public class EmptyInputException extends Exception {
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-3/sources/source-2.html b/htmlReport/ns-3/sources/source-2.html new file mode 100644 index 0000000000..4e140a50ca --- /dev/null +++ b/htmlReport/ns-3/sources/source-2.html @@ -0,0 +1,109 @@ + + + + + + + Coverage Report > InvalidIndexException + + + + + + +
+ + +

Coverage Summary for Class: InvalidIndexException (bagpacker.exception)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+
+ + +
+ package bagpacker.exception;
+ 
+ 
+ 
+ public class InvalidIndexException extends Exception{
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-3/sources/source-3.html b/htmlReport/ns-3/sources/source-3.html new file mode 100644 index 0000000000..9b1c617f02 --- /dev/null +++ b/htmlReport/ns-3/sources/source-3.html @@ -0,0 +1,109 @@ + + + + + + + Coverage Report > InvalidVariablesException + + + + + + +
+ + +

Coverage Summary for Class: InvalidVariablesException (bagpacker.exception)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
+ +
+
+ + +
+ package bagpacker.exception;
+ 
+ 
+ 
+ public class InvalidVariablesException extends Exception{
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-4/index.html b/htmlReport/ns-4/index.html new file mode 100644 index 0000000000..46c9400c9f --- /dev/null +++ b/htmlReport/ns-4/index.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_BLOCK.html b/htmlReport/ns-4/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..a8b23638a0 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_BLOCK.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..8d7952a689 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_CLASS.html b/htmlReport/ns-4/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..877a227206 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_CLASS.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..d183363c6e --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_LINE.html b/htmlReport/ns-4/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..a81d99fbcf --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_LINE.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..87ea674440 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_METHOD.html b/htmlReport/ns-4/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..62128c29bc --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_METHOD.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..27d543fa78 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..ffaf46bfb6 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.iohandler

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.iohandler + + 66.7% + + + (2/3) + + + + 38.2% + + + (13/34) + + + + 25.5% + + + (37/145) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-4/sources/source-1.html b/htmlReport/ns-4/sources/source-1.html new file mode 100644 index 0000000000..5e9d2fe411 --- /dev/null +++ b/htmlReport/ns-4/sources/source-1.html @@ -0,0 +1,405 @@ + + + + + + + Coverage Report > Parser + + + + + + +
+ + +

Coverage Summary for Class: Parser (bagpacker.iohandler)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
Parser + + 100% + + + (1/1) + + + + 50% + + + (10/20) + + + + 31.3% + + + (31/99) + +
+ +
+
+ + +
+ package bagpacker.iohandler;
+ 
+ 
+ import bagpacker.commands.AddCommand;
+ import bagpacker.commands.ByeCommand;
+ import bagpacker.commands.Command;
+ import bagpacker.commands.DeleteCommand;
+ import bagpacker.commands.DeleteListCommand;
+ import bagpacker.commands.HelpCommand;
+ import bagpacker.commands.IncorrectCommand;
+ import bagpacker.commands.ListCommand;
+ import bagpacker.commands.PackCommand;
+ import bagpacker.commands.UnpackCommand;
+ import bagpacker.exception.EmptyInputException;
+ import bagpacker.exception.InvalidIndexException;
+ import bagpacker.exception.InvalidVariablesException;
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ import java.util.ArrayList;
+ import java.util.Arrays;
+ import java.util.Scanner;
+ 
+ /**
+  * Parser class contains methods to manipulate user input
+  */
+ public class Parser {
+     private static ArrayList<String> inputStringArray;
+     private static String fullInput;
+ 
+     public static void setFullInput(String fullInput) {
+         Parser.fullInput = fullInput;
+     }
+ 
+     /**
+      * Returns the user input in String format
+      */
+     public static String getFullInput() {
+         return fullInput;
+     }
+ 
+     /**
+      * Returns the user input as in array format
+      */
+     public static ArrayList<String> getInputStringArray() {
+         return inputStringArray;
+     }
+ 
+     public static void setInputStringArray(String[] inputStringArray) {
+         Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray));
+     }
+ 
+     public static Command parse() {
+         String inputLine = "";
+         while (inputLine.isEmpty()) {
+             try {
+                 inputLine = readLine().trim();
+             } catch (EmptyInputException e) {
+                 Ui.errorMessage("Empty input received",
+                         "try to input a command, to view all commands input 'help'");
+             }
+         }
+         setFullInput(inputLine);
+         String[] inputStringList = inputLine.split(" ");
+         setInputStringArray(inputStringList);
+         switch (inputStringList[0]) {
+         case "add":
+             return createAddObj();
+         case "delete":
+             return createDeleteObj();
+         case "pack":
+             return createPackObj();
+         case "unpack":
+             return createUnpackObj();
+         case "list":
+             return listCommand();
+         case "help":
+             return createHelpObj();
+         case "deletelist":
+             return createDeletelistObj();
+         case "bye":
+             return createByeObj();
+         default:
+             return new IncorrectCommand("'" + Parser.getCommand() + "' is an invalid User Command",
+                     "input 'help' to receive all valid commands");
+         }
+     }
+     /**
+      * Reads and returns the full user input from the command line interface
+      * - trims the leading and trailing white spaces
+      *
+      * @return inputLine the String input of the user
+      * @throws EmptyInputException when user input empty line
+      */
+     public static String readLine() throws EmptyInputException {
+         String inputLine;
+         Scanner in = new Scanner(System.in);
+         inputLine = in.nextLine().trim();
+         if (inputLine.isEmpty()) {
+             throw new EmptyInputException();
+         }
+         return inputLine;
+     }
+ 
+     /**
+      * Returns the user command in lower case
+      *
+      * @return command from user
+      */
+     public static String getCommand() {
+         String command = getInputStringArray().get(0).toLowerCase();
+         return command;
+     }
+ 
+     /**
+      * Returns a string which represents the name of the item from the user input
+      *
+      * @return inputVariables which is the name of the item
+      * @throws InvalidVariablesException when the item name cannot be found
+      */
+     public static String getItemName() throws InvalidVariablesException {
+         String itemName;
+         if (inputStringArray.size() <= 1) {
+             throw new InvalidVariablesException();
+         }
+         try {
+             int itemIndStart = fullInput.indexOf(" ") + 1;
+             itemName = fullInput.substring(itemIndStart);
+         } catch (IndexOutOfBoundsException e) {
+             throw new InvalidVariablesException();
+         }
+         return itemName;
+     }
+ 
+     /**
+      * Returns a string which represents the index of the item from the user input
+      *
+      * @return inputIndex which is the item index of the item in packing list
+      * @throws InvalidIndexException when the item index is not valid
+      */
+     public static String getItemIndex() throws InvalidIndexException {
+         String inputIndex;
+         int itemIndex;
+         if (inputStringArray.size() != 2) {
+             throw new InvalidIndexException();
+         }
+         try {
+             int itemIndStart = fullInput.indexOf(" ") + 1;
+             inputIndex = fullInput.substring(itemIndStart);
+             itemIndex = Integer.parseInt(inputIndex);
+             if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) {
+                 throw new InvalidIndexException();
+             }
+         } catch (IndexOutOfBoundsException | NumberFormatException e) {
+             throw new InvalidIndexException();
+         }
+         return inputIndex;
+     }
+     /**
+      * Returns a string which represents the relevant variable depending on the command
+      * - "add" will return the item name
+      * - "delete", "pack", "unpack" will return item index
+      *
+      * @param command used to determine the type of variable to return
+      * @return itemVariable which is the index OR name of the item in packing list
+      * @throws InvalidIndexException when the item index is not valid
+      */
+     public static String getVariable(String command) throws InvalidVariablesException, InvalidIndexException {
+         String itemVariable;
+         try {
+             if (command.equals("add")) {
+                 itemVariable = getItemName();
+             } else {
+                 itemVariable = getItemIndex();
+             }
+         } catch (InvalidVariablesException e) {
+             throw new InvalidVariablesException();
+         } catch (InvalidIndexException e) {
+             throw new InvalidIndexException();
+         }
+         return itemVariable;
+     }
+ 
+ 
+     /**
+      * Returns the user item description
+      */
+     public static String getItemDescrip() {
+         //String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length);
+         int indexItemName = getFullInput().indexOf("i/") + 2;
+         return getFullInput().substring(indexItemName).trim();
+     }
+ 
+ 
+     /**
+      * Attempts to create AddCommand object to be executed where it is called from
+      *
+      * @return AddCommand the command to be executed to add an item to the packing list, else
+      *      an IncorrectCommand is created to be executed
+      */
+     public static Command createAddObj() {
+         try {
+             String itemName = getVariable("add");
+             return new AddCommand(new Item(itemName));
+         } catch (InvalidVariablesException e) {
+             return new IncorrectCommand("Invalid Item Name",
+                     "try to input a name (word(s)) to be added into the list");
+         } catch (InvalidIndexException e) {
+             return new IncorrectCommand("Invalid Item Index",
+                     "try to input an integer number between 1 and " + PackingList.getItemList().size());
+         }
+     }
+ 
+     /**
+      * Attempts to create DeleteCommand object to be executed where it is called from
+      *
+      * @return DeleteCommand the command to be executed to delete an item to the packing list, else
+      *      an IncorrectCommand is created to be executed
+      */
+     public static Command createDeleteObj() {
+         try {
+             String itemIndex = getVariable("delete");
+             return new DeleteCommand(Integer.parseInt(itemIndex));
+         } catch (InvalidVariablesException e) {
+             return new IncorrectCommand("Invalid Item Name",
+                     "Try to input a name (word(s)) to be added into the list");
+         } catch (InvalidIndexException e) {
+             if (PackingList.getItemList().size() == 0) {
+                 return new IncorrectCommand("Invalid Item Index",
+                         "Your packing list is empty, there is nothing to delete");
+             } else {
+                 return new IncorrectCommand("Invalid Item Index",
+                         "Try to input an integer number between 1 and " + PackingList.getItemList().size());
+             }
+         }
+     }
+ 
+     /**
+      * Attempts to create PackCommand object to be executed where it is called from
+      *
+      * @return PackCommand the command to be executed to Pack an item in the packing list, else
+      *      an IncorrectCommand is created to be executed
+      */
+     public static Command createPackObj() {
+         try {
+             String itemIndex = getVariable("pack");
+             return new PackCommand(Integer.parseInt(itemIndex));
+         } catch (InvalidVariablesException e) {
+             return new IncorrectCommand("Invalid Item Name",
+                     "try to input a name (word(s)) to be added into the list");
+         } catch (InvalidIndexException e) {
+             if (PackingList.getItemList().size() == 0) {
+                 return new IncorrectCommand("Invalid Item Index",
+                         "Your packing list is empty, there is nothing to pack");
+             } else {
+                 return new IncorrectCommand("Invalid Item Index",
+                         "Try to input an integer number between 1 and " + PackingList.getItemList().size());
+             }
+         }
+     }
+ 
+ 
+     /**
+      * Attempts to create UnpackCommand object to be executed where it is called from
+      *
+      * @return UnpackCommand the command to be executed to unpack an item in the packing list, else
+      *      an IncorrectCommand is created to be executed
+      */
+     public static Command createUnpackObj() {
+         try {
+             String itemIndex = getVariable("unpack");
+             return new UnpackCommand(Integer.parseInt(itemIndex));
+         } catch (InvalidVariablesException e) {
+             return new IncorrectCommand("Invalid Item Name",
+                     "try to input a name (word(s)) to be added into the list");
+         } catch (InvalidIndexException e) {
+             if (PackingList.getItemList().size() == 0) {
+                 return new IncorrectCommand("Invalid Item Index",
+                         "Your packing list is empty, there is nothing to unpack");
+             } else {
+                 return new IncorrectCommand("Invalid Item Index",
+                         "Try to input an integer number between 1 and " + PackingList.getItemList().size());
+             }
+         }
+     }
+ 
+     public static Command listCommand() {
+         return new ListCommand();
+     }
+ 
+     public static Command createDeletelistObj() {
+         return new DeleteListCommand();
+     }
+ 
+     private static Command createHelpObj() {
+         return new HelpCommand();
+     }
+ 
+     private static Command createByeObj() {
+         return new ByeCommand();
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-4/sources/source-2.html b/htmlReport/ns-4/sources/source-2.html new file mode 100644 index 0000000000..649809b739 --- /dev/null +++ b/htmlReport/ns-4/sources/source-2.html @@ -0,0 +1,150 @@ + + + + + + + Coverage Report > Storage + + + + + + +
+ + +

Coverage Summary for Class: Storage (bagpacker.iohandler)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/18) + +
+ +
+
+ + +
+ package bagpacker.iohandler;
+ 
+ import bagpacker.packingfunc.Item;
+ import bagpacker.packingfunc.PackingList;
+ 
+ import java.io.File;
+ import java.io.FileNotFoundException;
+ import java.io.FileWriter;
+ import java.io.IOException;
+ import java.util.ArrayList;
+ import java.util.Scanner;
+ 
+ /**
+  * Storage class contains methods to save and retrieve saved packing list in txt file
+  */
+ public class Storage {
+ 
+     public static ArrayList<Item> packingList = new ArrayList<>();
+     private static final String FILE_PATH = "packingList.txt";
+     public static void load() throws FileNotFoundException {
+         Scanner reader = new Scanner(new File(FILE_PATH));
+         String line;
+         while (reader.hasNext()) {
+             line = reader.nextLine();
+             boolean isPacked = line.charAt(1) == 'X';
+             String itemDesc = line.substring(4);
+             Item item = new Item(itemDesc, isPacked);
+             PackingList.getItemList().add(item);
+         }
+     }
+ 
+     public static void save() {
+         try {
+             writeToFile();
+         } catch (IOException e) {
+             System.out.println("Something went wrong: " + e.getMessage());
+         }
+     }
+ 
+     public static void writeToFile() throws IOException {
+         FileWriter fw = new FileWriter(FILE_PATH);
+         ArrayList<Item> packingList = PackingList.getItemList();
+         for (int i = 0; i < packingList.size(); i++) {
+             fw.write(packingList.get(i).toString() + "\n");
+         }
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-4/sources/source-3.html b/htmlReport/ns-4/sources/source-3.html new file mode 100644 index 0000000000..6e0a65b9c6 --- /dev/null +++ b/htmlReport/ns-4/sources/source-3.html @@ -0,0 +1,188 @@ + + + + + + + Coverage Report > Ui + + + + + + +
+ + +

Coverage Summary for Class: Ui (bagpacker.iohandler)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
Ui + + 100% + + + (1/1) + + + + 33.3% + + + (3/9) + + + + 21.4% + + + (6/28) + +
+ +
+
+ + +
+ package bagpacker.iohandler;
+ 
+ import bagpacker.commands.AddCommand;
+ import bagpacker.commands.ByeCommand;
+ import bagpacker.commands.DeleteCommand;
+ import bagpacker.commands.ListCommand;
+ import bagpacker.commands.PackCommand;
+ import bagpacker.commands.UnpackCommand;
+ 
+ /**
+  * Ui class contains methods to print messages to user interface on Command Line Interface
+  */
+ public class Ui {
+     public static String logo = " ____              _____           _\n"
+             + "|  _ \\            |  __ \\         | |\n"
+             + "| |_) | __ _  __ _| |__) |_ _  ___| | _____ _ __\n"
+             + "|  _ < / _` |/ _` |  ___/ _` |/ __| |/ / _ \\ '__|\n"
+             + "| |_) | (_| | (_| | |  | (_| | (__|   <  __/ |\n"
+             + "|____/ \\__,_|\\__, |_|   \\__,_|\\___|_|\\_\\___|_|\n"
+             + "              __/ |\n"
+             + "             |___/\n";
+     public static void printErrorLine() {
+         System.out.println("/////////////////////////////////////////////////////////////");
+     }
+     public static void printLine() {
+         System.out.println("____________________________________________________________");
+     }
+     /**
+      * Prints initialising Message
+      */
+     public static void initialMessage(){
+         printLine();
+         System.out.println("Hi this is,\n" + logo);
+         System.out.println("Enter \"help\" to find out how to use BagPacker");
+         printLine();
+     }
+     /**
+      * Prints goodbye Message
+      */
+     public static void goodbyeMessage(){
+         printLine();
+         System.out.println("Bye thanks for using,\n" + logo);
+         printLine();
+     }
+ 
+     /**
+      * Prints Error Message with the type of error and a helping message
+      *
+      * @param errorType the type of error (e.g. invalid integer input)
+      * @param helpMessage a message to help the user (e.g. try to input a whole number digit)
+      */
+     public static void errorMessage(String errorType, String helpMessage) {
+         printErrorLine();
+         System.out.print("Error " + errorType);
+         System.out.println(":\n" + helpMessage);
+         printErrorLine();
+     }
+ 
+     /**
+      * Prints help message
+      */
+     public static void helpMessage() {
+         printLine();
+         System.out.println("All Commands:");
+         System.out.println("1. " + AddCommand.HELP_MSG);
+         System.out.println("2. " + DeleteCommand.HELP_MSG);
+         System.out.println("3. " + ListCommand.HELP_MSG);
+         System.out.println("4. " + PackCommand.HELP_MSG);
+         System.out.println("5. " + UnpackCommand.HELP_MSG);
+         System.out.println("6. " + ByeCommand.HELP_MSG);
+         printLine();
+     }
+ 
+     /**
+      * Prints messages(s) to the user
+      * @param message
+      */
+     public static void printToUser(String... message) {
+         printLine();
+         for (String m : message) {
+             System.out.println(m);
+         }
+         printLine();
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-5/index.html b/htmlReport/ns-5/index.html new file mode 100644 index 0000000000..61f2ed891e --- /dev/null +++ b/htmlReport/ns-5/index.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_BLOCK.html b/htmlReport/ns-5/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..42ec636ef3 --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_BLOCK.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..b2f5919e43 --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_CLASS.html b/htmlReport/ns-5/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..bf3a74a10a --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_CLASS.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..8e4a259e09 --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_LINE.html b/htmlReport/ns-5/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..6320646c0a --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_LINE.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..9edfa3195f --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_METHOD.html b/htmlReport/ns-5/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..8bb3ac70ae --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_METHOD.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..ec066fb29c --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..b74ed76353 --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
+ + + +

Coverage Summary for Package: bagpacker.packingfunc

+ + + + + + + + + + + + + +
Package + Class, % + + Method, % + + Line, % +
bagpacker.packingfunc + + 100% + + + (2/2) + + + + 41.2% + + + (7/17) + + + + 42.3% + + + (11/26) + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+Class + Class, % + + Method, % + + Line, % +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
+ +
+ + + + + + diff --git a/htmlReport/ns-5/sources/source-1.html b/htmlReport/ns-5/sources/source-1.html new file mode 100644 index 0000000000..f637c89821 --- /dev/null +++ b/htmlReport/ns-5/sources/source-1.html @@ -0,0 +1,144 @@ + + + + + + + Coverage Report > Item + + + + + + +
+ + +

Coverage Summary for Class: Item (bagpacker.packingfunc)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
Item + + 100% + + + (1/1) + + + + 42.9% + + + (3/7) + + + + 40% + + + (6/15) + +
+ +
+
+ + +
+ package bagpacker.packingfunc;
+ /**
+  * Item class used to store information about item
+  * Items to be packed can be saved in PackingList class
+  */
+ public class Item {
+     private String itemName;
+     private boolean isPacked;
+     private String packIcon = " ";
+     public Item(String description) {
+         this.itemName = description;
+         isPacked = false;
+     }
+     public Item(String description, boolean isPacked) {
+         this.itemName = description;
+         this.isPacked = isPacked;
+     }
+     public void setPackIcon() {
+         if (this.isPacked) {
+             this.packIcon = "X";
+         } else {
+             this.packIcon = " ";
+         }
+     }
+ 
+     public String getItemName() {
+         return itemName;
+     }
+ 
+     public boolean getIsPacked() {
+         return isPacked;
+     }
+     public void setPacked(boolean packed) {
+         isPacked = packed;
+         setPackIcon();
+     }
+ 
+     public String toString() {
+         return "[" + this.packIcon + "] " + this.getItemName();
+     }
+ }
+
+
+
+ + + + + + diff --git a/htmlReport/ns-5/sources/source-2.html b/htmlReport/ns-5/sources/source-2.html new file mode 100644 index 0000000000..b74c31ec91 --- /dev/null +++ b/htmlReport/ns-5/sources/source-2.html @@ -0,0 +1,169 @@ + + + + + + + Coverage Report > PackingList + + + + + + +
+ + +

Coverage Summary for Class: PackingList (bagpacker.packingfunc)

+ + + + + + + + + + + + + + + +
Class + Class, % + + Method, % + + Line, % +
PackingList + + 100% + + + (1/1) + + + + 40% + + + (4/10) + + + + 45.5% + + + (5/11) + +
+ +
+
+ + +
+ package bagpacker.packingfunc;
+ 
+ import java.util.ArrayList;
+ 
+ /**
+  * PackingList class contains methods to manipulate the users packing list
+  */
+ public class PackingList {
+ 
+ 
+     private static ArrayList<Item> itemList = new ArrayList<>();
+ 
+     private static int targetIndex = -1;
+     public static void setItemList(ArrayList<Item> itemList) {
+         PackingList.itemList = itemList;
+     }
+ 
+     /**
+      * Getter for itemList
+      *
+      * @return list of items
+      */
+     public static ArrayList<Item> getItemList() {
+         return itemList;
+     }
+     /**
+      * Adds an item to the list.
+      */
+     public void addItem(Item toAdd) {
+         itemList.add(toAdd);
+     }
+ 
+     /**
+      * Removes an item from the list.
+      */
+     public void deleteItem(Item toDelete) {
+         itemList.remove(toDelete);
+     }
+ 
+     /**
+      * Marks an item as packed in the list.
+      */
+     public void packItem(Item toPack) {
+         toPack.setPacked(true);
+     }
+ 
+     /**
+      * Marks an item as unpacked in the list.
+      */
+     public void unpackItem(Item toPack) {
+         toPack.setPacked(false);
+     }
+ 
+     public static Item get(int targetIndex) {
+         return itemList.get(targetIndex);
+     }
+ 
+     /**
+      * Returns size of packing list
+      */
+     public int size(){
+         return itemList.size();
+     }
+ 
+ 
+ }
+
+
+
+ + + + + + From 0d46556b2497dd9089a3cb42862056bef08a82ec Mon Sep 17 00:00:00 2001 From: coregano Date: Fri, 24 Mar 2023 01:28:25 +0800 Subject: [PATCH 057/207] Merge branch 'master' of https://github.com/coregano/tp # Conflicts: # docs/DeveloperGuide.md # src/main/java/bagpacker/iohandler/Parser.java --- docs/DeveloperGuide.md | 45 +- docs/DeveloperGuide.md.rej | 18 + docs/img_1.png | Bin 0 -> 38579 bytes docs/img_2.png | Bin 58326 -> 0 bytes htmlReport/css/coverage.css | 154 -- htmlReport/css/idea.min.css | 118 -- htmlReport/img/arrowDown.gif | Bin 89 -> 0 bytes htmlReport/img/arrowUp.gif | Bin 91 -> 0 bytes htmlReport/index.html | 249 --- htmlReport/index_SORT_BY_BLOCK.html | 249 --- htmlReport/index_SORT_BY_BLOCK_DESC.html | 249 --- htmlReport/index_SORT_BY_CLASS.html | 249 --- htmlReport/index_SORT_BY_CLASS_DESC.html | 249 --- htmlReport/index_SORT_BY_LINE.html | 249 --- htmlReport/index_SORT_BY_LINE_DESC.html | 249 --- htmlReport/index_SORT_BY_METHOD.html | 249 --- htmlReport/index_SORT_BY_METHOD_DESC.html | 249 --- htmlReport/index_SORT_BY_NAME_DESC.html | 249 --- htmlReport/js/highlight.min.js | 1388 ----------------- htmlReport/js/highlightjs-line-numbers.min.js | 24 - htmlReport/ns-1/index.html | 142 -- htmlReport/ns-1/index_SORT_BY_BLOCK.html | 142 -- htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html | 142 -- htmlReport/ns-1/index_SORT_BY_CLASS.html | 142 -- htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html | 142 -- htmlReport/ns-1/index_SORT_BY_LINE.html | 142 -- htmlReport/ns-1/index_SORT_BY_LINE_DESC.html | 142 -- htmlReport/ns-1/index_SORT_BY_METHOD.html | 142 -- .../ns-1/index_SORT_BY_METHOD_DESC.html | 142 -- htmlReport/ns-1/index_SORT_BY_NAME_DESC.html | 142 -- htmlReport/ns-1/sources/source-1.html | 136 -- htmlReport/ns-2/index.html | 385 ----- htmlReport/ns-2/index_SORT_BY_BLOCK.html | 385 ----- htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html | 385 ----- htmlReport/ns-2/index_SORT_BY_CLASS.html | 385 ----- htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html | 385 ----- htmlReport/ns-2/index_SORT_BY_LINE.html | 385 ----- htmlReport/ns-2/index_SORT_BY_LINE_DESC.html | 385 ----- htmlReport/ns-2/index_SORT_BY_METHOD.html | 385 ----- .../ns-2/index_SORT_BY_METHOD_DESC.html | 385 ----- htmlReport/ns-2/index_SORT_BY_NAME_DESC.html | 385 ----- htmlReport/ns-2/sources/source-1.html | 127 -- htmlReport/ns-2/sources/source-2.html | 118 -- htmlReport/ns-2/sources/source-3.html | 152 -- htmlReport/ns-2/sources/source-4.html | 130 -- htmlReport/ns-2/sources/source-5.html | 123 -- htmlReport/ns-2/sources/source-6.html | 114 -- htmlReport/ns-2/sources/source-7.html | 121 -- htmlReport/ns-2/sources/source-8.html | 136 -- htmlReport/ns-2/sources/source-9.html | 132 -- htmlReport/ns-2/sources/source-a.html | 132 -- htmlReport/ns-3/index.html | 196 --- htmlReport/ns-3/index_SORT_BY_BLOCK.html | 196 --- htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html | 196 --- htmlReport/ns-3/index_SORT_BY_CLASS.html | 196 --- htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html | 196 --- htmlReport/ns-3/index_SORT_BY_LINE.html | 196 --- htmlReport/ns-3/index_SORT_BY_LINE_DESC.html | 196 --- htmlReport/ns-3/index_SORT_BY_METHOD.html | 196 --- .../ns-3/index_SORT_BY_METHOD_DESC.html | 196 --- htmlReport/ns-3/index_SORT_BY_NAME_DESC.html | 196 --- htmlReport/ns-3/sources/source-1.html | 107 -- htmlReport/ns-3/sources/source-2.html | 109 -- htmlReport/ns-3/sources/source-3.html | 109 -- htmlReport/ns-4/index.html | 196 --- htmlReport/ns-4/index_SORT_BY_BLOCK.html | 196 --- htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html | 196 --- htmlReport/ns-4/index_SORT_BY_CLASS.html | 196 --- htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html | 196 --- htmlReport/ns-4/index_SORT_BY_LINE.html | 196 --- htmlReport/ns-4/index_SORT_BY_LINE_DESC.html | 196 --- htmlReport/ns-4/index_SORT_BY_METHOD.html | 196 --- .../ns-4/index_SORT_BY_METHOD_DESC.html | 196 --- htmlReport/ns-4/index_SORT_BY_NAME_DESC.html | 196 --- htmlReport/ns-4/sources/source-1.html | 405 ----- htmlReport/ns-4/sources/source-2.html | 150 -- htmlReport/ns-4/sources/source-3.html | 188 --- htmlReport/ns-5/index.html | 169 -- htmlReport/ns-5/index_SORT_BY_BLOCK.html | 169 -- htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html | 169 -- htmlReport/ns-5/index_SORT_BY_CLASS.html | 169 -- htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html | 169 -- htmlReport/ns-5/index_SORT_BY_LINE.html | 169 -- htmlReport/ns-5/index_SORT_BY_LINE_DESC.html | 169 -- htmlReport/ns-5/index_SORT_BY_METHOD.html | 169 -- .../ns-5/index_SORT_BY_METHOD_DESC.html | 169 -- htmlReport/ns-5/index_SORT_BY_NAME_DESC.html | 169 -- htmlReport/ns-5/sources/source-1.html | 144 -- htmlReport/ns-5/sources/source-2.html | 169 -- src/main/java/bagpacker/BagPacker.java | 1 - .../java/bagpacker/commands/AddCommand.java | 2 +- .../java/bagpacker/commands/ByeCommand.java | 3 +- src/main/java/bagpacker/commands/Command.java | 3 +- .../bagpacker/commands/DeleteListCommand.java | 6 +- .../bagpacker/commands/IncorrectCommand.java | 1 - .../java/bagpacker/commands/ListCommand.java | 10 +- .../java/bagpacker/commands/PackCommand.java | 10 +- .../bagpacker/commands/UnpackCommand.java | 29 + .../exception/InvalidIndexException.java | 4 +- .../exception/InvalidVariablesException.java | 4 +- src/main/java/bagpacker/iohandler/Parser.java | 150 +- .../java/bagpacker/iohandler/Storage.java | 27 +- src/main/java/bagpacker/iohandler/Ui.java | 4 +- src/main/java/bagpacker/packingfunc/Item.java | 32 +- .../bagpacker/packingfunc/PackingList.java | 18 +- .../bagpacker/iohandlertest/ParserTest.java | 146 +- .../packingfunctest/CommandsTest.java | 18 +- 107 files changed, 243 insertions(+), 18144 deletions(-) create mode 100644 docs/DeveloperGuide.md.rej create mode 100644 docs/img_1.png delete mode 100644 docs/img_2.png delete mode 100644 htmlReport/css/coverage.css delete mode 100644 htmlReport/css/idea.min.css delete mode 100644 htmlReport/img/arrowDown.gif delete mode 100644 htmlReport/img/arrowUp.gif delete mode 100644 htmlReport/index.html delete mode 100644 htmlReport/index_SORT_BY_BLOCK.html delete mode 100644 htmlReport/index_SORT_BY_BLOCK_DESC.html delete mode 100644 htmlReport/index_SORT_BY_CLASS.html delete mode 100644 htmlReport/index_SORT_BY_CLASS_DESC.html delete mode 100644 htmlReport/index_SORT_BY_LINE.html delete mode 100644 htmlReport/index_SORT_BY_LINE_DESC.html delete mode 100644 htmlReport/index_SORT_BY_METHOD.html delete mode 100644 htmlReport/index_SORT_BY_METHOD_DESC.html delete mode 100644 htmlReport/index_SORT_BY_NAME_DESC.html delete mode 100644 htmlReport/js/highlight.min.js delete mode 100644 htmlReport/js/highlightjs-line-numbers.min.js delete mode 100644 htmlReport/ns-1/index.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_BLOCK.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_CLASS.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_LINE.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_LINE_DESC.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_METHOD.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_NAME_DESC.html delete mode 100644 htmlReport/ns-1/sources/source-1.html delete mode 100644 htmlReport/ns-2/index.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_BLOCK.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_CLASS.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_LINE.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_LINE_DESC.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_METHOD.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_NAME_DESC.html delete mode 100644 htmlReport/ns-2/sources/source-1.html delete mode 100644 htmlReport/ns-2/sources/source-2.html delete mode 100644 htmlReport/ns-2/sources/source-3.html delete mode 100644 htmlReport/ns-2/sources/source-4.html delete mode 100644 htmlReport/ns-2/sources/source-5.html delete mode 100644 htmlReport/ns-2/sources/source-6.html delete mode 100644 htmlReport/ns-2/sources/source-7.html delete mode 100644 htmlReport/ns-2/sources/source-8.html delete mode 100644 htmlReport/ns-2/sources/source-9.html delete mode 100644 htmlReport/ns-2/sources/source-a.html delete mode 100644 htmlReport/ns-3/index.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_BLOCK.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_CLASS.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_LINE.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_LINE_DESC.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_METHOD.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_NAME_DESC.html delete mode 100644 htmlReport/ns-3/sources/source-1.html delete mode 100644 htmlReport/ns-3/sources/source-2.html delete mode 100644 htmlReport/ns-3/sources/source-3.html delete mode 100644 htmlReport/ns-4/index.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_BLOCK.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_CLASS.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_LINE.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_LINE_DESC.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_METHOD.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_NAME_DESC.html delete mode 100644 htmlReport/ns-4/sources/source-1.html delete mode 100644 htmlReport/ns-4/sources/source-2.html delete mode 100644 htmlReport/ns-4/sources/source-3.html delete mode 100644 htmlReport/ns-5/index.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_BLOCK.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_CLASS.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_LINE.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_LINE_DESC.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_METHOD.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_NAME_DESC.html delete mode 100644 htmlReport/ns-5/sources/source-1.html delete mode 100644 htmlReport/ns-5/sources/source-2.html create mode 100644 src/main/java/bagpacker/commands/UnpackCommand.java diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8a04594970..f171e5cf9a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -22,6 +22,23 @@ Add command is used to add a quantity of item(s) to the packing list. Mechanism: ```AddCommand.execute()``` calls the ```PackingList.addItem()``` method from the ```PackingList``` class which executes the ```ArrayList.add()``` method to add the item to the ```PackingList``` ArrayList. It then updates the ```quantity``` variable according to the quantity inputted by the user. + +#### Preventing duplicate items + +When using the `add` function, we have decided to implement a passive function that checks whether the item with the same name already exists in the packingList. + +This is done through the `contains()` method in class `PackingList()`, which is called during `execute` in an `AddCommand` object. + +Below is the UML diagram showing what occurs during `add` function. +![img_1.png](img_1.png) +When `execute()` is called in `a`(object of class `AddCommand`), the `addItem(item)` method is called in the object `packingList`. This method will see if method `contains()` will return `true`. + +The `contains()` method, which is shown as a reference on the right of the UML diagram, is a boolean method that loops through all items in the packingList, and returns `true` if any of the existing items have the same description as the item to be added in `toAdd`, and `false` otherwise. + +When `contains()` returns `true`, method `addItem(item)` will be interrupted and a `DuplicateItemException` will be thrown from `packingList`, which will be caught by `a`. If `contains()` returns false, the item will be added onto `packingList`. + +In both scenarios, `ui.printToUser` will be called to print a message to the user. In the former case, `ExistItemError` will be printed, while `AddSuccess` will be shown if the item was added with no issues. + #### Delete Command Delete command is used to delete an item from the packing list. @@ -51,6 +68,7 @@ All Commands: 6. bye : Stops the BagPacker Application Example: bye ____________________________________________________________ + ``` #### Bye Command @@ -65,34 +83,7 @@ The ```runBagPacker()``` method will continually parse and execute relevant comm Mechanism: ```DeleteListCommand.execute()``` reassigns the existing ```packingList``` to a new empty ArrayList of Items, thus deleting the ```packingList```. -#### Pack Command -```PackCommand``` is used to mark an item in the list as packed. - -Mechanism: ```PackCommand.execute()``` calls the ```PackingList.packItem()``` method from the ```PackingList``` class. -This will execute the ```setPacked()``` method to set the value of the boolean ```isPacked``` to be ```true```, and mark the item as packed in the ```PackingList``` ArrayList. -#### Unpack Command -```Unpack Command``` is used to mark an item in the list as unpacked. - -Mechanism: ```UnpackCommand.execute()``` calls the ```PackingList.unpackItem()``` method from the ```PackingList``` class. -This will execute the ```setPacked``` method to set the value of the boolean ```isPacked``` to be ```false```, and mark the item as unpacked in the ```PackingList``` ArrayList. - - -### [Proposed] No Duplicate Items #### Preventing duplicate items - -When using the `add` function, we have decided to implement a passive function that checks whether the item with the same name already exists in the packingList. - -This is done through the `contains()` method in class `PackingList()`, which is called during `execute` in an `AddCommand` object. - -Below is the UML diagram showing what occurs during `add` function. -![img_2.png](img_2.png) -When `execute()` is called in `a`(object of class `AddCommand`), the `addItem(item)` method is called in the object `packingList`. This method will see if method `contains()` will return `true`. - -The `contains()` method, which is shown as a reference on the right of the UML diagram, is a boolean method that loops through all items in the packingList, and returns `true` if any of the existing items have the same description as the item to be added in `toAdd`, and `false` otherwise. - -When `contains()` returns `true`, method `addItem(item)` will be interrupted and a `DuplicateItemException` will be thrown from `packingList`, which will be caught by `a`. If `contains()` returns false, the item will be added onto `packingList`. - -In both scenarios, `ui.printToUser` will be called to print a message to the user. In the former case, `ExistItemError` will be printed, while `AddSuccess` will be shown if the item was added with no issues. ## Product scope diff --git a/docs/DeveloperGuide.md.rej b/docs/DeveloperGuide.md.rej new file mode 100644 index 0000000000..ff0fabc4d6 --- /dev/null +++ b/docs/DeveloperGuide.md.rej @@ -0,0 +1,18 @@ +diff a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md (rejected hunks) +@@ -83,7 +83,16 @@ + + Mechanism: ```DeleteListCommand.execute()``` reassigns the existing ```packingList``` to a new empty ArrayList of Items, thus deleting the ```packingList```. + ++#### Pack Command ++```PackCommand``` is used to mark an item in the list as packed. + ++Mechanism: ```PackCommand.execute()``` calls the ```PackingList.packItem()``` method from the ```PackingList``` class. ++This will execute the ```setPacked()``` method to set the value of the boolean ```isPacked``` to be ```true```, and mark the item as packed in the ```PackingList``` ArrayList. ++ ++#### Unpack Command ++```Unpack Command``` is used to mark an item in the list as unpacked. ++Mechanism: ```UnpackCommand.execute()``` calls the ```PackingList.unpackItem()``` method from the ```PackingList``` class. ++This will execute the ```setPacked``` method to set the value of the boolean ```isPacked``` to be ```false```, and mark the item as unpacked in the ```PackingList``` ArrayList. + + ## Product scope + diff --git a/docs/img_1.png b/docs/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6899bf1bc9187a05077c7cf5c275153ce46b910a GIT binary patch literal 38579 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 literal 0 HcmV?d00001 diff --git a/docs/img_2.png b/docs/img_2.png deleted file mode 100644 index 3547c40e03b029f822de6c197f22281795cf70f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58326 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 VGg`~}XyhM`DWAk7A2#~ye*iphPA32W diff --git a/htmlReport/css/coverage.css b/htmlReport/css/coverage.css deleted file mode 100644 index cef776517f..0000000000 --- a/htmlReport/css/coverage.css +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright 2000-2021 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -* { - margin: 0; - padding: 0; -} - -body { - background-color: #fff; - font-family: helvetica neue, tahoma, arial, sans-serif; - font-size: 82%; - color: #151515; -} - -h1 { - margin: 0.5em 0; - color: #010101; - font-weight: normal; - font-size: 18px; -} - -h2 { - margin: 0.5em 0; - color: #010101; - font-weight: normal; - font-size: 16px; -} - -a { - color: #1564C2; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -span.separator { - color: #9BA9BA; - padding-left: 5px; - padding-right: 5px; -} - -div.content { - width: 99%; -} - -table.coverageStats { - width: 100%; - border-collapse: collapse; -} - -table.overallStats { - width: 20%; -} - -table.coverageStats td, table.coverageStats th { - padding: 4px 2px; - border-bottom: 1px solid #ccc; -} - -table.coverageStats th { - background-color: #959BA4; - border: none; - font-weight: bold; - text-align: left; - color: #FFF; -} - -table.coverageStats th.coverageStat { - width: 15%; -} - -table.coverageStats th a { - color: #FFF; -} - -table.coverageStats th a:hover { - text-decoration: none; -} - -table.coverageStats th.sortedDesc a { - background: url(../img/arrowDown.gif) no-repeat 100% 2px; - padding-right: 20px; -} - -table.coverageStats th.sortedAsc a { - background: url(../img/arrowUp.gif) no-repeat 100% 2px; - padding-right: 20px; -} - -div.footer { - margin: 2em .5em; - font-size: 85%; - text-align: left; - line-height: 140%; -} - -code.sourceCode { - width: 100%; - border: 1px solid #ccc; - font: normal 12px 'Menlo', 'Bitstream Vera Sans Mono', 'Courier New', 'Courier', monospace; - white-space: pre; -} - -code.sourceCode b { - font-weight: normal; -} - -code.sourceCode span.number { - color: #151515; -} - -code.sourceCode .fc { - background-color: #cfc; -} - -code.sourceCode .pc { - background-color: #ffc; -} - -code.sourceCode .nc { - background-color: #fcc; -} - -.percent, .absValue { - font-size: 90%; -} - -.percent .green, .absValue .green { - color: #32cc32; -} - -.percent .red, .absValue .red { - color: #f00; -} - -.percent .totalDiff { - color: #3f3f3f; -} diff --git a/htmlReport/css/idea.min.css b/htmlReport/css/idea.min.css deleted file mode 100644 index a8d5292bd5..0000000000 --- a/htmlReport/css/idea.min.css +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2000-2021 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* -Intellij Idea-like styling (c) Vasily Polovnyov -*/ - -.hljs { - color: #000; - background: #fff; -} - -.hljs-subst, -.hljs-title { - font-weight: normal; - color: #000; -} - -.hljs-comment, -.hljs-quote { - color: #808080; - font-style: italic; -} - -.hljs-meta { - color: #808000; -} - -.hljs-tag { - background: #efefef; -} - -.hljs-section, -.hljs-name, -.hljs-literal, -.hljs-keyword, -.hljs-selector-tag, -.hljs-type, -.hljs-selector-id, -.hljs-selector-class { - font-weight: bold; - color: #000080; -} - -.hljs-attribute, -.hljs-number, -.hljs-regexp, -.hljs-link { - font-weight: bold; - color: #0000ff; -} - -.hljs-number, -.hljs-regexp, -.hljs-link { - font-weight: normal; -} - -.hljs-string { - color: #008000; - font-weight: bold; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-formula { - color: #000; - background: #d0eded; - font-style: italic; -} - -.hljs-doctag { - text-decoration: underline; -} - -.hljs-variable, -.hljs-template-variable { - color: #660e7a; -} - -.hljs-addition { - background: #baeeba; -} - -.hljs-deletion { - background: #ffc8bd; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-ln-numbers { - display: block; - float: left; - width: 3em; - border-right: 1px solid #ccc; - font-style: normal; - text-align: right; - background-color: #eee; -} diff --git a/htmlReport/img/arrowDown.gif b/htmlReport/img/arrowDown.gif deleted file mode 100644 index a4ac9b4b0f5eee9fc82deb7f03d0cc7f197b01c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmZ?wbhEHbv%yJ&P?))?G g5?!@7agD+*@rGjs@joUks8}}Ha%HfNHz$KN0Orjd82|tP diff --git a/htmlReport/img/arrowUp.gif b/htmlReport/img/arrowUp.gif deleted file mode 100644 index d488db0089f15409b83a6f39718384cac89ea3c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91 zcmZ?wbhEHbv%nBa6?))=2 j#jeJ<$W6!S$=vG=3s*2Wu3C5I!M+a(XH6zEFjxZs9OxeQ diff --git a/htmlReport/index.html b/htmlReport/index.html deleted file mode 100644 index 2014cca5f8..0000000000 --- a/htmlReport/index.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
- - -

Overall Coverage Summary

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
all classes - - 36.8% - - - (7/19) - - - - 29.8% - - - (25/84) - - - - 23.1% - - - (56/242) - -
- -
-

Coverage Breakdown

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
-
- - - - - - - diff --git a/htmlReport/index_SORT_BY_BLOCK.html b/htmlReport/index_SORT_BY_BLOCK.html deleted file mode 100644 index cd848940d4..0000000000 --- a/htmlReport/index_SORT_BY_BLOCK.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
- - -

Overall Coverage Summary

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
all classes - - 36.8% - - - (7/19) - - - - 29.8% - - - (25/84) - - - - 23.1% - - - (56/242) - -
- -
-

Coverage Breakdown

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
-
- - - - - - - diff --git a/htmlReport/index_SORT_BY_BLOCK_DESC.html b/htmlReport/index_SORT_BY_BLOCK_DESC.html deleted file mode 100644 index 0306ddac53..0000000000 --- a/htmlReport/index_SORT_BY_BLOCK_DESC.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
- - -

Overall Coverage Summary

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
all classes - - 36.8% - - - (7/19) - - - - 29.8% - - - (25/84) - - - - 23.1% - - - (56/242) - -
- -
-

Coverage Breakdown

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
-
- - - - - - - diff --git a/htmlReport/index_SORT_BY_CLASS.html b/htmlReport/index_SORT_BY_CLASS.html deleted file mode 100644 index 9289b15a33..0000000000 --- a/htmlReport/index_SORT_BY_CLASS.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
- - -

Overall Coverage Summary

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
all classes - - 36.8% - - - (7/19) - - - - 29.8% - - - (25/84) - - - - 23.1% - - - (56/242) - -
- -
-

Coverage Breakdown

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
-
- - - - - - - diff --git a/htmlReport/index_SORT_BY_CLASS_DESC.html b/htmlReport/index_SORT_BY_CLASS_DESC.html deleted file mode 100644 index db988e6dbd..0000000000 --- a/htmlReport/index_SORT_BY_CLASS_DESC.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
- - -

Overall Coverage Summary

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
all classes - - 36.8% - - - (7/19) - - - - 29.8% - - - (25/84) - - - - 23.1% - - - (56/242) - -
- -
-

Coverage Breakdown

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
-
- - - - - - - diff --git a/htmlReport/index_SORT_BY_LINE.html b/htmlReport/index_SORT_BY_LINE.html deleted file mode 100644 index a5149f7a02..0000000000 --- a/htmlReport/index_SORT_BY_LINE.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
- - -

Overall Coverage Summary

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
all classes - - 36.8% - - - (7/19) - - - - 29.8% - - - (25/84) - - - - 23.1% - - - (56/242) - -
- -
-

Coverage Breakdown

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
-
- - - - - - - diff --git a/htmlReport/index_SORT_BY_LINE_DESC.html b/htmlReport/index_SORT_BY_LINE_DESC.html deleted file mode 100644 index a087b56950..0000000000 --- a/htmlReport/index_SORT_BY_LINE_DESC.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
- - -

Overall Coverage Summary

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
all classes - - 36.8% - - - (7/19) - - - - 29.8% - - - (25/84) - - - - 23.1% - - - (56/242) - -
- -
-

Coverage Breakdown

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
-
- - - - - - - diff --git a/htmlReport/index_SORT_BY_METHOD.html b/htmlReport/index_SORT_BY_METHOD.html deleted file mode 100644 index 83260463c5..0000000000 --- a/htmlReport/index_SORT_BY_METHOD.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
- - -

Overall Coverage Summary

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
all classes - - 36.8% - - - (7/19) - - - - 29.8% - - - (25/84) - - - - 23.1% - - - (56/242) - -
- -
-

Coverage Breakdown

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
-
- - - - - - - diff --git a/htmlReport/index_SORT_BY_METHOD_DESC.html b/htmlReport/index_SORT_BY_METHOD_DESC.html deleted file mode 100644 index 1831b33bc1..0000000000 --- a/htmlReport/index_SORT_BY_METHOD_DESC.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
- - -

Overall Coverage Summary

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
all classes - - 36.8% - - - (7/19) - - - - 29.8% - - - (25/84) - - - - 23.1% - - - (56/242) - -
- -
-

Coverage Breakdown

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
-
- - - - - - - diff --git a/htmlReport/index_SORT_BY_NAME_DESC.html b/htmlReport/index_SORT_BY_NAME_DESC.html deleted file mode 100644 index e7e8077a52..0000000000 --- a/htmlReport/index_SORT_BY_NAME_DESC.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
- - -

Overall Coverage Summary

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
all classes - - 36.8% - - - (7/19) - - - - 29.8% - - - (25/84) - - - - 23.1% - - - (56/242) - -
- -
-

Coverage Breakdown

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
-
- - - - - - - diff --git a/htmlReport/js/highlight.min.js b/htmlReport/js/highlight.min.js deleted file mode 100644 index e88731520e..0000000000 --- a/htmlReport/js/highlight.min.js +++ /dev/null @@ -1,1388 +0,0 @@ -/* - Highlight.js 10.7.2 (00233d63) - License: BSD-3-Clause - Copyright (c) 2006-2021, Ivan Sagalaev - - BSD 3-Clause License - - Copyright (c) 2006-2021, Ivan Sagalaev. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -var hljs=function(){"use strict";function e(t){ -return t instanceof Map?t.clear=t.delete=t.set=()=>{ -throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{ -throw Error("set is read-only") -}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{var i=t[n] -;"object"!=typeof i||Object.isFrozen(i)||e(i)})),t}var t=e,n=e;t.default=n -;class i{constructor(e){ -void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} -ignoreMatch(){this.isMatchIgnored=!0}}function s(e){ -return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") -}function a(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] -;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const r=e=>!!e.kind -;class l{constructor(e,t){ -this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ -this.buffer+=s(e)}openNode(e){if(!r(e))return;let t=e.kind -;e.sublanguage||(t=`${this.classPrefix}${t}`),this.span(t)}closeNode(e){ -r(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ -this.buffer+=``}}class o{constructor(){this.rootNode={ -children:[]},this.stack=[this.rootNode]}get top(){ -return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ -this.top.children.push(e)}openNode(e){const t={kind:e,children:[]} -;this.add(t),this.stack.push(t)}closeNode(){ -if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ -for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} -walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ -return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), -t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ -"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ -o._collapse(e)})))}}class c extends o{constructor(e){super(),this.options=e} -addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} -addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root -;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){ -return new l(this,this.options).value()}finalize(){return!0}}function g(e){ -return e?"string"==typeof e?e:e.source:null} -const u=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,h="[a-zA-Z]\\w*",d="[a-zA-Z_]\\w*",f="\\b\\d+(\\.\\d+)?",p="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",m="\\b(0b[01]+)",b={ -begin:"\\\\[\\s\\S]",relevance:0},E={className:"string",begin:"'",end:"'", -illegal:"\\n",contains:[b]},x={className:"string",begin:'"',end:'"', -illegal:"\\n",contains:[b]},v={ -begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ -},w=(e,t,n={})=>{const i=a({className:"comment",begin:e,end:t,contains:[]},n) -;return i.contains.push(v),i.contains.push({className:"doctag", -begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),i -},y=w("//","$"),N=w("/\\*","\\*/"),R=w("#","$");var _=Object.freeze({ -__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:h,UNDERSCORE_IDENT_RE:d, -NUMBER_RE:f,C_NUMBER_RE:p,BINARY_NUMBER_RE:m, -RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", -SHEBANG:(e={})=>{const t=/^#![ ]*\// -;return e.binary&&(e.begin=((...e)=>e.map((e=>g(e))).join(""))(t,/.*\b/,e.binary,/\b.*/)), -a({className:"meta",begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{ -0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:b,APOS_STRING_MODE:E, -QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:v,COMMENT:w,C_LINE_COMMENT_MODE:y, -C_BLOCK_COMMENT_MODE:N,HASH_COMMENT_MODE:R,NUMBER_MODE:{className:"number", -begin:f,relevance:0},C_NUMBER_MODE:{className:"number",begin:p,relevance:0}, -BINARY_NUMBER_MODE:{className:"number",begin:m,relevance:0},CSS_NUMBER_MODE:{ -className:"number", -begin:f+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", -relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp", -begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[b,{begin:/\[/,end:/\]/, -relevance:0,contains:[b]}]}]},TITLE_MODE:{className:"title",begin:h,relevance:0 -},UNDERSCORE_TITLE_MODE:{className:"title",begin:d,relevance:0},METHOD_GUARD:{ -begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ -"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ -t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function k(e,t){ -"."===e.input[e.index-1]&&t.ignoreMatch()}function M(e,t){ -t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", -e.__beforeBegin=k,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, -void 0===e.relevance&&(e.relevance=0))}function O(e,t){ -Array.isArray(e.illegal)&&(e.illegal=((...e)=>"("+e.map((e=>g(e))).join("|")+")")(...e.illegal)) -}function A(e,t){if(e.match){ -if(e.begin||e.end)throw Error("begin & end are not supported with match") -;e.begin=e.match,delete e.match}}function L(e,t){ -void 0===e.relevance&&(e.relevance=1)} -const I=["of","and","for","in","not","or","if","then","parent","list","value"] -;function j(e,t,n="keyword"){const i={} -;return"string"==typeof e?s(n,e.split(" ")):Array.isArray(e)?s(n,e):Object.keys(e).forEach((n=>{ -Object.assign(i,j(e[n],t,n))})),i;function s(e,n){ -t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") -;i[n[0]]=[e,B(n[0],n[1])]}))}}function B(e,t){ -return t?Number(t):(e=>I.includes(e.toLowerCase()))(e)?0:1} -function T(e,{plugins:t}){function n(t,n){ -return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(n?"g":""))}class i{ -constructor(){ -this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} -addRule(e,t){ -t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), -this.matchAt+=(e=>RegExp(e.toString()+"|").exec("").length-1)(e)+1}compile(){ -0===this.regexes.length&&(this.exec=()=>null) -;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(((e,t="|")=>{let n=0 -;return e.map((e=>{n+=1;const t=n;let i=g(e),s="";for(;i.length>0;){ -const e=u.exec(i);if(!e){s+=i;break} -s+=i.substring(0,e.index),i=i.substring(e.index+e[0].length), -"\\"===e[0][0]&&e[1]?s+="\\"+(Number(e[1])+t):(s+=e[0],"("===e[0]&&n++)}return s -})).map((e=>`(${e})`)).join(t)})(e),!0),this.lastIndex=0}exec(e){ -this.matcherRe.lastIndex=this.lastIndex;const t=this.matcherRe.exec(e) -;if(!t)return null -;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] -;return t.splice(0,n),Object.assign(t,i)}}class s{constructor(){ -this.rules=[],this.multiRegexes=[], -this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ -if(this.multiRegexes[e])return this.multiRegexes[e];const t=new i -;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), -t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ -return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ -this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ -const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex -;let n=t.exec(e) -;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ -const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} -return n&&(this.regexIndex+=n.position+1, -this.regexIndex===this.count&&this.considerAll()),n}} -if(e.compilerExtensions||(e.compilerExtensions=[]), -e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") -;return e.classNameAliases=a(e.classNameAliases||{}),function t(i,r){const l=i -;if(i.isCompiled)return l -;[A].forEach((e=>e(i,r))),e.compilerExtensions.forEach((e=>e(i,r))), -i.__beforeBegin=null,[M,O,L].forEach((e=>e(i,r))),i.isCompiled=!0;let o=null -;if("object"==typeof i.keywords&&(o=i.keywords.$pattern, -delete i.keywords.$pattern), -i.keywords&&(i.keywords=j(i.keywords,e.case_insensitive)), -i.lexemes&&o)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ") -;return o=o||i.lexemes||/\w+/, -l.keywordPatternRe=n(o,!0),r&&(i.begin||(i.begin=/\B|\b/), -l.beginRe=n(i.begin),i.endSameAsBegin&&(i.end=i.begin), -i.end||i.endsWithParent||(i.end=/\B|\b/), -i.end&&(l.endRe=n(i.end)),l.terminatorEnd=g(i.end)||"", -i.endsWithParent&&r.terminatorEnd&&(l.terminatorEnd+=(i.end?"|":"")+r.terminatorEnd)), -i.illegal&&(l.illegalRe=n(i.illegal)), -i.contains||(i.contains=[]),i.contains=[].concat(...i.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>a(e,{ -variants:null},t)))),e.cachedVariants?e.cachedVariants:S(e)?a(e,{ -starts:e.starts?a(e.starts):null -}):Object.isFrozen(e)?a(e):e))("self"===e?i:e)))),i.contains.forEach((e=>{t(e,l) -})),i.starts&&t(i.starts,r),l.matcher=(e=>{const t=new s -;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" -}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" -}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(l),l}(e)}function S(e){ -return!!e&&(e.endsWithParent||S(e.starts))}function P(e){const t={ -props:["language","code","autodetect"],data:()=>({detectedLanguage:"", -unknownLanguage:!1}),computed:{className(){ -return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){ -if(!this.autoDetect&&!e.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`), -this.unknownLanguage=!0,s(this.code);let t={} -;return this.autoDetect?(t=e.highlightAuto(this.code), -this.detectedLanguage=t.language):(t=e.highlight(this.language,this.code,this.ignoreIllegals), -this.detectedLanguage=this.language),t.value},autoDetect(){ -return!(this.language&&(e=this.autodetect,!e&&""!==e));var e}, -ignoreIllegals:()=>!0},render(e){return e("pre",{},[e("code",{ -class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{ -Component:t,VuePlugin:{install(e){e.component("highlightjs",t)}}}}const D={ -"after:highlightElement":({el:e,result:t,text:n})=>{const i=H(e) -;if(!i.length)return;const a=document.createElement("div") -;a.innerHTML=t.value,t.value=((e,t,n)=>{let i=0,a="";const r=[];function l(){ -return e.length&&t.length?e[0].offset!==t[0].offset?e[0].offset"}function c(e){ -a+=""}function g(e){("start"===e.event?o:c)(e.node)} -for(;e.length||t.length;){let t=l() -;if(a+=s(n.substring(i,t[0].offset)),i=t[0].offset,t===e){r.reverse().forEach(c) -;do{g(t.splice(0,1)[0]),t=l()}while(t===e&&t.length&&t[0].offset===i) -;r.reverse().forEach(o) -}else"start"===t[0].event?r.push(t[0].node):r.pop(),g(t.splice(0,1)[0])} -return a+s(n.substr(i))})(i,H(a),n)}};function C(e){ -return e.nodeName.toLowerCase()}function H(e){const t=[];return function e(n,i){ -for(let s=n.firstChild;s;s=s.nextSibling)3===s.nodeType?i+=s.nodeValue.length:1===s.nodeType&&(t.push({ -event:"start",offset:i,node:s}),i=e(s,i),C(s).match(/br|hr|img|input/)||t.push({ -event:"stop",offset:i,node:s}));return i}(e,0),t}const $={},U=e=>{ -console.error(e)},z=(e,...t)=>{console.log("WARN: "+e,...t)},K=(e,t)=>{ -$[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),$[`${e}/${t}`]=!0) -},G=s,V=a,W=Symbol("nomatch");return(e=>{ -const n=Object.create(null),s=Object.create(null),a=[];let r=!0 -;const l=/(^(<[^>]+>|\t|)+|\n)/gm,o="Could not find the language '{}', did you forget to load/include a language module?",g={ -disableAutodetect:!0,name:"Plain text",contains:[]};let u={ -noHighlightRe:/^(no-?highlight)$/i, -languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", -tabReplace:null,useBR:!1,languages:null,__emitter:c};function h(e){ -return u.noHighlightRe.test(e)}function d(e,t,n,i){let s="",a="" -;"object"==typeof t?(s=e, -n=t.ignoreIllegals,a=t.language,i=void 0):(K("10.7.0","highlight(lang, code, ...args) has been deprecated."), -K("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), -a=e,s=t);const r={code:s,language:a};M("before:highlight",r) -;const l=r.result?r.result:f(r.language,r.code,n,i) -;return l.code=r.code,M("after:highlight",l),l}function f(e,t,s,l){ -function c(e,t){const n=v.case_insensitive?t[0].toLowerCase():t[0] -;return Object.prototype.hasOwnProperty.call(e.keywords,n)&&e.keywords[n]} -function g(){null!=R.subLanguage?(()=>{if(""===M)return;let e=null -;if("string"==typeof R.subLanguage){ -if(!n[R.subLanguage])return void k.addText(M) -;e=f(R.subLanguage,M,!0,_[R.subLanguage]),_[R.subLanguage]=e.top -}else e=p(M,R.subLanguage.length?R.subLanguage:null) -;R.relevance>0&&(O+=e.relevance),k.addSublanguage(e.emitter,e.language) -})():(()=>{if(!R.keywords)return void k.addText(M);let e=0 -;R.keywordPatternRe.lastIndex=0;let t=R.keywordPatternRe.exec(M),n="";for(;t;){ -n+=M.substring(e,t.index);const i=c(R,t);if(i){const[e,s]=i -;if(k.addText(n),n="",O+=s,e.startsWith("_"))n+=t[0];else{ -const n=v.classNameAliases[e]||e;k.addKeyword(t[0],n)}}else n+=t[0] -;e=R.keywordPatternRe.lastIndex,t=R.keywordPatternRe.exec(M)} -n+=M.substr(e),k.addText(n)})(),M=""}function h(e){ -return e.className&&k.openNode(v.classNameAliases[e.className]||e.className), -R=Object.create(e,{parent:{value:R}}),R}function d(e,t,n){let s=((e,t)=>{ -const n=e&&e.exec(t);return n&&0===n.index})(e.endRe,n);if(s){if(e["on:end"]){ -const n=new i(e);e["on:end"](t,n),n.isMatchIgnored&&(s=!1)}if(s){ -for(;e.endsParent&&e.parent;)e=e.parent;return e}} -if(e.endsWithParent)return d(e.parent,t,n)}function m(e){ -return 0===R.matcher.regexIndex?(M+=e[0],1):(I=!0,0)}function b(e){ -const n=e[0],i=t.substr(e.index),s=d(R,e,i);if(!s)return W;const a=R -;a.skip?M+=n:(a.returnEnd||a.excludeEnd||(M+=n),g(),a.excludeEnd&&(M=n));do{ -R.className&&k.closeNode(),R.skip||R.subLanguage||(O+=R.relevance),R=R.parent -}while(R!==s.parent) -;return s.starts&&(s.endSameAsBegin&&(s.starts.endRe=s.endRe), -h(s.starts)),a.returnEnd?0:n.length}let E={};function x(n,a){const l=a&&a[0] -;if(M+=n,null==l)return g(),0 -;if("begin"===E.type&&"end"===a.type&&E.index===a.index&&""===l){ -if(M+=t.slice(a.index,a.index+1),!r){const t=Error("0 width match regex") -;throw t.languageName=e,t.badRule=E.rule,t}return 1} -if(E=a,"begin"===a.type)return function(e){ -const t=e[0],n=e.rule,s=new i(n),a=[n.__beforeBegin,n["on:begin"]] -;for(const n of a)if(n&&(n(e,s),s.isMatchIgnored))return m(t) -;return n&&n.endSameAsBegin&&(n.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")), -n.skip?M+=t:(n.excludeBegin&&(M+=t), -g(),n.returnBegin||n.excludeBegin||(M=t)),h(n),n.returnBegin?0:t.length}(a) -;if("illegal"===a.type&&!s){ -const e=Error('Illegal lexeme "'+l+'" for mode "'+(R.className||"")+'"') -;throw e.mode=R,e}if("end"===a.type){const e=b(a);if(e!==W)return e} -if("illegal"===a.type&&""===l)return 1 -;if(L>1e5&&L>3*a.index)throw Error("potential infinite loop, way more iterations than matches") -;return M+=l,l.length}const v=N(e) -;if(!v)throw U(o.replace("{}",e)),Error('Unknown language: "'+e+'"') -;const w=T(v,{plugins:a});let y="",R=l||w;const _={},k=new u.__emitter(u);(()=>{ -const e=[];for(let t=R;t!==v;t=t.parent)t.className&&e.unshift(t.className) -;e.forEach((e=>k.openNode(e)))})();let M="",O=0,A=0,L=0,I=!1;try{ -for(R.matcher.considerAll();;){ -L++,I?I=!1:R.matcher.considerAll(),R.matcher.lastIndex=A -;const e=R.matcher.exec(t);if(!e)break;const n=x(t.substring(A,e.index),e) -;A=e.index+n}return x(t.substr(A)),k.closeAllNodes(),k.finalize(),y=k.toHTML(),{ -relevance:Math.floor(O),value:y,language:e,illegal:!1,emitter:k,top:R}}catch(n){ -if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{ -msg:n.message,context:t.slice(A-100,A+100),mode:n.mode},sofar:y,relevance:0, -value:G(t),emitter:k};if(r)return{illegal:!1,relevance:0,value:G(t),emitter:k, -language:e,top:R,errorRaised:n};throw n}}function p(e,t){ -t=t||u.languages||Object.keys(n);const i=(e=>{const t={relevance:0, -emitter:new u.__emitter(u),value:G(e),illegal:!1,top:g} -;return t.emitter.addText(e),t})(e),s=t.filter(N).filter(k).map((t=>f(t,e,!1))) -;s.unshift(i);const a=s.sort(((e,t)=>{ -if(e.relevance!==t.relevance)return t.relevance-e.relevance -;if(e.language&&t.language){if(N(e.language).supersetOf===t.language)return 1 -;if(N(t.language).supersetOf===e.language)return-1}return 0})),[r,l]=a,o=r -;return o.second_best=l,o}const m={"before:highlightElement":({el:e})=>{ -u.useBR&&(e.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")) -},"after:highlightElement":({result:e})=>{ -u.useBR&&(e.value=e.value.replace(/\n/g,"
"))}},b=/^(<[^>]+>|\t)+/gm,E={ -"after:highlightElement":({result:e})=>{ -u.tabReplace&&(e.value=e.value.replace(b,(e=>e.replace(/\t/g,u.tabReplace))))}} -;function x(e){let t=null;const n=(e=>{let t=e.className+" " -;t+=e.parentNode?e.parentNode.className:"";const n=u.languageDetectRe.exec(t) -;if(n){const t=N(n[1]) -;return t||(z(o.replace("{}",n[1])),z("Falling back to no-highlight mode for this block.",e)), -t?n[1]:"no-highlight"}return t.split(/\s+/).find((e=>h(e)||N(e)))})(e) -;if(h(n))return;M("before:highlightElement",{el:e,language:n}),t=e -;const i=t.textContent,a=n?d(i,{language:n,ignoreIllegals:!0}):p(i) -;M("after:highlightElement",{el:e,result:a,text:i -}),e.innerHTML=a.value,((e,t,n)=>{const i=t?s[t]:n -;e.classList.add("hljs"),i&&e.classList.add(i)})(e,n,a.language),e.result={ -language:a.language,re:a.relevance,relavance:a.relevance -},a.second_best&&(e.second_best={language:a.second_best.language, -re:a.second_best.relevance,relavance:a.second_best.relevance})}const v=()=>{ -v.called||(v.called=!0, -K("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead."), -document.querySelectorAll("pre code").forEach(x))};let w=!1;function y(){ -"loading"!==document.readyState?document.querySelectorAll("pre code").forEach(x):w=!0 -}function N(e){return e=(e||"").toLowerCase(),n[e]||n[s[e]]} -function R(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ -s[e.toLowerCase()]=t}))}function k(e){const t=N(e) -;return t&&!t.disableAutodetect}function M(e,t){const n=e;a.forEach((e=>{ -e[n]&&e[n](t)}))} -"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ -w&&y()}),!1),Object.assign(e,{highlight:d,highlightAuto:p,highlightAll:y, -fixMarkup:e=>{ -return K("10.2.0","fixMarkup will be removed entirely in v11.0"),K("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"), -t=e, -u.tabReplace||u.useBR?t.replace(l,(e=>"\n"===e?u.useBR?"
":e:u.tabReplace?e.replace(/\t/g,u.tabReplace):e)):t -;var t},highlightElement:x, -highlightBlock:e=>(K("10.7.0","highlightBlock will be removed entirely in v12.0"), -K("10.7.0","Please use highlightElement now."),x(e)),configure:e=>{ -e.useBR&&(K("10.3.0","'useBR' will be removed entirely in v11.0"), -K("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")), -u=V(u,e)},initHighlighting:v,initHighlightingOnLoad:()=>{ -K("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."), -w=!0},registerLanguage:(t,i)=>{let s=null;try{s=i(e)}catch(e){ -if(U("Language definition for '{}' could not be registered.".replace("{}",t)), -!r)throw e;U(e),s=g} -s.name||(s.name=t),n[t]=s,s.rawDefinition=i.bind(null,e),s.aliases&&R(s.aliases,{ -languageName:t})},unregisterLanguage:e=>{delete n[e] -;for(const t of Object.keys(s))s[t]===e&&delete s[t]}, -listLanguages:()=>Object.keys(n),getLanguage:N,registerAliases:R, -requireLanguage:e=>{ -K("10.4.0","requireLanguage will be removed entirely in v11."), -K("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844") -;const t=N(e);if(t)return t -;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))}, -autoDetection:k,inherit:V,addPlugin:e=>{(e=>{ -e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ -e["before:highlightBlock"](Object.assign({block:t.el},t)) -}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ -e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),a.push(e)}, -vuePlugin:P(e).VuePlugin}),e.debugMode=()=>{r=!1},e.safeMode=()=>{r=!0 -},e.versionString="10.7.2";for(const e in _)"object"==typeof _[e]&&t(_[e]) -;return Object.assign(e,_),e.addPlugin(m),e.addPlugin(D),e.addPlugin(E),e})({}) -}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); -hljs.registerLanguage("apache",(()=>{"use strict";return e=>{const n={ -className:"number",begin:/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?/} -;return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0, -contains:[e.HASH_COMMENT_MODE,{className:"section",begin:/<\/?/,end:/>/, -contains:[n,{className:"number",begin:/:\d{1,5}/ -},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute", -begin:/\w+/,relevance:0,keywords:{ -nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername" -},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"}, -contains:[{className:"meta",begin:/\s\[/,end:/\]$/},{className:"variable", -begin:/[\$%]\{/,end:/\}/,contains:["self",{className:"number",begin:/[$%]\d+/}] -},n,{className:"number",begin:/\d+/},e.QUOTE_STRING_MODE]}}],illegal:/\S/}} -})()); -hljs.registerLanguage("bash",(()=>{"use strict";function e(...e){ -return e.map((e=>{return(s=e)?"string"==typeof s?s:s.source:null;var s -})).join("")}return s=>{const n={},t={begin:/\$\{/,end:/\}/,contains:["self",{ -begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{ -begin:e(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},t]});const a={ -className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},i={ -begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/, -end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/, -contains:[s.BACKSLASH_ESCAPE,n,a]};a.contains.push(c);const o={begin:/\$\(\(/, -end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,n] -},r=s.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 -}),l={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, -contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ -name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/, -keyword:"if then else elif fi for while in do done case esac function", -literal:"true false", -built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp" -},contains:[r,s.SHEBANG(),l,o,s.HASH_COMMENT_MODE,i,c,{className:"",begin:/\\"/ -},{className:"string",begin:/'/,end:/'/},n]}}})()); -hljs.registerLanguage("c",(()=>{"use strict";function e(e){ -return((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(",e,")?") -}return t=>{const n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}] -}),r="[a-zA-Z_]\\w*::",a="(decltype\\(auto\\)|"+e(r)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",i={ -className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string", -variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", -contains:[t.BACKSLASH_ESCAPE]},{ -begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", -end:"'",illegal:"."},t.END_SAME_AS_BEGIN({ -begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ -className:"number",variants:[{begin:"\\b(0b[01']+)"},{ -begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" -},{ -begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" -}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ -"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" -},contains:[{begin:/\\\n/,relevance:0},t.inherit(s,{className:"meta-string"}),{ -className:"meta-string",begin:/<.*?>/},n,t.C_BLOCK_COMMENT_MODE]},l={ -className:"title",begin:e(r)+t.IDENT_RE,relevance:0 -},d=e(r)+t.IDENT_RE+"\\s*\\(",u={ -keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", -built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary", -literal:"true false nullptr NULL"},m=[c,i,n,t.C_BLOCK_COMMENT_MODE,o,s],p={ -variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ -beginKeywords:"new throw return else",end:/;/}],keywords:u,contains:m.concat([{ -begin:/\(/,end:/\)/,keywords:u,contains:m.concat(["self"]),relevance:0}]), -relevance:0},_={className:"function",begin:"("+a+"[\\*&\\s]+)+"+d, -returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:u,illegal:/[^\w\s\*&:<>.]/, -contains:[{begin:"decltype\\(auto\\)",keywords:u,relevance:0},{begin:d, -returnBegin:!0,contains:[l],relevance:0},{className:"params",begin:/\(/, -end:/\)/,keywords:u,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,s,o,i,{ -begin:/\(/,end:/\)/,keywords:u,relevance:0, -contains:["self",n,t.C_BLOCK_COMMENT_MODE,s,o,i]}] -},i,n,t.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, -disableAutodetect:!0,illegal:"",keywords:u,contains:["self",i]},{begin:t.IDENT_RE+"::",keywords:u},{ -className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, -contains:[{beginKeywords:"final class struct"},t.TITLE_MODE]}]),exports:{ -preprocessor:c,strings:s,keywords:u}}}})()); -hljs.registerLanguage("coffeescript",(()=>{"use strict" -;const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) -;return r=>{const t={ -keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((i=["var","const","let","function","static"], -e=>!i.includes(e))),literal:n.concat(["yes","no","on","off"]), -built_in:a.concat(["npm","print"])};var i;const s="[A-Za-z$_][0-9A-Za-z$_]*",o={ -className:"subst",begin:/#\{/,end:/\}/,keywords:t -},c=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?", -relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/, -contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE] -},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,o]},{begin:/"/,end:/"/, -contains:[r.BACKSLASH_ESCAPE,o]}]},{className:"regexp",variants:[{begin:"///", -end:"///",contains:[o,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)", -relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+s -},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{ -begin:"```",end:"```"},{begin:"`",end:"`"}]}];o.contains=c -;const l=r.inherit(r.TITLE_MODE,{begin:s}),d="(\\(.*\\)\\s*)?\\B[-=]>",g={ -className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/, -end:/\)/,keywords:t,contains:["self"].concat(c)}]};return{name:"CoffeeScript", -aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/, -contains:c.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{ -className:"function",begin:"^\\s*"+s+"\\s*=\\s*"+d,end:"[-=]>",returnBegin:!0, -contains:[l,g]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function", -begin:d,end:"[-=]>",returnBegin:!0,contains:[g]}]},{className:"class", -beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{ -beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[l]},l] -},{begin:s+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}})()); -hljs.registerLanguage("cpp",(()=>{"use strict";function e(e){ -return t("(",e,")?")}function t(...e){return e.map((e=>{ -return(t=e)?"string"==typeof t?t:t.source:null;var t})).join("")}return n=>{ -const r=n.COMMENT("//","$",{contains:[{begin:/\\\n/}] -}),a="[a-zA-Z_]\\w*::",i="(decltype\\(auto\\)|"+e(a)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",s={ -className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string", -variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", -contains:[n.BACKSLASH_ESCAPE]},{ -begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", -end:"'",illegal:"."},n.END_SAME_AS_BEGIN({ -begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ -className:"number",variants:[{begin:"\\b(0b[01']+)"},{ -begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" -},{ -begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" -}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ -"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" -},contains:[{begin:/\\\n/,relevance:0},n.inherit(c,{className:"meta-string"}),{ -className:"meta-string",begin:/<.*?>/},r,n.C_BLOCK_COMMENT_MODE]},d={ -className:"title",begin:e(a)+n.IDENT_RE,relevance:0 -},u=e(a)+n.IDENT_RE+"\\s*\\(",m={ -keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", -built_in:"_Bool _Complex _Imaginary", -_relevance_hints:["asin","atan2","atan","calloc","ceil","cosh","cos","exit","exp","fabs","floor","fmod","fprintf","fputs","free","frexp","auto_ptr","deque","list","queue","stack","vector","map","set","pair","bitset","multiset","multimap","unordered_set","fscanf","future","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","tolower","toupper","labs","ldexp","log10","log","malloc","realloc","memchr","memcmp","memcpy","memset","modf","pow","printf","putchar","puts","scanf","sinh","sin","snprintf","sprintf","sqrt","sscanf","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","tanh","tan","unordered_map","unordered_multiset","unordered_multimap","priority_queue","make_pair","array","shared_ptr","abort","terminate","abs","acos","vfprintf","vprintf","vsprintf","endl","initializer_list","unique_ptr","complex","imaginary","std","string","wstring","cin","cout","cerr","clog","stdin","stdout","stderr","stringstream","istringstream","ostringstream"], -literal:"true false nullptr NULL"},p={className:"function.dispatch",relevance:0, -keywords:m, -begin:t(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!while)/,n.IDENT_RE,(_=/\s*\(/, -t("(?=",_,")")))};var _;const g=[p,l,s,r,n.C_BLOCK_COMMENT_MODE,o,c],b={ -variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ -beginKeywords:"new throw return else",end:/;/}],keywords:m,contains:g.concat([{ -begin:/\(/,end:/\)/,keywords:m,contains:g.concat(["self"]),relevance:0}]), -relevance:0},f={className:"function",begin:"("+i+"[\\*&\\s]+)+"+u, -returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:m,illegal:/[^\w\s\*&:<>.]/, -contains:[{begin:"decltype\\(auto\\)",keywords:m,relevance:0},{begin:u, -returnBegin:!0,contains:[d],relevance:0},{begin:/::/,relevance:0},{begin:/:/, -endsWithParent:!0,contains:[c,o]},{className:"params",begin:/\(/,end:/\)/, -keywords:m,relevance:0,contains:[r,n.C_BLOCK_COMMENT_MODE,c,o,s,{begin:/\(/, -end:/\)/,keywords:m,relevance:0,contains:["self",r,n.C_BLOCK_COMMENT_MODE,c,o,s] -}]},s,r,n.C_BLOCK_COMMENT_MODE,l]};return{name:"C++", -aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:m,illegal:"",keywords:m,contains:["self",s]},{begin:n.IDENT_RE+"::",keywords:m},{ -className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, -contains:[{beginKeywords:"final class struct"},n.TITLE_MODE]}]),exports:{ -preprocessor:l,strings:c,keywords:m}}}})()); -hljs.registerLanguage("csharp",(()=>{"use strict";return e=>{const n={ -keyword:["abstract","as","base","break","case","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), -built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], -literal:["default","false","null","true"]},a=e.inherit(e.TITLE_MODE,{ -begin:"[a-zA-Z](\\.?\\w)*"}),i={className:"number",variants:[{ -begin:"\\b(0b[01']+)"},{ -begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ -begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" -}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] -},t=e.inherit(s,{illegal:/\n/}),r={className:"subst",begin:/\{/,end:/\}/, -keywords:n},l=e.inherit(r,{illegal:/\n/}),c={className:"string",begin:/\$"/, -end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ -},e.BACKSLASH_ESCAPE,l]},o={className:"string",begin:/\$@"/,end:'"',contains:[{ -begin:/\{\{/},{begin:/\}\}/},{begin:'""'},r]},d=e.inherit(o,{illegal:/\n/, -contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},l]}) -;r.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.C_BLOCK_COMMENT_MODE], -l.contains=[d,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.inherit(e.C_BLOCK_COMMENT_MODE,{ -illegal:/\n/})];const g={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] -},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},a] -},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={ -begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], -keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, -contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ -begin:"\x3c!--|--\x3e"},{begin:""}]}] -}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", -end:"$",keywords:{ -"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum" -}},g,i,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, -illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" -},a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", -relevance:0,end:/[{;=]/,illegal:/[^\s:]/, -contains:[a,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ -beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, -contains:[a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", -begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ -className:"meta-string",begin:/"/,end:/"/}]},{ -beginKeywords:"new return throw await else",relevance:0},{className:"function", -begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(<.+>\\s*)?\\(",returnBegin:!0, -end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ -beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", -relevance:0},{begin:e.IDENT_RE+"\\s*(<.+>\\s*)?\\(",returnBegin:!0, -contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/, -excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, -contains:[g,i,e.C_BLOCK_COMMENT_MODE] -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}})()); -hljs.registerLanguage("css",(()=>{"use strict" -;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],r=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() -;return n=>{const a=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, -HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, -ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, -illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} -}))(n),l=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS", -case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"}, -classNameAliases:{keyframePosition:"selector-tag"}, -contains:[n.C_BLOCK_COMMENT_MODE,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ -},n.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 -},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 -},a.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ -begin:":("+i.join("|")+")"},{begin:"::("+o.join("|")+")"}]},{ -className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{begin:":",end:"[;}]", -contains:[a.HEXCOLOR,a.IMPORTANT,n.CSS_NUMBER_MODE,...l,{ -begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" -},contains:[{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}] -},{className:"built_in",begin:/[\w-]+(?=\()/}]},{ -begin:(s=/@/,((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(?=",s,")")), -end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword", -begin:/@-?\w[\w]*(-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0, -relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only", -attribute:t.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute" -},...l,n.CSS_NUMBER_MODE]}]},{className:"selector-tag", -begin:"\\b("+e.join("|")+")\\b"}]};var s}})()); -hljs.registerLanguage("diff",(()=>{"use strict";return e=>({name:"Diff", -aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{ -begin:/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{ -begin:/^--- +\d+,\d+ +----$/}]},{className:"comment",variants:[{begin:/Index: /, -end:/$/},{begin:/^index/,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^-{3}/,end:/$/ -},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/},{ -begin:/^diff --git/,end:/$/}]},{className:"addition",begin:/^\+/,end:/$/},{ -className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, -end:/$/}]})})()); -hljs.registerLanguage("go",(()=>{"use strict";return e=>{const n={ -keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune", -literal:"true false iota nil", -built_in:"append cap close complex copy imag len make new panic print println real recover delete" -};return{name:"Go",aliases:["golang"],keywords:n,illegal:"{"use strict";function e(...e){ -return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n -})).join("")}return n=>{const a="HTTP/(2|1\\.[01])",s={className:"attribute", -begin:e("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{ -className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]} -},t=[s,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{ -name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+a+" \\d{3})", -end:/$/,contains:[{className:"meta",begin:a},{className:"number", -begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:t}},{ -begin:"(?=^[A-Z]+ (.*?) "+a+"$)",end:/$/,contains:[{className:"string", -begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:a},{ -className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:t} -},n.inherit(s,{relevance:0})]}}})()); -hljs.registerLanguage("ini",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(...n){ -return n.map((n=>e(n))).join("")}return s=>{const a={className:"number", -relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{begin:s.NUMBER_RE}] -},i=s.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];const t={ -className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)\}/ -}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={ -className:"string",contains:[s.BACKSLASH_ESCAPE],variants:[{begin:"'''", -end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"' -},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,a,"self"], -relevance:0 -},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map((n=>e(n))).join("|")+")" -;return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, -contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{ -begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr", -starts:{end:/$/,contains:[i,c,r,t,l,a]}}]}}})()); -hljs.registerLanguage("java",(()=>{"use strict" -;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ -className:"number",variants:[{ -begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` -},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ -begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ -begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` -},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ -begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], -relevance:0};return e=>{ -var n="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s={ -className:"meta",begin:"@[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*", -contains:[{begin:/\(/,end:/\)/,contains:["self"]}]};const r=a;return{ -name:"Java",aliases:["jsp"],keywords:n,illegal:/<\/|#/, -contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, -relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ -begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ -className:"class",beginKeywords:"class interface enum",end:/[{;=]/, -excludeEnd:!0,relevance:1,keywords:"class interface enum",illegal:/[:"\[\]]/, -contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ -beginKeywords:"new throw return else",relevance:0},{className:"class", -begin:"record\\s+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,excludeEnd:!0, -end:/[{;=]/,keywords:n,contains:[{beginKeywords:"record"},{ -begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, -contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, -keywords:n,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE] -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"function", -begin:"([\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(<[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(\\s*,\\s*[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(", -returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:n,contains:[{ -begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, -contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, -keywords:n,relevance:0, -contains:[s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,r,e.C_BLOCK_COMMENT_MODE] -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},r,s]}}})()); -hljs.registerLanguage("javascript",(()=>{"use strict" -;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) -;function r(e){return t("(?=",e,")")}function t(...e){return e.map((e=>{ -return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return i=>{ -const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/, -isTrulyOpeningTag:(e,n)=>{const a=e[0].length+e.index,s=e.input[a] -;"<"!==s?">"===s&&(((e,{after:n})=>{const a="", -returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{ -begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0 -},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:f}]}] -},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{ -variants:[{begin:"<>",end:""},{begin:o.begin,"on:begin":o.isTrulyOpeningTag, -end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0, -contains:["self"]}]}],relevance:0},{className:"function", -beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l, -contains:["self",i.inherit(i.TITLE_MODE,{begin:c}),p],illegal:/%/},{ -beginKeywords:"while if switch catch for"},{className:"function", -begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", -returnBegin:!0,contains:[p,i.inherit(i.TITLE_MODE,{begin:c})]},{variants:[{ -begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class", -beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{ -beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/, -end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:c}),"self",p] -},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set", -contains:[i.inherit(i.TITLE_MODE,{begin:c}),{begin:/\(\)/},p]},{begin:/\$[(.]/}] -}}})()); -hljs.registerLanguage("json",(()=>{"use strict";return n=>{const e={ -literal:"true false null" -},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],a=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],l={ -end:",",endsWithParent:!0,excludeEnd:!0,contains:a,keywords:e},t={begin:/\{/, -end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/, -contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(l,{begin:/:/ -})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(l)], -illegal:"\\S"};return a.push(t,s),i.forEach((n=>{a.push(n)})),{name:"JSON", -contains:a,keywords:e,illegal:"\\S"}}})()); -hljs.registerLanguage("kotlin",(()=>{"use strict" -;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ -className:"number",variants:[{ -begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` -},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ -begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ -begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` -},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ -begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], -relevance:0};return e=>{const n={ -keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", -built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", -literal:"true false null"},i={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" -},s={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},t={ -className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", -variants:[{begin:'"""',end:'"""(?=[^"])',contains:[t,s]},{begin:"'",end:"'", -illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, -contains:[e.BACKSLASH_ESCAPE,t,s]}]};s.contains.push(r);const l={ -className:"meta", -begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" -},c={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, -end:/\)/,contains:[e.inherit(r,{className:"meta-string"})]}] -},o=a,b=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),E={ -variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, -contains:[]}]},d=E;return d.variants[1].contains=[E],E.variants[1].contains=[d], -{name:"Kotlin",aliases:["kt","kts"],keywords:n, -contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", -begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,b,{className:"keyword", -begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", -begin:/@\w+/}]}},i,l,c,{className:"function",beginKeywords:"fun",end:"[(]|$", -returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ -begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, -contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, -keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, -endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, -endsWithParent:!0,contains:[E,e.C_LINE_COMMENT_MODE,b],relevance:0 -},e.C_LINE_COMMENT_MODE,b,l,c,r,e.C_NUMBER_MODE]},b]},{className:"class", -beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, -illegal:"extends implements",contains:[{ -beginKeywords:"public protected internal private constructor" -},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, -excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/, -excludeBegin:!0,returnEnd:!0},l,c]},r,{className:"meta",begin:"^#!/usr/bin/env", -end:"$",illegal:"\n"},o]}}})()); -hljs.registerLanguage("less",(()=>{"use strict" -;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],n=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse(),r=i.concat(o) -;return a=>{const s=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, -HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, -ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, -illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} -}))(a),l=r,d="([\\w-]+|@\\{[\\w-]+\\})",c=[],g=[],b=e=>({className:"string", -begin:"~?"+e+".*?"+e}),m=(e,t,i)=>({className:e,begin:t,relevance:i}),u={ -$pattern:/[a-z-]+/,keyword:"and or not only",attribute:t.join(" ")},p={ -begin:"\\(",end:"\\)",contains:g,keywords:u,relevance:0} -;g.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,b("'"),b('"'),a.CSS_NUMBER_MODE,{ -begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", -excludeEnd:!0} -},s.HEXCOLOR,p,m("variable","@@?[\\w-]+",10),m("variable","@\\{[\\w-]+\\}"),m("built_in","~?`[^`]*?`"),{ -className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0 -},s.IMPORTANT);const f=g.concat({begin:/\{/,end:/\}/,contains:c}),h={ -beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not" -}].concat(g)},w={begin:d+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0, -contains:[{begin:/-(webkit|moz|ms|o)-/},{className:"attribute", -begin:"\\b("+n.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0, -illegal:"[<=$]",relevance:0,contains:g}}]},v={className:"keyword", -begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", -starts:{end:"[;{}]",keywords:u,returnEnd:!0,contains:g,relevance:0}},y={ -className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{ -begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:f}},k={variants:[{ -begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:d,end:/\{/}],returnBegin:!0, -returnEnd:!0,illegal:"[<='$\"]",relevance:0, -contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,h,m("keyword","all\\b"),m("variable","@\\{[\\w-]+\\}"),{ -begin:"\\b("+e.join("|")+")\\b",className:"selector-tag" -},m("selector-tag",d+"%?",0),m("selector-id","#"+d),m("selector-class","\\."+d,0),m("selector-tag","&",0),s.ATTRIBUTE_SELECTOR_MODE,{ -className:"selector-pseudo",begin:":("+i.join("|")+")"},{ -className:"selector-pseudo",begin:"::("+o.join("|")+")"},{begin:"\\(",end:"\\)", -contains:f},{begin:"!important"}]},E={begin:`[\\w-]+:(:)?(${l.join("|")})`, -returnBegin:!0,contains:[k]} -;return c.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,v,y,E,w,k),{ -name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:c}}})()); -hljs.registerLanguage("lua",(()=>{"use strict";return e=>{ -const t="\\[=*\\[",a="\\]=*\\]",n={begin:t,end:a,contains:["self"] -},o=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[",a,{contains:[n], -relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, -literal:"true false nil", -keyword:"and break do else elseif end for goto if in local not or repeat return then until while", -built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" -},contains:o.concat([{className:"function",beginKeywords:"function",end:"\\)", -contains:[e.inherit(e.TITLE_MODE,{ -begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", -begin:"\\(",endsWithParent:!0,contains:o}].concat(o) -},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", -begin:t,end:a,contains:[n],relevance:5}])}}})()); -hljs.registerLanguage("makefile",(()=>{"use strict";return e=>{const i={ -className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", -contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} -function a(...n){return n.map((n=>e(n))).join("")}function s(...n){ -return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ -const t=a(/[A-Z_]/,a("(",/[A-Z0-9_.-]*:/,")?"),/[A-Z0-9_.-]*/),i={ -className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},r={begin:/\s/, -contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] -},c=e.inherit(r,{begin:/\(/,end:/\)/}),l=e.inherit(e.APOS_STRING_MODE,{ -className:"meta-string"}),g=e.inherit(e.QUOTE_STRING_MODE,{ -className:"meta-string"}),m={endsWithParent:!0,illegal:/`]+/}]}] -}]};return{name:"HTML, XML", -aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], -case_insensitive:!0,contains:[{className:"meta",begin://, -relevance:10,contains:[r,g,l,c,{begin:/\[/,end:/\]/,contains:[{className:"meta", -begin://,contains:[r,c,g,l]}]}]},e.COMMENT(//,{ -relevance:10}),{begin://,relevance:10},i,{ -className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag", -begin:/)/,end:/>/,keywords:{name:"style"},contains:[m],starts:{ -end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", -begin:/)/,end:/>/,keywords:{name:"script"},contains:[m],starts:{ -end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ -className:"tag",begin:/<>|<\/>/},{className:"tag", -begin:a(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name", -begin:t,relevance:0,starts:m}]},{className:"tag",begin:a(/<\//,n(a(t,/>/))), -contains:[{className:"name",begin:t,relevance:0},{begin:/>/,relevance:0, -endsParent:!0}]}]}}})()); -hljs.registerLanguage("markdown",(()=>{"use strict";function n(...n){ -return n.map((n=>{return(e=n)?"string"==typeof e?e:e.source:null;var e -})).join("")}return e=>{const a={begin:/<\/?[A-Za-z_]/,end:">", -subLanguage:"xml",relevance:0},i={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0 -},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, -relevance:2},{begin:n(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), -relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ -begin:/\[.+?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{ -className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, -returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", -excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", -end:"\\]",excludeBegin:!0,excludeEnd:!0}]},s={className:"strong",contains:[], -variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},c={ -className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{ -begin:/_(?!_)/,end:/_/,relevance:0}]};s.contains.push(c),c.contains.push(s) -;let t=[a,i] -;return s.contains=s.contains.concat(t),c.contains=c.contains.concat(t), -t=t.concat(s,c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ -className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:t},{ -begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", -contains:t}]}]},a,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", -end:"\\s+",excludeEnd:!0},s,c,{className:"quote",begin:"^>\\s+",contains:t, -end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ -begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ -begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", -contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ -begin:"^[-\\*]{3,}",end:"$"},i,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ -className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ -className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})()); -hljs.registerLanguage("nginx",(()=>{"use strict";return e=>{const n={ -className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/\}/},{ -begin:/[$@]/+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{ -$pattern:"[a-z/_]+", -literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll" -},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string", -contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/ -}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n] -},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^", -end:"\\s|\\{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|\\{|;",returnEnd:!0},{ -begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number", -begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{ -className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{ -name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{ -begin:e.UNDERSCORE_IDENT_RE+"\\s+\\{",returnBegin:!0,end:/\{/,contains:[{ -className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{ -begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|\\{",returnBegin:!0,contains:[{ -className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}], -illegal:"[^\\s\\}]"}}})()); -hljs.registerLanguage("objectivec",(()=>{"use strict";return e=>{ -const n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n, -keyword:"@interface @class @protocol @implementation"};return{ -name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], -keywords:{$pattern:n, -keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN", -literal:"false true FALSE TRUE nil YES NO NULL", -built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once" -},illegal:"/,end:/$/, -illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ -className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:/(\{|$)/, -excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{ -begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}})()); -hljs.registerLanguage("perl",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(...n){ -return n.map((n=>e(n))).join("")}function t(...n){ -return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ -const r=/[dualxmsipngr]{0,12}/,s={$pattern:/[\w.]+/, -keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" -},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:s},a={begin:/->\{/, -end:/\}/},o={variants:[{begin:/\$\d/},{ -begin:n(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])") -},{begin:/[$%@][^\s\w{]/,relevance:0}] -},c=[e.BACKSLASH_ESCAPE,i,o],g=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],l=(e,t,s="\\1")=>{ -const i="\\1"===s?s:n(s,t) -;return n(n("(?:",e,")"),t,/(?:\\.|[^\\\/])*?/,i,/(?:\\.|[^\\\/])*?/,s,r) -},d=(e,t,s)=>n(n("(?:",e,")"),t,/(?:\\.|[^\\\/])*?/,s,r),p=[o,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{ -endsWithParent:!0}),a,{className:"string",contains:c,variants:[{ -begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[", -end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{ -begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">", -relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'", -contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`", -contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{ -begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number", -begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b", -relevance:0},{ -begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*", -keywords:"split return print reverse grep",relevance:0, -contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{ -begin:l("s|tr|y",t(...g))},{begin:l("s|tr|y","\\(","\\)")},{ -begin:l("s|tr|y","\\[","\\]")},{begin:l("s|tr|y","\\{","\\}")}],relevance:2},{ -className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{ -begin:d("(?:m|qr)?",/\//,/\//)},{begin:d("m|qr",t(...g),/\1/)},{ -begin:d("m|qr",/\(/,/\)/)},{begin:d("m|qr",/\[/,/\]/)},{ -begin:d("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub", -end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{ -begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$", -subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}] -}];return i.contains=p,a.contains=p,{name:"Perl",aliases:["pl","pm"],keywords:s, -contains:p}}})()); -hljs.registerLanguage("php",(()=>{"use strict";return e=>{const r={ -className:"variable", -begin:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?![A-Za-z0-9])(?![$])"},t={ -className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{ -begin:/\?>/}]},a={className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/, -end:/\}/}]},n=e.inherit(e.APOS_STRING_MODE,{illegal:null -}),i=e.inherit(e.QUOTE_STRING_MODE,{illegal:null, -contains:e.QUOTE_STRING_MODE.contains.concat(a)}),o=e.END_SAME_AS_BEGIN({ -begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/, -contains:e.QUOTE_STRING_MODE.contains.concat(a)}),l={className:"string", -contains:[e.BACKSLASH_ESCAPE,t],variants:[e.inherit(n,{begin:"b'",end:"'" -}),e.inherit(i,{begin:'b"',end:'"'}),i,n,o]},s={className:"number",variants:[{ -begin:"\\b0b[01]+(?:_[01]+)*\\b"},{begin:"\\b0o[0-7]+(?:_[0-7]+)*\\b"},{ -begin:"\\b0x[\\da-f]+(?:_[\\da-f]+)*\\b"},{ -begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:e[+-]?\\d+)?" -}],relevance:0},c={ -keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile enum eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list match|0 mixed new object or private protected public real return string switch throw trait try unset use var void while xor yield", -literal:"false null true", -built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException UnhandledMatchError ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Stringable Throwable Traversable WeakReference WeakMap Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass" -};return{aliases:["php3","php4","php5","php6","php7","php8"], -case_insensitive:!0,keywords:c, -contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t] -}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}] -}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0, -keywords:"__halt_compiler"}),t,{className:"keyword",begin:/\$this\b/},r,{ -begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function", -relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0, -illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{ -begin:"=>",endsParent:!0},{className:"params",begin:"\\(",end:"\\)", -excludeBegin:!0,excludeEnd:!0,keywords:c, -contains:["self",r,e.C_BLOCK_COMMENT_MODE,l,s]}]},{className:"class",variants:[{ -beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", -illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ -beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ -beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, -contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",relevance:0,end:";", -contains:[e.UNDERSCORE_TITLE_MODE]},l,s]}}})()); -hljs.registerLanguage("php-template",(()=>{"use strict";return n=>({ -name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/, -subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"', -end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{ -illegal:null,className:null,contains:null,skip:!0 -}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null, -skip:!0})]}]})})()); -hljs.registerLanguage("plaintext",(()=>{"use strict";return t=>({ -name:"Plain text",aliases:["text","txt"],disableAutodetect:!0})})()); -hljs.registerLanguage("properties",(()=>{"use strict";return e=>{ -var n="[ \\t\\f]*",a=n+"[:=]"+n,t="("+a+"|[ \\t\\f]+)",r="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",s="([^\\\\:= \\t\\f\\n]|\\\\.)+",i={ -end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{ -begin:"\\\\\\\\"},{begin:"\\\\\\n"}]}};return{name:".properties", -case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{ -returnBegin:!0,variants:[{begin:r+a,relevance:1},{begin:r+"[ \\t\\f]+", -relevance:0}],contains:[{className:"attr",begin:r,endsParent:!0,relevance:0}], -starts:i},{begin:s+t,returnBegin:!0,relevance:0,contains:[{className:"meta", -begin:s,endsParent:!0,relevance:0}],starts:i},{className:"attr",relevance:0, -begin:s+n+"$"}]}}})()); -hljs.registerLanguage("python",(()=>{"use strict";return e=>{const n={ -$pattern:/[A-Za-z]\w+|__\w+__/, -keyword:["and","as","assert","async","await","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"], -built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], -literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], -type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] -},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/, -end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},t={ -className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ -begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, -contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{ -begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, -contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{ -begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, -contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, -end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/([uU]|[rR])'/,end:/'/, -relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ -begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, -end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, -contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, -contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] -},r="[0-9](_?[0-9])*",l=`(\\b(${r}))?\\.(${r})|\\b(${r})\\.`,b={ -className:"number",relevance:0,variants:[{ -begin:`(\\b(${r})|(${l}))[eE][+-]?(${r})[jJ]?\\b`},{begin:`(${l})[jJ]?`},{ -begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?\\b"},{ -begin:"\\b0[bB](_?[01])+[lL]?\\b"},{begin:"\\b0[oO](_?[0-7])+[lL]?\\b"},{ -begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?\\b"},{begin:`\\b(${r})[jJ]\\b`}]},o={ -className:"comment", -begin:(d=/# type:/,((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(?=",d,")")), -end:/$/,keywords:n,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/, -endsWithParent:!0}]},c={className:"params",variants:[{className:"", -begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0, -keywords:n,contains:["self",a,b,t,e.HASH_COMMENT_MODE]}]};var d -;return i.contains=[t,b,a],{name:"Python",aliases:["py","gyp","ipython"], -keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,b,{begin:/\bself\b/},{ -beginKeywords:"if",relevance:0},t,o,e.HASH_COMMENT_MODE,{variants:[{ -className:"function",beginKeywords:"def"},{className:"class", -beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/, -contains:[e.UNDERSCORE_TITLE_MODE,c,{begin:/->/,endsWithParent:!0,keywords:n}] -},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[b,c,t]}]}}})()); -hljs.registerLanguage("python-repl",(()=>{"use strict";return s=>({ -aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$", -subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{ -begin:/^\.\.\.(?=[ ]|$)/}]}]})})()); -hljs.registerLanguage("r",(()=>{"use strict";function e(...e){return e.map((e=>{ -return(a=e)?"string"==typeof a?a:a.source:null;var a})).join("")}return a=>{ -const n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/;return{name:"R", -illegal:/->/,keywords:{$pattern:n, -keyword:"function if in break next repeat else for while", -literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", -built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" -},compilerExtensions:[(a,n)=>{if(!a.beforeMatch)return -;if(a.starts)throw Error("beforeMatch cannot be used with starts") -;const i=Object.assign({},a);Object.keys(a).forEach((e=>{delete a[e] -})),a.begin=e(i.beforeMatch,e("(?=",i.begin,")")),a.starts={relevance:0, -contains:[Object.assign(i,{endsParent:!0})]},a.relevance=0,delete i.beforeMatch -}],contains:[a.COMMENT(/#'/,/$/,{contains:[{className:"doctag", -begin:"@examples",starts:{contains:[{begin:/\n/},{begin:/#'\s*(?=@[a-zA-Z]+)/, -endsParent:!0},{begin:/#'/,end:/$/,excludeBegin:!0}]}},{className:"doctag", -begin:"@param",end:/$/,contains:[{className:"variable",variants:[{begin:n},{ -begin:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{className:"doctag", -begin:/@[a-zA-Z]+/},{className:"meta-keyword",begin:/\\[a-zA-Z]+/}] -}),a.HASH_COMMENT_MODE,{className:"string",contains:[a.BACKSLASH_ESCAPE], -variants:[a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', -relevance:0},{begin:"'",end:"'",relevance:0}]},{className:"number",relevance:0, -beforeMatch:/([^a-zA-Z0-9._])/,variants:[{ -match:/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/},{ -match:/0[xX][0-9a-fA-F]+([pP][+-]?\d+)?[Li]?/},{ -match:/(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?[Li]?/}]},{begin:"%",end:"%"},{ -begin:e(/[a-zA-Z][a-zA-Z_0-9]*/,"\\s+<-\\s+")},{begin:"`",end:"`",contains:[{ -begin:/\\./}]}]}}})()); -hljs.registerLanguage("ruby",(()=>{"use strict";function e(...e){ -return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n -})).join("")}return n=>{ -const a="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",i={ -keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor __FILE__", -built_in:"proc lambda",literal:"true false nil"},s={className:"doctag", -begin:"@[A-Za-z]+"},r={begin:"#<",end:">"},b=[n.COMMENT("#","$",{contains:[s] -}),n.COMMENT("^=begin","^=end",{contains:[s],relevance:10 -}),n.COMMENT("^__END__","\\n$")],c={className:"subst",begin:/#\{/,end:/\}/, -keywords:i},t={className:"string",contains:[n.BACKSLASH_ESCAPE,c],variants:[{ -begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/, -end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{ -begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/, -end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{ -begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{ -begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ -begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ -begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ -begin:/<<[-~]?'?(\w+)\n(?:[^\n]*\n)*?\s*\1\b/,returnBegin:!0,contains:[{ -begin:/<<[-~]?'?/},n.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, -contains:[n.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",d={className:"number", -relevance:0,variants:[{ -begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ -begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" -},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ -begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ -begin:"\\b0(_?[0-7])+r?i?\\b"}]},l={className:"params",begin:"\\(",end:"\\)", -endsParent:!0,keywords:i},o=[t,{className:"class",beginKeywords:"class module", -end:"$|;",illegal:/=/,contains:[n.inherit(n.TITLE_MODE,{ -begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|!)?"}),{begin:"<\\s*",contains:[{ -begin:"("+n.IDENT_RE+"::)?"+n.IDENT_RE,relevance:0}]}].concat(b)},{ -className:"function",begin:e(/def\s+/,(_=a+"\\s*(\\(|;|$)",e("(?=",_,")"))), -relevance:0,keywords:"def",end:"$|;",contains:[n.inherit(n.TITLE_MODE,{begin:a -}),l].concat(b)},{begin:n.IDENT_RE+"::"},{className:"symbol", -begin:n.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", -begin:":(?!\\s)",contains:[t,{begin:a}],relevance:0},d,{className:"variable", -begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ -className:"params",begin:/\|/,end:/\|/,relevance:0,keywords:i},{ -begin:"("+n.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{ -className:"regexp",contains:[n.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{ -begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(", -end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}] -}].concat(r,b),relevance:0}].concat(r,b);var _;c.contains=o,l.contains=o -;const E=[{begin:/^\s*=>/,starts:{end:"$",contains:o}},{className:"meta", -begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", -starts:{end:"$",contains:o}}];return b.unshift(r),{name:"Ruby", -aliases:["rb","gemspec","podspec","thor","irb"],keywords:i,illegal:/\/\*/, -contains:[n.SHEBANG({binary:"ruby"})].concat(E).concat(b).concat(o)}}})()); -hljs.registerLanguage("rust",(()=>{"use strict";return e=>{ -const n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!" -;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?", -keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield", -literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}})()); -hljs.registerLanguage("scss",(()=>{"use strict" -;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],r=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() -;return a=>{const n=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, -HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, -ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, -illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} -}))(a),l=o,s=i,d="@[a-z-]+",c={className:"variable", -begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"};return{name:"SCSS",case_insensitive:!0, -illegal:"[=/|']",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{ -className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ -className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 -},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", -begin:"\\b("+e.join("|")+")\\b",relevance:0},{className:"selector-pseudo", -begin:":("+s.join("|")+")"},{className:"selector-pseudo", -begin:"::("+l.join("|")+")"},c,{begin:/\(/,end:/\)/,contains:[a.CSS_NUMBER_MODE] -},{className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{ -begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" -},{begin:":",end:";", -contains:[c,n.HEXCOLOR,a.CSS_NUMBER_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,n.IMPORTANT] -},{begin:"@(page|font-face)",lexemes:d,keywords:"@page @font-face"},{begin:"@", -end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, -keyword:"and or not only",attribute:t.join(" ")},contains:[{begin:d, -className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" -},c,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,n.HEXCOLOR,a.CSS_NUMBER_MODE]}]}} -})()); -hljs.registerLanguage("shell",(()=>{"use strict";return s=>({ -name:"Shell Session",aliases:["console"],contains:[{className:"meta", -begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#]/,starts:{end:/[^\\](?=\s*$)/, -subLanguage:"bash"}}]})})()); -hljs.registerLanguage("sql",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function r(...r){ -return r.map((r=>e(r))).join("")}function t(...r){ -return"("+r.map((r=>e(r))).join("|")+")"}return e=>{ -const n=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],s=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],o=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],c=s,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update ","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!s.includes(e))),u={ -begin:r(/\b/,t(...c),/\s*\(/),keywords:{built_in:c}};return{name:"SQL", -case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/, -keyword:((e,{exceptions:r,when:t}={})=>{const n=t -;return r=r||[],e.map((e=>e.match(/\|\d+$/)||r.includes(e)?e:n(e)?e+"|0":e)) -})(l,{when:e=>e.length<3}),literal:a,type:i, -built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] -},contains:[{begin:t(...o),keywords:{$pattern:/[\w\.]+/,keyword:l.concat(o), -literal:a,type:i}},{className:"type", -begin:t("double precision","large object","with timezone","without timezone") -},u,{className:"variable",begin:/@[a-z0-9]+/},{className:"string",variants:[{ -begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/,contains:[{ -begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,n,{className:"operator", -begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}})()); -hljs.registerLanguage("swift",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} -function a(...n){return n.map((n=>e(n))).join("")}function t(...n){ -return"("+n.map((n=>e(n))).join("|")+")"} -const i=e=>a(/\b/,e,/\w$/.test(e)?/\b/:/\B/),s=["Protocol","Type"].map(i),u=["init","self"].map(i),c=["Any","Self"],r=["associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],o=["false","nil","true"],l=["assignment","associativity","higherThan","left","lowerThan","none","right"],m=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],d=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],p=t(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),F=t(p,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),b=a(p,F,"*"),h=t(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),f=t(h,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),w=a(h,f,"*"),y=a(/[A-Z]/,f,"*"),g=["autoclosure",a(/convention\(/,t("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",a(/objc\(/,w,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","testable","UIApplicationMain","unknown","usableFromInline"],E=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] -;return e=>{const p={match:/\s+/,relevance:0},h=e.COMMENT("/\\*","\\*/",{ -contains:["self"]}),v=[e.C_LINE_COMMENT_MODE,h],N={className:"keyword", -begin:a(/\./,n(t(...s,...u))),end:t(...s,...u),excludeBegin:!0},A={ -match:a(/\./,t(...r)),relevance:0 -},C=r.filter((e=>"string"==typeof e)).concat(["_|0"]),_={variants:[{ -className:"keyword", -match:t(...r.filter((e=>"string"!=typeof e)).concat(c).map(i),...u)}]},D={ -$pattern:t(/\b\w+/,/#\w+/),keyword:C.concat(m),literal:o},B=[N,A,_],k=[{ -match:a(/\./,t(...d)),relevance:0},{className:"built_in", -match:a(/\b/,t(...d),/(?=\()/)}],M={match:/->/,relevance:0},S=[M,{ -className:"operator",relevance:0,variants:[{match:b},{match:`\\.(\\.|${F})+`}] -}],x="([0-9a-fA-F]_*)+",I={className:"number",relevance:0,variants:[{ -match:"\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b"},{ -match:`\\b0x(${x})(\\.(${x}))?([pP][+-]?(([0-9]_*)+))?\\b`},{ -match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},O=(e="")=>({ -className:"subst",variants:[{match:a(/\\/,e,/[0\\tnr"']/)},{ -match:a(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}]}),T=(e="")=>({className:"subst", -match:a(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),L=(e="")=>({className:"subst", -label:"interpol",begin:a(/\\/,e,/\(/),end:/\)/}),P=(e="")=>({begin:a(e,/"""/), -end:a(/"""/,e),contains:[O(e),T(e),L(e)]}),$=(e="")=>({begin:a(e,/"/), -end:a(/"/,e),contains:[O(e),L(e)]}),K={className:"string", -variants:[P(),P("#"),P("##"),P("###"),$(),$("#"),$("##"),$("###")]},j={ -match:a(/`/,w,/`/)},z=[j,{className:"variable",match:/\$\d+/},{ -className:"variable",match:`\\$${f}+`}],q=[{match:/(@|#)available/, -className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:E, -contains:[...S,I,K]}]}},{className:"keyword",match:a(/@/,t(...g))},{ -className:"meta",match:a(/@/,w)}],U={match:n(/\b[A-Z]/),relevance:0,contains:[{ -className:"type", -match:a(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,f,"+") -},{className:"type",match:y,relevance:0},{match:/[?!]+/,relevance:0},{ -match:/\.\.\./,relevance:0},{match:a(/\s+&\s+/,n(y)),relevance:0}]},Z={ -begin://,keywords:D,contains:[...v,...B,...q,M,U]};U.contains.push(Z) -;const G={begin:/\(/,end:/\)/,relevance:0,keywords:D,contains:["self",{ -match:a(w,/\s*:/),keywords:"_|0",relevance:0 -},...v,...B,...k,...S,I,K,...z,...q,U]},H={beginKeywords:"func",contains:[{ -className:"title",match:t(j.match,w,b),endsParent:!0,relevance:0},p]},R={ -begin://,contains:[...v,U]},V={begin:/\(/,end:/\)/,keywords:D, -contains:[{begin:t(n(a(w,/\s*:/)),n(a(w,/\s+/,w,/\s*:/))),end:/:/,relevance:0, -contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:w}] -},...v,...B,...S,I,K,...q,U,G],endsParent:!0,illegal:/["']/},W={ -className:"function",match:n(/\bfunc\b/),contains:[H,R,V,p],illegal:[/\[/,/%/] -},X={className:"function",match:/\b(subscript|init[?!]?)\s*(?=[<(])/,keywords:{ -keyword:"subscript init init? init!",$pattern:/\w+[?!]?/},contains:[R,V,p], -illegal:/\[|%/},J={beginKeywords:"operator",end:e.MATCH_NOTHING_RE,contains:[{ -className:"title",match:b,endsParent:!0,relevance:0}]},Q={ -beginKeywords:"precedencegroup",end:e.MATCH_NOTHING_RE,contains:[{ -className:"title",match:y,relevance:0},{begin:/{/,end:/}/,relevance:0, -endsParent:!0,keywords:[...l,...o],contains:[U]}]};for(const e of K.variants){ -const n=e.contains.find((e=>"interpol"===e.label));n.keywords=D -;const a=[...B,...k,...S,I,K,...z];n.contains=[...a,{begin:/\(/,end:/\)/, -contains:["self",...a]}]}return{name:"Swift",keywords:D,contains:[...v,W,X,{ -className:"class",beginKeywords:"struct protocol class extension enum", -end:"\\{",excludeEnd:!0,keywords:D,contains:[e.inherit(e.TITLE_MODE,{ -begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...B]},J,Q,{ -beginKeywords:"import",end:/$/,contains:[...v],relevance:0 -},...B,...k,...S,I,K,...z,...q,U,G]}}})()); -hljs.registerLanguage("typescript",(()=>{"use strict" -;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) -;function t(e){return r("(?=",e,")")}function r(...e){return e.map((e=>{ -return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return i=>{ -const c={$pattern:e, -keyword:n.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]), -literal:a, -built_in:s.concat(["any","void","number","boolean","string","object","never","enum"]) -},o={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},l=(e,n,a)=>{ -const s=e.contains.findIndex((e=>e.label===n)) -;if(-1===s)throw Error("can not find mode to replace");e.contains.splice(s,1,a) -},b=(i=>{const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/, -end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ -const a=e[0].length+e.index,s=e.input[a];"<"!==s?">"===s&&(((e,{after:n})=>{ -const a="", -returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{ -begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0 -},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:f}]}] -},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{ -variants:[{begin:"<>",end:""},{begin:o.begin,"on:begin":o.isTrulyOpeningTag, -end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0, -contains:["self"]}]}],relevance:0},{className:"function", -beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l, -contains:["self",i.inherit(i.TITLE_MODE,{begin:c}),A],illegal:/%/},{ -beginKeywords:"while if switch catch for"},{className:"function", -begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", -returnBegin:!0,contains:[A,i.inherit(i.TITLE_MODE,{begin:c})]},{variants:[{ -begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class", -beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{ -beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/, -end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:c}),"self",A] -},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set", -contains:[i.inherit(i.TITLE_MODE,{begin:c}),{begin:/\(\)/},A]},{begin:/\$[(.]/}] -}})(i) -;return Object.assign(b.keywords,c),b.exports.PARAMS_CONTAINS.push(o),b.contains=b.contains.concat([o,{ -beginKeywords:"namespace",end:/\{/,excludeEnd:!0},{beginKeywords:"interface", -end:/\{/,excludeEnd:!0,keywords:"interface extends" -}]),l(b,"shebang",i.SHEBANG()),l(b,"use_strict",{className:"meta",relevance:10, -begin:/^\s*['"]use strict['"]/ -}),b.contains.find((e=>"function"===e.className)).relevance=0,Object.assign(b,{ -name:"TypeScript",aliases:["ts","tsx"]}),b}})()); -hljs.registerLanguage("vbnet",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(...n){ -return n.map((n=>e(n))).join("")}function t(...n){ -return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ -const a=/\d{1,2}\/\d{1,2}\/\d{4}/,i=/\d{4}-\d{1,2}-\d{1,2}/,s=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,o={ -className:"literal",variants:[{begin:n(/# */,t(i,a),/ *#/)},{ -begin:n(/# */,r,/ *#/)},{begin:n(/# */,s,/ *#/)},{ -begin:n(/# */,t(i,a),/ +/,t(s,r),/ *#/)}]},l=e.COMMENT(/'''/,/$/,{contains:[{ -className:"doctag",begin:/<\/?/,end:/>/}]}),c=e.COMMENT(null,/$/,{variants:[{ -begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]});return{name:"Visual Basic .NET", -aliases:["vb"],case_insensitive:!0,classNameAliases:{label:"symbol"},keywords:{ -keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", -built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", -type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", -literal:"true false nothing"}, -illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{ -className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/, -end:/"/,illegal:/\n/,contains:[{begin:/""/}]},o,{className:"number",relevance:0, -variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ -},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{ -begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{ -className:"label",begin:/^\w+:/},l,c,{className:"meta", -begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, -end:/$/,keywords:{ -"meta-keyword":"const disable else elseif enable end externalsource if region then" -},contains:[c]}]}}})()); -hljs.registerLanguage("yaml",(()=>{"use strict";return e=>{ -var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*'()[\\]]+",s={ -className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ -},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", -variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(s,{ -variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={ -end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},t={begin:/\{/, -end:/\}/,contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]", -contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{ -begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ -begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", -relevance:10},{className:"string", -begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ -begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, -relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type", -begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a -},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", -begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", -relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ -className:"number", -begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" -},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},t,g,s],r=[...b] -;return r.pop(),r.push(i),l.contains=r,{name:"YAML",case_insensitive:!0, -aliases:["yml"],contains:b}}})()); \ No newline at end of file diff --git a/htmlReport/js/highlightjs-line-numbers.min.js b/htmlReport/js/highlightjs-line-numbers.min.js deleted file mode 100644 index 8548576704..0000000000 --- a/htmlReport/js/highlightjs-line-numbers.min.js +++ /dev/null @@ -1,24 +0,0 @@ -/* -The MIT License (MIT) - -Copyright (c) 2017 Yauheni Pakala - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - */ -!function(r,o){"use strict";var e,i="hljs-ln",l="hljs-ln-line",h="hljs-ln-code",s="hljs-ln-numbers",c="hljs-ln-n",m="data-line-number",a=/\r\n|\r|\n/g;function u(e){for(var n=e.toString(),t=e.anchorNode;"TD"!==t.nodeName;)t=t.parentNode;for(var r=e.focusNode;"TD"!==r.nodeName;)r=r.parentNode;var o=parseInt(t.dataset.lineNumber),a=parseInt(r.dataset.lineNumber);if(o==a)return n;var i,l=t.textContent,s=r.textContent;for(a
{6}',[l,s,c,m,h,o+n.startFrom,0{1}',[i,r])}return e}(e.innerHTML,o)}function v(e){var n=e.className;if(/hljs-/.test(n)){for(var t=g(e.innerHTML),r=0,o="";r{1}
\n',[n,0 - - - Coverage Report > bagpacker - - - - - - -
- - - -

Coverage Summary for Package: bagpacker

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
-
- - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
- - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_BLOCK.html b/htmlReport/ns-1/index_SORT_BY_BLOCK.html deleted file mode 100644 index bfffb85983..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_BLOCK.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
- - - -

Coverage Summary for Package: bagpacker

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
-
- - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
- - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html deleted file mode 100644 index a3e4abf83d..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
- - - -

Coverage Summary for Package: bagpacker

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
-
- - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
- - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_CLASS.html b/htmlReport/ns-1/index_SORT_BY_CLASS.html deleted file mode 100644 index 2716684697..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_CLASS.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
- - - -

Coverage Summary for Package: bagpacker

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
-
- - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
- - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html deleted file mode 100644 index 26e8e3baa0..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
- - - -

Coverage Summary for Package: bagpacker

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
-
- - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
- - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_LINE.html b/htmlReport/ns-1/index_SORT_BY_LINE.html deleted file mode 100644 index 9ea1c34daa..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_LINE.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
- - - -

Coverage Summary for Package: bagpacker

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
-
- - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
- - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html deleted file mode 100644 index ca030237ff..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
- - - -

Coverage Summary for Package: bagpacker

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
-
- - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
- - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_METHOD.html b/htmlReport/ns-1/index_SORT_BY_METHOD.html deleted file mode 100644 index 2cc74ffbd8..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_METHOD.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
- - - -

Coverage Summary for Package: bagpacker

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
-
- - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
- - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html deleted file mode 100644 index c7b2c3bb4b..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
- - - -

Coverage Summary for Package: bagpacker

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
-
- - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
- - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html deleted file mode 100644 index 43ef8225bf..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
- - - -

Coverage Summary for Package: bagpacker

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
-
- - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
- - - - - - diff --git a/htmlReport/ns-1/sources/source-1.html b/htmlReport/ns-1/sources/source-1.html deleted file mode 100644 index eae6142e21..0000000000 --- a/htmlReport/ns-1/sources/source-1.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - Coverage Report > BagPacker - - - - - - -
- - -

Coverage Summary for Class: BagPacker (bagpacker)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/9) - -
- -
-
- - -
- package bagpacker;
- 
- import bagpacker.commands.ByeCommand;
- import bagpacker.commands.Command;
- import bagpacker.iohandler.Ui;
- import bagpacker.iohandler.Parser;
- import bagpacker.packingfunc.PackingList;
- 
- public class BagPacker {
-     private static PackingList packingList;
-     /**
-      * Main entry-point for the java.BagPacker application.
-      */
-     public static void main(String[] args) {
-         // initialise variables
-         BagPacker.packingList = new PackingList();
-         //initialise BagPacker program
-         Ui.initialMessage();
- 
-         //run main program
-         runBagPacker();
- 
-         //Close program
-         Ui.goodbyeMessage();
-     }
- 
-     public static void runBagPacker() {
-         while (ByeCommand.isBagPackerRunning) {
-             Command c = Parser.parse();
-             c.execute(packingList);
-         }
-     }
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-2/index.html b/htmlReport/ns-2/index.html deleted file mode 100644 index e80459467b..0000000000 --- a/htmlReport/ns-2/index.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.commands

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
ByeCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
Command - - 100% - - - (1/1) - - - - 33.3% - - - (2/6) - - - - 25% - - - (2/8) - -
DeleteCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/5) - -
DeleteListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
HelpCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/2) - -
IncorrectCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
ListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/14) - -
PackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
UnpackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
- -
- - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_BLOCK.html b/htmlReport/ns-2/index_SORT_BY_BLOCK.html deleted file mode 100644 index 5b3e4bf8b7..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_BLOCK.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.commands

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
ByeCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
Command - - 100% - - - (1/1) - - - - 33.3% - - - (2/6) - - - - 25% - - - (2/8) - -
DeleteCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/5) - -
DeleteListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
HelpCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/2) - -
IncorrectCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
ListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/14) - -
PackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
UnpackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
- -
- - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html deleted file mode 100644 index d749010de6..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.commands

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
UnpackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
PackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
ListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/14) - -
IncorrectCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
HelpCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/2) - -
DeleteListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
DeleteCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/5) - -
Command - - 100% - - - (1/1) - - - - 33.3% - - - (2/6) - - - - 25% - - - (2/8) - -
ByeCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
- -
- - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_CLASS.html b/htmlReport/ns-2/index_SORT_BY_CLASS.html deleted file mode 100644 index a9d565f02d..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_CLASS.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.commands

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
ByeCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
DeleteCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/5) - -
DeleteListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
HelpCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/2) - -
IncorrectCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
ListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/14) - -
PackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
UnpackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
Command - - 100% - - - (1/1) - - - - 33.3% - - - (2/6) - - - - 25% - - - (2/8) - -
- -
- - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html deleted file mode 100644 index a27cf69696..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.commands

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Command - - 100% - - - (1/1) - - - - 33.3% - - - (2/6) - - - - 25% - - - (2/8) - -
AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
UnpackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
PackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
ListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/14) - -
IncorrectCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
HelpCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/2) - -
DeleteListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
DeleteCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/5) - -
ByeCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
- -
- - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_LINE.html b/htmlReport/ns-2/index_SORT_BY_LINE.html deleted file mode 100644 index c6197008d7..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_LINE.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.commands

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
ByeCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
DeleteCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/5) - -
DeleteListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
HelpCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/2) - -
IncorrectCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
ListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/14) - -
PackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
UnpackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
Command - - 100% - - - (1/1) - - - - 33.3% - - - (2/6) - - - - 25% - - - (2/8) - -
AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
- -
- - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html deleted file mode 100644 index 302e3f2c82..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.commands

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
Command - - 100% - - - (1/1) - - - - 33.3% - - - (2/6) - - - - 25% - - - (2/8) - -
UnpackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
PackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
ListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/14) - -
IncorrectCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
HelpCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/2) - -
DeleteListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
DeleteCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/5) - -
ByeCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
- -
- - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_METHOD.html b/htmlReport/ns-2/index_SORT_BY_METHOD.html deleted file mode 100644 index 5e2aa5bb25..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_METHOD.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.commands

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
ByeCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
DeleteCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/5) - -
DeleteListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
HelpCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/2) - -
IncorrectCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
ListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/14) - -
PackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
UnpackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
Command - - 100% - - - (1/1) - - - - 33.3% - - - (2/6) - - - - 25% - - - (2/8) - -
AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
- -
- - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html deleted file mode 100644 index fd6a82581a..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.commands

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
Command - - 100% - - - (1/1) - - - - 33.3% - - - (2/6) - - - - 25% - - - (2/8) - -
UnpackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
PackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
ListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/14) - -
IncorrectCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
HelpCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/2) - -
DeleteListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
DeleteCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/5) - -
ByeCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
- -
- - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html deleted file mode 100644 index 86d0882cfe..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.commands

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.commands - - 20% - - - (2/10) - - - - 14.8% - - - (4/27) - - - - 11.9% - - - (7/59) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
UnpackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
PackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
ListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/14) - -
IncorrectCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
HelpCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/2) - -
DeleteListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
DeleteCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/5) - -
Command - - 100% - - - (1/1) - - - - 33.3% - - - (2/6) - - - - 25% - - - (2/8) - -
ByeCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
- -
- - - - - - diff --git a/htmlReport/ns-2/sources/source-1.html b/htmlReport/ns-2/sources/source-1.html deleted file mode 100644 index 46ea5064ea..0000000000 --- a/htmlReport/ns-2/sources/source-1.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - Coverage Report > AddCommand - - - - - - -
- - -

Coverage Summary for Class: AddCommand (bagpacker.commands)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
- -
-
- - -
- package bagpacker.commands;
- 
- import bagpacker.iohandler.Ui;
- import bagpacker.packingfunc.Item;
- import bagpacker.packingfunc.PackingList;
- 
- public class AddCommand extends Command {
-     public static final String MSG_SUCCESS_ADD = "New item added: %s";
-     public static final String HELP_MSG = "add : Adds an item to the packing list.\n" +
-                 "\tExample: add toothbrush";
- 
-     private final Item item;
- 
-     public AddCommand(Item item) {
-         this.item = item;
-     }
- 
-     @Override
-     public void execute(PackingList packingList) {
-         this.packingList = packingList;
-         packingList.addItem(item);
-         Ui.printToUser(String.format(MSG_SUCCESS_ADD, item));
-     }
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-2/sources/source-2.html b/htmlReport/ns-2/sources/source-2.html deleted file mode 100644 index 8fcb8961a1..0000000000 --- a/htmlReport/ns-2/sources/source-2.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - Coverage Report > ByeCommand - - - - - - -
- - -

Coverage Summary for Class: ByeCommand (bagpacker.commands)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
ByeCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
- -
-
- - -
- package bagpacker.commands;
- 
- import bagpacker.packingfunc.PackingList;
- 
- /**
-  * ByeCommand class stops the BagPacker application by changing the run status
-  */
- public class ByeCommand extends Command {
-     public static boolean isBagPackerRunning = true;
-     public static final String HELP_MSG = "bye : Stops the BagPacker Application\n" +
-             "\tExample: bye";
-     public void execute (PackingList packingList) {
-         this.isBagPackerRunning = false;
-     }
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-2/sources/source-3.html b/htmlReport/ns-2/sources/source-3.html deleted file mode 100644 index edc10afab7..0000000000 --- a/htmlReport/ns-2/sources/source-3.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - Coverage Report > Command - - - - - - -
- - -

Coverage Summary for Class: Command (bagpacker.commands)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
Command - - 100% - - - (1/1) - - - - 33.3% - - - (2/6) - - - - 25% - - - (2/8) - -
- -
-
- - -
- package bagpacker.commands;
- 
- import bagpacker.packingfunc.Item;
- import bagpacker.packingfunc.PackingList;
- 
- /**
-  * Commands class used to execute given commands from user
-  */
- public abstract class Command {
-     protected PackingList packingList;
-     private int targetIndex = -1;
- 
-     /**
-      * @param targetIndex listing index of the target item
-      */
-     public Command(int targetIndex) {
-         this.setTargetIndex(targetIndex);
-     }
- 
-     protected Command() {
-     }
- 
-     public void setTargetIndex(int targetIndex) {
-         this.targetIndex = targetIndex;
-     }
- 
-     public int getTargetIndex() {
-         return targetIndex;
-     }
- 
-     /**
-      * Extracts the target item in the list.
-      *
-      * @throws IndexOutOfBoundsException if the target index is out of bounds
-      */
-     protected Item getTargetItem() throws IndexOutOfBoundsException {
-         return packingList.get(getTargetIndex() - 1);
-     }
- 
- 
-     /**
-      * Executes the command which requires a packingList
-      *
-      * @param packingList used to execute the command
-      */
-     public void execute (PackingList packingList) {
-     }
- 
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-2/sources/source-4.html b/htmlReport/ns-2/sources/source-4.html deleted file mode 100644 index 2d1e80c6e0..0000000000 --- a/htmlReport/ns-2/sources/source-4.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - Coverage Report > DeleteCommand - - - - - - -
- - -

Coverage Summary for Class: DeleteCommand (bagpacker.commands)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
DeleteCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/5) - -
- -
-
- - -
- package bagpacker.commands;
- 
- import bagpacker.packingfunc.Item;
- import bagpacker.packingfunc.PackingList;
- 
- import bagpacker.iohandler.Ui;
- 
- public class DeleteCommand extends Command {
- 
-     public static final String MSG_SUCCESS_DELETE = "%s removed from the list";
- 
-     public static final String HELP_MSG = "delete : Deletes an item from the packing list.\n" +
-             "\tExample: delete 1";
- 
- 
-     public DeleteCommand(int targetIndex) {
-         super(targetIndex);
-     }
- 
-     @Override
-     public void execute(PackingList packingList) {
-         Item item = getTargetItem();
-         this.packingList = packingList;
-         packingList.deleteItem(item);
-         Ui.printToUser(String.format(MSG_SUCCESS_DELETE, item));
-     }
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-2/sources/source-5.html b/htmlReport/ns-2/sources/source-5.html deleted file mode 100644 index 96de9e160f..0000000000 --- a/htmlReport/ns-2/sources/source-5.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - Coverage Report > DeleteListCommand - - - - - - -
- - -

Coverage Summary for Class: DeleteListCommand (bagpacker.commands)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
DeleteListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
- -
-
- - -
- package bagpacker.commands;
- 
- import bagpacker.iohandler.Ui;
- import bagpacker.packingfunc.Item;
- import bagpacker.packingfunc.PackingList;
- 
- import java.util.ArrayList;
- 
- public class DeleteListCommand extends Command {
-     public static final String MSG_SUCCESS_DELETE_LIST = "list deleted";
-     @Override
-     public void execute(PackingList packingList) {
-         ArrayList< Item > emptyList = new ArrayList<>();
-         packingList.setItemList(emptyList);
-         Ui.printToUser(String.format(MSG_SUCCESS_DELETE_LIST));
-     }
- 
- 
- 
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-2/sources/source-6.html b/htmlReport/ns-2/sources/source-6.html deleted file mode 100644 index b70f35f966..0000000000 --- a/htmlReport/ns-2/sources/source-6.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - Coverage Report > HelpCommand - - - - - - -
- - -

Coverage Summary for Class: HelpCommand (bagpacker.commands)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
HelpCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/2) - -
- -
-
- - -
- package bagpacker.commands;
- 
- import bagpacker.iohandler.Ui;
- import bagpacker.packingfunc.PackingList;
- 
- public class HelpCommand extends Command {
-     @Override
-     public void execute(PackingList packingList) {
-         Ui.helpMessage();
-     }
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-2/sources/source-7.html b/htmlReport/ns-2/sources/source-7.html deleted file mode 100644 index 83bceac5fe..0000000000 --- a/htmlReport/ns-2/sources/source-7.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - Coverage Report > IncorrectCommand - - - - - - -
- - -

Coverage Summary for Class: IncorrectCommand (bagpacker.commands)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
IncorrectCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/4) - -
- -
-
- - -
- package bagpacker.commands;
- 
- import bagpacker.iohandler.Ui;
- import bagpacker.packingfunc.PackingList;
- 
- public class IncorrectCommand extends Command {
-     private final String errorType;
-     private final String helpMessage;
-     public IncorrectCommand(String errorType, String helpMessage) {
-         this.helpMessage = helpMessage;
-         this.errorType = errorType;
-     }
- 
-     @Override
-     public void execute(PackingList packingList) {
-         Ui.errorMessage(errorType, helpMessage);
-     }
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-2/sources/source-8.html b/htmlReport/ns-2/sources/source-8.html deleted file mode 100644 index 018264b8a8..0000000000 --- a/htmlReport/ns-2/sources/source-8.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - Coverage Report > ListCommand - - - - - - -
- - -

Coverage Summary for Class: ListCommand (bagpacker.commands)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
ListCommand - - 0% - - - (0/1) - - - - 0% - - - (0/2) - - - - 0% - - - (0/14) - -
- -
-
- - -
- package bagpacker.commands;
- 
- import bagpacker.packingfunc.PackingList;
- 
- public class ListCommand extends Command {
-     public static final String HELP_MSG = "list : List all items in packing list.\n" +
-             "\tExample: list";
- 
-     @Override
-     public void execute(PackingList packingList) {
- 
-         if (packingList.size() == 0) {
-             System.out.println("____________________________________________________________");
-             System.out.println("There are no items in your list. What would you like to add?");
-             System.out.println("____________________________________________________________");
-             return;
-         }
- 
-         System.out.println("____________________________________________________________");
-         System.out.println("Here are the items in your list");
-         for (int i = 0; i < packingList.size(); i++) {
-             String isItemPacked;
-             if (packingList.get(i).getIsPacked()) {
-                 isItemPacked = "X";
-             } else {
-                 isItemPacked = " ";
-             }
-             String itemName = packingList.get(i).getItemName();
-             System.out.println((i + 1) + ". [" + isItemPacked + "] " + itemName);
-         }
-         System.out.println("____________________________________________________________");
-     }
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-2/sources/source-9.html b/htmlReport/ns-2/sources/source-9.html deleted file mode 100644 index bd5bf915e3..0000000000 --- a/htmlReport/ns-2/sources/source-9.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - Coverage Report > PackCommand - - - - - - -
- - -

Coverage Summary for Class: PackCommand (bagpacker.commands)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
PackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
- -
-
- - -
- package bagpacker.commands;
- 
- import bagpacker.iohandler.Ui;
- import bagpacker.packingfunc.Item;
- import bagpacker.packingfunc.PackingList;
- 
- public class PackCommand extends Command {
- 
-     public static final String MSG_SUCCESS_PACK = "Item packed: %s";
-     public static final String HELP_MSG= "pack : Marks an item as packed in the packing list.\n" +
-             "\tExample: pack 2 of 3\n" +
-             "\tMeaning: packs 2 quantities of the third item in the packing list";
- 
- 
-     public PackCommand(int targetIndex) {
-         super(targetIndex);
-         assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()):
-                 "Pack Command Target index is out of bounds";
-     }
- 
-     @Override
-     public void execute(PackingList packingList) {
-         this.packingList = packingList;
-         final Item item = getTargetItem();
-         packingList.packItem(item);
-         Ui.printToUser(String.format(MSG_SUCCESS_PACK, item));
-     }
- 
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-2/sources/source-a.html b/htmlReport/ns-2/sources/source-a.html deleted file mode 100644 index b9a404405b..0000000000 --- a/htmlReport/ns-2/sources/source-a.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - Coverage Report > UnpackCommand - - - - - - -
- - -

Coverage Summary for Class: UnpackCommand (bagpacker.commands)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
UnpackCommand - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/7) - -
- -
-
- - -
- package bagpacker.commands;
- 
- import bagpacker.iohandler.Ui;
- import bagpacker.packingfunc.Item;
- import bagpacker.packingfunc.PackingList;
- 
- public class UnpackCommand extends Command {
- 
-     public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s";
-     public static final String HELP_MSG = "unpack : Marks an item as unpacked in the packing list.\n" +
-             "\tExample: unpack 1 of 2\n" +
-             "\tMeaning: unpacks 1 quantity of the second item in the packing list";
- 
- 
-     public UnpackCommand(int targetIndex) {
-         super(targetIndex);
-         assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()):
-                 "Unpack Command Target index is out of bounds";
-     }
- 
-     @Override
-     public void execute(PackingList packingList) {
-         this.packingList = packingList;
-         final Item item = getTargetItem();
-         packingList.unpackItem(item);
-         Ui.printToUser(String.format(MSG_SUCCESS_UNPACK, item));
-     }
- 
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-3/index.html b/htmlReport/ns-3/index.html deleted file mode 100644 index 36dee51fc1..0000000000 --- a/htmlReport/ns-3/index.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.exception

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
EmptyInputException - - 100% - - - (1/1) - - - - 100% - - - (1/1) - - - - 100% - - - (1/1) - -
InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
- -
- - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_BLOCK.html b/htmlReport/ns-3/index_SORT_BY_BLOCK.html deleted file mode 100644 index 5b83a3c419..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_BLOCK.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.exception

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
EmptyInputException - - 100% - - - (1/1) - - - - 100% - - - (1/1) - - - - 100% - - - (1/1) - -
InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
- -
- - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html deleted file mode 100644 index 5db7b52aed..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.exception

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
EmptyInputException - - 100% - - - (1/1) - - - - 100% - - - (1/1) - - - - 100% - - - (1/1) - -
- -
- - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_CLASS.html b/htmlReport/ns-3/index_SORT_BY_CLASS.html deleted file mode 100644 index d7d31252cc..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_CLASS.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.exception

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
EmptyInputException - - 100% - - - (1/1) - - - - 100% - - - (1/1) - - - - 100% - - - (1/1) - -
- -
- - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html deleted file mode 100644 index 0ff385f822..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.exception

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
EmptyInputException - - 100% - - - (1/1) - - - - 100% - - - (1/1) - - - - 100% - - - (1/1) - -
InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
- -
- - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_LINE.html b/htmlReport/ns-3/index_SORT_BY_LINE.html deleted file mode 100644 index f4b3bf8c23..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_LINE.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.exception

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
EmptyInputException - - 100% - - - (1/1) - - - - 100% - - - (1/1) - - - - 100% - - - (1/1) - -
- -
- - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html deleted file mode 100644 index ed2b362c58..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.exception

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
EmptyInputException - - 100% - - - (1/1) - - - - 100% - - - (1/1) - - - - 100% - - - (1/1) - -
InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
- -
- - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_METHOD.html b/htmlReport/ns-3/index_SORT_BY_METHOD.html deleted file mode 100644 index 3a4a081e27..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_METHOD.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.exception

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
EmptyInputException - - 100% - - - (1/1) - - - - 100% - - - (1/1) - - - - 100% - - - (1/1) - -
- -
- - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html deleted file mode 100644 index d056cdfbca..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.exception

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
EmptyInputException - - 100% - - - (1/1) - - - - 100% - - - (1/1) - - - - 100% - - - (1/1) - -
InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
- -
- - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html deleted file mode 100644 index c8492bc39a..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.exception

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.exception - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - - - - 33.3% - - - (1/3) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
EmptyInputException - - 100% - - - (1/1) - - - - 100% - - - (1/1) - - - - 100% - - - (1/1) - -
- -
- - - - - - diff --git a/htmlReport/ns-3/sources/source-1.html b/htmlReport/ns-3/sources/source-1.html deleted file mode 100644 index a31ff393e5..0000000000 --- a/htmlReport/ns-3/sources/source-1.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - Coverage Report > EmptyInputException - - - - - - -
- - -

Coverage Summary for Class: EmptyInputException (bagpacker.exception)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
EmptyInputException - - 100% - - - (1/1) - - - - 100% - - - (1/1) - - - - 100% - - - (1/1) - -
- -
-
- - -
- package bagpacker.exception;
- 
- public class EmptyInputException extends Exception {
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-3/sources/source-2.html b/htmlReport/ns-3/sources/source-2.html deleted file mode 100644 index 4e140a50ca..0000000000 --- a/htmlReport/ns-3/sources/source-2.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - Coverage Report > InvalidIndexException - - - - - - -
- - -

Coverage Summary for Class: InvalidIndexException (bagpacker.exception)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
- -
-
- - -
- package bagpacker.exception;
- 
- 
- 
- public class InvalidIndexException extends Exception{
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-3/sources/source-3.html b/htmlReport/ns-3/sources/source-3.html deleted file mode 100644 index 9b1c617f02..0000000000 --- a/htmlReport/ns-3/sources/source-3.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - Coverage Report > InvalidVariablesException - - - - - - -
- - -

Coverage Summary for Class: InvalidVariablesException (bagpacker.exception)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
- -
-
- - -
- package bagpacker.exception;
- 
- 
- 
- public class InvalidVariablesException extends Exception{
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-4/index.html b/htmlReport/ns-4/index.html deleted file mode 100644 index 46c9400c9f..0000000000 --- a/htmlReport/ns-4/index.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.iohandler

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Parser - - 100% - - - (1/1) - - - - 50% - - - (10/20) - - - - 31.3% - - - (31/99) - -
Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/18) - -
Ui - - 100% - - - (1/1) - - - - 33.3% - - - (3/9) - - - - 21.4% - - - (6/28) - -
- -
- - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_BLOCK.html b/htmlReport/ns-4/index_SORT_BY_BLOCK.html deleted file mode 100644 index a8b23638a0..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_BLOCK.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.iohandler

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Parser - - 100% - - - (1/1) - - - - 50% - - - (10/20) - - - - 31.3% - - - (31/99) - -
Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/18) - -
Ui - - 100% - - - (1/1) - - - - 33.3% - - - (3/9) - - - - 21.4% - - - (6/28) - -
- -
- - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html deleted file mode 100644 index 8d7952a689..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.iohandler

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Ui - - 100% - - - (1/1) - - - - 33.3% - - - (3/9) - - - - 21.4% - - - (6/28) - -
Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/18) - -
Parser - - 100% - - - (1/1) - - - - 50% - - - (10/20) - - - - 31.3% - - - (31/99) - -
- -
- - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_CLASS.html b/htmlReport/ns-4/index_SORT_BY_CLASS.html deleted file mode 100644 index 877a227206..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_CLASS.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.iohandler

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/18) - -
Parser - - 100% - - - (1/1) - - - - 50% - - - (10/20) - - - - 31.3% - - - (31/99) - -
Ui - - 100% - - - (1/1) - - - - 33.3% - - - (3/9) - - - - 21.4% - - - (6/28) - -
- -
- - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html deleted file mode 100644 index d183363c6e..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.iohandler

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Ui - - 100% - - - (1/1) - - - - 33.3% - - - (3/9) - - - - 21.4% - - - (6/28) - -
Parser - - 100% - - - (1/1) - - - - 50% - - - (10/20) - - - - 31.3% - - - (31/99) - -
Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/18) - -
- -
- - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_LINE.html b/htmlReport/ns-4/index_SORT_BY_LINE.html deleted file mode 100644 index a81d99fbcf..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_LINE.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.iohandler

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/18) - -
Ui - - 100% - - - (1/1) - - - - 33.3% - - - (3/9) - - - - 21.4% - - - (6/28) - -
Parser - - 100% - - - (1/1) - - - - 50% - - - (10/20) - - - - 31.3% - - - (31/99) - -
- -
- - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html deleted file mode 100644 index 87ea674440..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.iohandler

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Parser - - 100% - - - (1/1) - - - - 50% - - - (10/20) - - - - 31.3% - - - (31/99) - -
Ui - - 100% - - - (1/1) - - - - 33.3% - - - (3/9) - - - - 21.4% - - - (6/28) - -
Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/18) - -
- -
- - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_METHOD.html b/htmlReport/ns-4/index_SORT_BY_METHOD.html deleted file mode 100644 index 62128c29bc..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_METHOD.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.iohandler

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/18) - -
Ui - - 100% - - - (1/1) - - - - 33.3% - - - (3/9) - - - - 21.4% - - - (6/28) - -
Parser - - 100% - - - (1/1) - - - - 50% - - - (10/20) - - - - 31.3% - - - (31/99) - -
- -
- - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html deleted file mode 100644 index 27d543fa78..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.iohandler

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Parser - - 100% - - - (1/1) - - - - 50% - - - (10/20) - - - - 31.3% - - - (31/99) - -
Ui - - 100% - - - (1/1) - - - - 33.3% - - - (3/9) - - - - 21.4% - - - (6/28) - -
Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/18) - -
- -
- - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html deleted file mode 100644 index ffaf46bfb6..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.iohandler

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.iohandler - - 66.7% - - - (2/3) - - - - 38.2% - - - (13/34) - - - - 25.5% - - - (37/145) - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Ui - - 100% - - - (1/1) - - - - 33.3% - - - (3/9) - - - - 21.4% - - - (6/28) - -
Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/18) - -
Parser - - 100% - - - (1/1) - - - - 50% - - - (10/20) - - - - 31.3% - - - (31/99) - -
- -
- - - - - - diff --git a/htmlReport/ns-4/sources/source-1.html b/htmlReport/ns-4/sources/source-1.html deleted file mode 100644 index 5e9d2fe411..0000000000 --- a/htmlReport/ns-4/sources/source-1.html +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - - Coverage Report > Parser - - - - - - -
- - -

Coverage Summary for Class: Parser (bagpacker.iohandler)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
Parser - - 100% - - - (1/1) - - - - 50% - - - (10/20) - - - - 31.3% - - - (31/99) - -
- -
-
- - -
- package bagpacker.iohandler;
- 
- 
- import bagpacker.commands.AddCommand;
- import bagpacker.commands.ByeCommand;
- import bagpacker.commands.Command;
- import bagpacker.commands.DeleteCommand;
- import bagpacker.commands.DeleteListCommand;
- import bagpacker.commands.HelpCommand;
- import bagpacker.commands.IncorrectCommand;
- import bagpacker.commands.ListCommand;
- import bagpacker.commands.PackCommand;
- import bagpacker.commands.UnpackCommand;
- import bagpacker.exception.EmptyInputException;
- import bagpacker.exception.InvalidIndexException;
- import bagpacker.exception.InvalidVariablesException;
- import bagpacker.packingfunc.Item;
- import bagpacker.packingfunc.PackingList;
- 
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Scanner;
- 
- /**
-  * Parser class contains methods to manipulate user input
-  */
- public class Parser {
-     private static ArrayList<String> inputStringArray;
-     private static String fullInput;
- 
-     public static void setFullInput(String fullInput) {
-         Parser.fullInput = fullInput;
-     }
- 
-     /**
-      * Returns the user input in String format
-      */
-     public static String getFullInput() {
-         return fullInput;
-     }
- 
-     /**
-      * Returns the user input as in array format
-      */
-     public static ArrayList<String> getInputStringArray() {
-         return inputStringArray;
-     }
- 
-     public static void setInputStringArray(String[] inputStringArray) {
-         Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray));
-     }
- 
-     public static Command parse() {
-         String inputLine = "";
-         while (inputLine.isEmpty()) {
-             try {
-                 inputLine = readLine().trim();
-             } catch (EmptyInputException e) {
-                 Ui.errorMessage("Empty input received",
-                         "try to input a command, to view all commands input 'help'");
-             }
-         }
-         setFullInput(inputLine);
-         String[] inputStringList = inputLine.split(" ");
-         setInputStringArray(inputStringList);
-         switch (inputStringList[0]) {
-         case "add":
-             return createAddObj();
-         case "delete":
-             return createDeleteObj();
-         case "pack":
-             return createPackObj();
-         case "unpack":
-             return createUnpackObj();
-         case "list":
-             return listCommand();
-         case "help":
-             return createHelpObj();
-         case "deletelist":
-             return createDeletelistObj();
-         case "bye":
-             return createByeObj();
-         default:
-             return new IncorrectCommand("'" + Parser.getCommand() + "' is an invalid User Command",
-                     "input 'help' to receive all valid commands");
-         }
-     }
-     /**
-      * Reads and returns the full user input from the command line interface
-      * - trims the leading and trailing white spaces
-      *
-      * @return inputLine the String input of the user
-      * @throws EmptyInputException when user input empty line
-      */
-     public static String readLine() throws EmptyInputException {
-         String inputLine;
-         Scanner in = new Scanner(System.in);
-         inputLine = in.nextLine().trim();
-         if (inputLine.isEmpty()) {
-             throw new EmptyInputException();
-         }
-         return inputLine;
-     }
- 
-     /**
-      * Returns the user command in lower case
-      *
-      * @return command from user
-      */
-     public static String getCommand() {
-         String command = getInputStringArray().get(0).toLowerCase();
-         return command;
-     }
- 
-     /**
-      * Returns a string which represents the name of the item from the user input
-      *
-      * @return inputVariables which is the name of the item
-      * @throws InvalidVariablesException when the item name cannot be found
-      */
-     public static String getItemName() throws InvalidVariablesException {
-         String itemName;
-         if (inputStringArray.size() <= 1) {
-             throw new InvalidVariablesException();
-         }
-         try {
-             int itemIndStart = fullInput.indexOf(" ") + 1;
-             itemName = fullInput.substring(itemIndStart);
-         } catch (IndexOutOfBoundsException e) {
-             throw new InvalidVariablesException();
-         }
-         return itemName;
-     }
- 
-     /**
-      * Returns a string which represents the index of the item from the user input
-      *
-      * @return inputIndex which is the item index of the item in packing list
-      * @throws InvalidIndexException when the item index is not valid
-      */
-     public static String getItemIndex() throws InvalidIndexException {
-         String inputIndex;
-         int itemIndex;
-         if (inputStringArray.size() != 2) {
-             throw new InvalidIndexException();
-         }
-         try {
-             int itemIndStart = fullInput.indexOf(" ") + 1;
-             inputIndex = fullInput.substring(itemIndStart);
-             itemIndex = Integer.parseInt(inputIndex);
-             if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) {
-                 throw new InvalidIndexException();
-             }
-         } catch (IndexOutOfBoundsException | NumberFormatException e) {
-             throw new InvalidIndexException();
-         }
-         return inputIndex;
-     }
-     /**
-      * Returns a string which represents the relevant variable depending on the command
-      * - "add" will return the item name
-      * - "delete", "pack", "unpack" will return item index
-      *
-      * @param command used to determine the type of variable to return
-      * @return itemVariable which is the index OR name of the item in packing list
-      * @throws InvalidIndexException when the item index is not valid
-      */
-     public static String getVariable(String command) throws InvalidVariablesException, InvalidIndexException {
-         String itemVariable;
-         try {
-             if (command.equals("add")) {
-                 itemVariable = getItemName();
-             } else {
-                 itemVariable = getItemIndex();
-             }
-         } catch (InvalidVariablesException e) {
-             throw new InvalidVariablesException();
-         } catch (InvalidIndexException e) {
-             throw new InvalidIndexException();
-         }
-         return itemVariable;
-     }
- 
- 
-     /**
-      * Returns the user item description
-      */
-     public static String getItemDescrip() {
-         //String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length);
-         int indexItemName = getFullInput().indexOf("i/") + 2;
-         return getFullInput().substring(indexItemName).trim();
-     }
- 
- 
-     /**
-      * Attempts to create AddCommand object to be executed where it is called from
-      *
-      * @return AddCommand the command to be executed to add an item to the packing list, else
-      *      an IncorrectCommand is created to be executed
-      */
-     public static Command createAddObj() {
-         try {
-             String itemName = getVariable("add");
-             return new AddCommand(new Item(itemName));
-         } catch (InvalidVariablesException e) {
-             return new IncorrectCommand("Invalid Item Name",
-                     "try to input a name (word(s)) to be added into the list");
-         } catch (InvalidIndexException e) {
-             return new IncorrectCommand("Invalid Item Index",
-                     "try to input an integer number between 1 and " + PackingList.getItemList().size());
-         }
-     }
- 
-     /**
-      * Attempts to create DeleteCommand object to be executed where it is called from
-      *
-      * @return DeleteCommand the command to be executed to delete an item to the packing list, else
-      *      an IncorrectCommand is created to be executed
-      */
-     public static Command createDeleteObj() {
-         try {
-             String itemIndex = getVariable("delete");
-             return new DeleteCommand(Integer.parseInt(itemIndex));
-         } catch (InvalidVariablesException e) {
-             return new IncorrectCommand("Invalid Item Name",
-                     "Try to input a name (word(s)) to be added into the list");
-         } catch (InvalidIndexException e) {
-             if (PackingList.getItemList().size() == 0) {
-                 return new IncorrectCommand("Invalid Item Index",
-                         "Your packing list is empty, there is nothing to delete");
-             } else {
-                 return new IncorrectCommand("Invalid Item Index",
-                         "Try to input an integer number between 1 and " + PackingList.getItemList().size());
-             }
-         }
-     }
- 
-     /**
-      * Attempts to create PackCommand object to be executed where it is called from
-      *
-      * @return PackCommand the command to be executed to Pack an item in the packing list, else
-      *      an IncorrectCommand is created to be executed
-      */
-     public static Command createPackObj() {
-         try {
-             String itemIndex = getVariable("pack");
-             return new PackCommand(Integer.parseInt(itemIndex));
-         } catch (InvalidVariablesException e) {
-             return new IncorrectCommand("Invalid Item Name",
-                     "try to input a name (word(s)) to be added into the list");
-         } catch (InvalidIndexException e) {
-             if (PackingList.getItemList().size() == 0) {
-                 return new IncorrectCommand("Invalid Item Index",
-                         "Your packing list is empty, there is nothing to pack");
-             } else {
-                 return new IncorrectCommand("Invalid Item Index",
-                         "Try to input an integer number between 1 and " + PackingList.getItemList().size());
-             }
-         }
-     }
- 
- 
-     /**
-      * Attempts to create UnpackCommand object to be executed where it is called from
-      *
-      * @return UnpackCommand the command to be executed to unpack an item in the packing list, else
-      *      an IncorrectCommand is created to be executed
-      */
-     public static Command createUnpackObj() {
-         try {
-             String itemIndex = getVariable("unpack");
-             return new UnpackCommand(Integer.parseInt(itemIndex));
-         } catch (InvalidVariablesException e) {
-             return new IncorrectCommand("Invalid Item Name",
-                     "try to input a name (word(s)) to be added into the list");
-         } catch (InvalidIndexException e) {
-             if (PackingList.getItemList().size() == 0) {
-                 return new IncorrectCommand("Invalid Item Index",
-                         "Your packing list is empty, there is nothing to unpack");
-             } else {
-                 return new IncorrectCommand("Invalid Item Index",
-                         "Try to input an integer number between 1 and " + PackingList.getItemList().size());
-             }
-         }
-     }
- 
-     public static Command listCommand() {
-         return new ListCommand();
-     }
- 
-     public static Command createDeletelistObj() {
-         return new DeleteListCommand();
-     }
- 
-     private static Command createHelpObj() {
-         return new HelpCommand();
-     }
- 
-     private static Command createByeObj() {
-         return new ByeCommand();
-     }
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-4/sources/source-2.html b/htmlReport/ns-4/sources/source-2.html deleted file mode 100644 index 649809b739..0000000000 --- a/htmlReport/ns-4/sources/source-2.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - Coverage Report > Storage - - - - - - -
- - -

Coverage Summary for Class: Storage (bagpacker.iohandler)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/18) - -
- -
-
- - -
- package bagpacker.iohandler;
- 
- import bagpacker.packingfunc.Item;
- import bagpacker.packingfunc.PackingList;
- 
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Scanner;
- 
- /**
-  * Storage class contains methods to save and retrieve saved packing list in txt file
-  */
- public class Storage {
- 
-     public static ArrayList<Item> packingList = new ArrayList<>();
-     private static final String FILE_PATH = "packingList.txt";
-     public static void load() throws FileNotFoundException {
-         Scanner reader = new Scanner(new File(FILE_PATH));
-         String line;
-         while (reader.hasNext()) {
-             line = reader.nextLine();
-             boolean isPacked = line.charAt(1) == 'X';
-             String itemDesc = line.substring(4);
-             Item item = new Item(itemDesc, isPacked);
-             PackingList.getItemList().add(item);
-         }
-     }
- 
-     public static void save() {
-         try {
-             writeToFile();
-         } catch (IOException e) {
-             System.out.println("Something went wrong: " + e.getMessage());
-         }
-     }
- 
-     public static void writeToFile() throws IOException {
-         FileWriter fw = new FileWriter(FILE_PATH);
-         ArrayList<Item> packingList = PackingList.getItemList();
-         for (int i = 0; i < packingList.size(); i++) {
-             fw.write(packingList.get(i).toString() + "\n");
-         }
-     }
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-4/sources/source-3.html b/htmlReport/ns-4/sources/source-3.html deleted file mode 100644 index 6e0a65b9c6..0000000000 --- a/htmlReport/ns-4/sources/source-3.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - Coverage Report > Ui - - - - - - -
- - -

Coverage Summary for Class: Ui (bagpacker.iohandler)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
Ui - - 100% - - - (1/1) - - - - 33.3% - - - (3/9) - - - - 21.4% - - - (6/28) - -
- -
-
- - -
- package bagpacker.iohandler;
- 
- import bagpacker.commands.AddCommand;
- import bagpacker.commands.ByeCommand;
- import bagpacker.commands.DeleteCommand;
- import bagpacker.commands.ListCommand;
- import bagpacker.commands.PackCommand;
- import bagpacker.commands.UnpackCommand;
- 
- /**
-  * Ui class contains methods to print messages to user interface on Command Line Interface
-  */
- public class Ui {
-     public static String logo = " ____              _____           _\n"
-             + "|  _ \\            |  __ \\         | |\n"
-             + "| |_) | __ _  __ _| |__) |_ _  ___| | _____ _ __\n"
-             + "|  _ < / _` |/ _` |  ___/ _` |/ __| |/ / _ \\ '__|\n"
-             + "| |_) | (_| | (_| | |  | (_| | (__|   <  __/ |\n"
-             + "|____/ \\__,_|\\__, |_|   \\__,_|\\___|_|\\_\\___|_|\n"
-             + "              __/ |\n"
-             + "             |___/\n";
-     public static void printErrorLine() {
-         System.out.println("/////////////////////////////////////////////////////////////");
-     }
-     public static void printLine() {
-         System.out.println("____________________________________________________________");
-     }
-     /**
-      * Prints initialising Message
-      */
-     public static void initialMessage(){
-         printLine();
-         System.out.println("Hi this is,\n" + logo);
-         System.out.println("Enter \"help\" to find out how to use BagPacker");
-         printLine();
-     }
-     /**
-      * Prints goodbye Message
-      */
-     public static void goodbyeMessage(){
-         printLine();
-         System.out.println("Bye thanks for using,\n" + logo);
-         printLine();
-     }
- 
-     /**
-      * Prints Error Message with the type of error and a helping message
-      *
-      * @param errorType the type of error (e.g. invalid integer input)
-      * @param helpMessage a message to help the user (e.g. try to input a whole number digit)
-      */
-     public static void errorMessage(String errorType, String helpMessage) {
-         printErrorLine();
-         System.out.print("Error " + errorType);
-         System.out.println(":\n" + helpMessage);
-         printErrorLine();
-     }
- 
-     /**
-      * Prints help message
-      */
-     public static void helpMessage() {
-         printLine();
-         System.out.println("All Commands:");
-         System.out.println("1. " + AddCommand.HELP_MSG);
-         System.out.println("2. " + DeleteCommand.HELP_MSG);
-         System.out.println("3. " + ListCommand.HELP_MSG);
-         System.out.println("4. " + PackCommand.HELP_MSG);
-         System.out.println("5. " + UnpackCommand.HELP_MSG);
-         System.out.println("6. " + ByeCommand.HELP_MSG);
-         printLine();
-     }
- 
-     /**
-      * Prints messages(s) to the user
-      * @param message
-      */
-     public static void printToUser(String... message) {
-         printLine();
-         for (String m : message) {
-             System.out.println(m);
-         }
-         printLine();
-     }
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-5/index.html b/htmlReport/ns-5/index.html deleted file mode 100644 index 61f2ed891e..0000000000 --- a/htmlReport/ns-5/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.packingfunc

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
- -
-
- - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Item - - 100% - - - (1/1) - - - - 42.9% - - - (3/7) - - - - 40% - - - (6/15) - -
PackingList - - 100% - - - (1/1) - - - - 40% - - - (4/10) - - - - 45.5% - - - (5/11) - -
- -
- - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_BLOCK.html b/htmlReport/ns-5/index_SORT_BY_BLOCK.html deleted file mode 100644 index 42ec636ef3..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_BLOCK.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.packingfunc

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
- -
-
- - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Item - - 100% - - - (1/1) - - - - 42.9% - - - (3/7) - - - - 40% - - - (6/15) - -
PackingList - - 100% - - - (1/1) - - - - 40% - - - (4/10) - - - - 45.5% - - - (5/11) - -
- -
- - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html deleted file mode 100644 index b2f5919e43..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.packingfunc

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
- -
-
- - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
PackingList - - 100% - - - (1/1) - - - - 40% - - - (4/10) - - - - 45.5% - - - (5/11) - -
Item - - 100% - - - (1/1) - - - - 42.9% - - - (3/7) - - - - 40% - - - (6/15) - -
- -
- - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_CLASS.html b/htmlReport/ns-5/index_SORT_BY_CLASS.html deleted file mode 100644 index bf3a74a10a..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_CLASS.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.packingfunc

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
- -
-
- - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Item - - 100% - - - (1/1) - - - - 42.9% - - - (3/7) - - - - 40% - - - (6/15) - -
PackingList - - 100% - - - (1/1) - - - - 40% - - - (4/10) - - - - 45.5% - - - (5/11) - -
- -
- - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html deleted file mode 100644 index 8e4a259e09..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.packingfunc

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
- -
-
- - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
PackingList - - 100% - - - (1/1) - - - - 40% - - - (4/10) - - - - 45.5% - - - (5/11) - -
Item - - 100% - - - (1/1) - - - - 42.9% - - - (3/7) - - - - 40% - - - (6/15) - -
- -
- - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_LINE.html b/htmlReport/ns-5/index_SORT_BY_LINE.html deleted file mode 100644 index 6320646c0a..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_LINE.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.packingfunc

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
- -
-
- - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Item - - 100% - - - (1/1) - - - - 42.9% - - - (3/7) - - - - 40% - - - (6/15) - -
PackingList - - 100% - - - (1/1) - - - - 40% - - - (4/10) - - - - 45.5% - - - (5/11) - -
- -
- - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html deleted file mode 100644 index 9edfa3195f..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.packingfunc

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
- -
-
- - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
PackingList - - 100% - - - (1/1) - - - - 40% - - - (4/10) - - - - 45.5% - - - (5/11) - -
Item - - 100% - - - (1/1) - - - - 42.9% - - - (3/7) - - - - 40% - - - (6/15) - -
- -
- - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_METHOD.html b/htmlReport/ns-5/index_SORT_BY_METHOD.html deleted file mode 100644 index 8bb3ac70ae..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_METHOD.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.packingfunc

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
- -
-
- - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
PackingList - - 100% - - - (1/1) - - - - 40% - - - (4/10) - - - - 45.5% - - - (5/11) - -
Item - - 100% - - - (1/1) - - - - 42.9% - - - (3/7) - - - - 40% - - - (6/15) - -
- -
- - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html deleted file mode 100644 index ec066fb29c..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.packingfunc

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
- -
-
- - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
Item - - 100% - - - (1/1) - - - - 42.9% - - - (3/7) - - - - 40% - - - (6/15) - -
PackingList - - 100% - - - (1/1) - - - - 40% - - - (4/10) - - - - 45.5% - - - (5/11) - -
- -
- - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html deleted file mode 100644 index b74ed76353..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
- - - -

Coverage Summary for Package: bagpacker.packingfunc

- - - - - - - - - - - - - -
Package - Class, % - - Method, % - - Line, % -
bagpacker.packingfunc - - 100% - - - (2/2) - - - - 41.2% - - - (7/17) - - - - 42.3% - - - (11/26) - -
- -
-
- - - - - - - - - - - - - - - - - - - - -
-Class - Class, % - - Method, % - - Line, % -
PackingList - - 100% - - - (1/1) - - - - 40% - - - (4/10) - - - - 45.5% - - - (5/11) - -
Item - - 100% - - - (1/1) - - - - 42.9% - - - (3/7) - - - - 40% - - - (6/15) - -
- -
- - - - - - diff --git a/htmlReport/ns-5/sources/source-1.html b/htmlReport/ns-5/sources/source-1.html deleted file mode 100644 index f637c89821..0000000000 --- a/htmlReport/ns-5/sources/source-1.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - Coverage Report > Item - - - - - - -
- - -

Coverage Summary for Class: Item (bagpacker.packingfunc)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
Item - - 100% - - - (1/1) - - - - 42.9% - - - (3/7) - - - - 40% - - - (6/15) - -
- -
-
- - -
- package bagpacker.packingfunc;
- /**
-  * Item class used to store information about item
-  * Items to be packed can be saved in PackingList class
-  */
- public class Item {
-     private String itemName;
-     private boolean isPacked;
-     private String packIcon = " ";
-     public Item(String description) {
-         this.itemName = description;
-         isPacked = false;
-     }
-     public Item(String description, boolean isPacked) {
-         this.itemName = description;
-         this.isPacked = isPacked;
-     }
-     public void setPackIcon() {
-         if (this.isPacked) {
-             this.packIcon = "X";
-         } else {
-             this.packIcon = " ";
-         }
-     }
- 
-     public String getItemName() {
-         return itemName;
-     }
- 
-     public boolean getIsPacked() {
-         return isPacked;
-     }
-     public void setPacked(boolean packed) {
-         isPacked = packed;
-         setPackIcon();
-     }
- 
-     public String toString() {
-         return "[" + this.packIcon + "] " + this.getItemName();
-     }
- }
-
-
-
- - - - - - diff --git a/htmlReport/ns-5/sources/source-2.html b/htmlReport/ns-5/sources/source-2.html deleted file mode 100644 index b74c31ec91..0000000000 --- a/htmlReport/ns-5/sources/source-2.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Coverage Report > PackingList - - - - - - -
- - -

Coverage Summary for Class: PackingList (bagpacker.packingfunc)

- - - - - - - - - - - - - - - -
Class - Class, % - - Method, % - - Line, % -
PackingList - - 100% - - - (1/1) - - - - 40% - - - (4/10) - - - - 45.5% - - - (5/11) - -
- -
-
- - -
- package bagpacker.packingfunc;
- 
- import java.util.ArrayList;
- 
- /**
-  * PackingList class contains methods to manipulate the users packing list
-  */
- public class PackingList {
- 
- 
-     private static ArrayList<Item> itemList = new ArrayList<>();
- 
-     private static int targetIndex = -1;
-     public static void setItemList(ArrayList<Item> itemList) {
-         PackingList.itemList = itemList;
-     }
- 
-     /**
-      * Getter for itemList
-      *
-      * @return list of items
-      */
-     public static ArrayList<Item> getItemList() {
-         return itemList;
-     }
-     /**
-      * Adds an item to the list.
-      */
-     public void addItem(Item toAdd) {
-         itemList.add(toAdd);
-     }
- 
-     /**
-      * Removes an item from the list.
-      */
-     public void deleteItem(Item toDelete) {
-         itemList.remove(toDelete);
-     }
- 
-     /**
-      * Marks an item as packed in the list.
-      */
-     public void packItem(Item toPack) {
-         toPack.setPacked(true);
-     }
- 
-     /**
-      * Marks an item as unpacked in the list.
-      */
-     public void unpackItem(Item toPack) {
-         toPack.setPacked(false);
-     }
- 
-     public static Item get(int targetIndex) {
-         return itemList.get(targetIndex);
-     }
- 
-     /**
-      * Returns size of packing list
-      */
-     public int size(){
-         return itemList.size();
-     }
- 
- 
- }
-
-
-
- - - - - - diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index 7fe2678c6a..ce64d96cbe 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -8,7 +8,6 @@ public class BagPacker { private static PackingList packingList; - /** * Main entry-point for the java.BagPacker application. */ diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index 1042555f35..3e73fc1e84 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -7,7 +7,7 @@ public class AddCommand extends Command { public static final String MSG_SUCCESS_ADD = "New item added: %s"; public static final String HELP_MSG = "add : Adds an item to the packing list.\n" + - "\tExample: add toothbrush"; + "\tExample: add toothbrush"; private final Item item; diff --git a/src/main/java/bagpacker/commands/ByeCommand.java b/src/main/java/bagpacker/commands/ByeCommand.java index b5616f236e..1da5969222 100644 --- a/src/main/java/bagpacker/commands/ByeCommand.java +++ b/src/main/java/bagpacker/commands/ByeCommand.java @@ -9,8 +9,7 @@ public class ByeCommand extends Command { public static boolean isBagPackerRunning = true; public static final String HELP_MSG = "bye : Stops the BagPacker Application\n" + "\tExample: bye"; - - public void execute(PackingList packingList) { + public void execute (PackingList packingList) { this.isBagPackerRunning = false; } } diff --git a/src/main/java/bagpacker/commands/Command.java b/src/main/java/bagpacker/commands/Command.java index 967691f9f9..b3ce81ba9e 100644 --- a/src/main/java/bagpacker/commands/Command.java +++ b/src/main/java/bagpacker/commands/Command.java @@ -37,12 +37,13 @@ protected Item getTargetItem() throws IndexOutOfBoundsException { return packingList.get(getTargetIndex() - 1); } + /** * Executes the command which requires a packingList * * @param packingList used to execute the command */ - public void execute(PackingList packingList) { + public void execute (PackingList packingList) { } } diff --git a/src/main/java/bagpacker/commands/DeleteListCommand.java b/src/main/java/bagpacker/commands/DeleteListCommand.java index 90992d80ad..ea4ea801c8 100644 --- a/src/main/java/bagpacker/commands/DeleteListCommand.java +++ b/src/main/java/bagpacker/commands/DeleteListCommand.java @@ -8,11 +8,13 @@ public class DeleteListCommand extends Command { public static final String MSG_SUCCESS_DELETE_LIST = "list deleted"; - @Override public void execute(PackingList packingList) { - ArrayList emptyList = new ArrayList<>(); + ArrayList< Item > emptyList = new ArrayList<>(); packingList.setItemList(emptyList); Ui.printToUser(String.format(MSG_SUCCESS_DELETE_LIST)); } + + + } diff --git a/src/main/java/bagpacker/commands/IncorrectCommand.java b/src/main/java/bagpacker/commands/IncorrectCommand.java index 038cec642a..4932cb1c29 100644 --- a/src/main/java/bagpacker/commands/IncorrectCommand.java +++ b/src/main/java/bagpacker/commands/IncorrectCommand.java @@ -6,7 +6,6 @@ public class IncorrectCommand extends Command { private final String errorType; private final String helpMessage; - public IncorrectCommand(String errorType, String helpMessage) { this.helpMessage = helpMessage; this.errorType = errorType; diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index bf66f3ebb1..279520a779 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -19,8 +19,14 @@ public void execute(PackingList packingList) { System.out.println("____________________________________________________________"); System.out.println("Here are the items in your list"); for (int i = 0; i < packingList.size(); i++) { - System.out.print((i + 1) + ". "); - System.out.println(PackingList.get(i)); + String isItemPacked; + if (packingList.get(i).getIsPacked()) { + isItemPacked = "X"; + } else { + isItemPacked = " "; + } + String itemName = packingList.get(i).getItemName(); + System.out.println((i + 1) + ". [" + isItemPacked + "] " + itemName); } System.out.println("____________________________________________________________"); } diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 5c8f69b6b6..fb7b0c8295 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -7,16 +7,14 @@ public class PackCommand extends Command { public static final String MSG_SUCCESS_PACK = "Item packed: %s"; - public static final String HELP_MSG = "pack : Marks an item as packed in the packing list.\n" + + public static final String HELP_MSG= "pack : Marks an item as packed in the packing list.\n" + "\tExample: pack 2 of 3\n" + "\tMeaning: packs 2 quantities of the third item in the packing list"; - private static int packQuantity; - public PackCommand(int quantity, int targetIndex) { + public PackCommand(int targetIndex) { super(targetIndex); - packQuantity = quantity; - assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : + assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): "Pack Command Target index is out of bounds"; } @@ -24,7 +22,7 @@ public PackCommand(int quantity, int targetIndex) { public void execute(PackingList packingList) { this.packingList = packingList; final Item item = getTargetItem(); - packingList.packItem(item, packQuantity); + packingList.packItem(item); Ui.printToUser(String.format(MSG_SUCCESS_PACK, item)); } diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java new file mode 100644 index 0000000000..5e35bf08c7 --- /dev/null +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -0,0 +1,29 @@ +package bagpacker.commands; + +import bagpacker.iohandler.Ui; +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; + +public class UnpackCommand extends Command { + + public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; + public static final String HELP_MSG = "unpack : Marks an item as unpacked in the packing list.\n" + + "\tExample: unpack 1 of 2\n" + + "\tMeaning: unpacks 1 quantity of the second item in the packing list"; + + + public UnpackCommand(int targetIndex) { + super(targetIndex); + assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): + "Unpack Command Target index is out of bounds"; + } + + @Override + public void execute(PackingList packingList) { + this.packingList = packingList; + final Item item = getTargetItem(); + packingList.unpackItem(item); + Ui.printToUser(String.format(MSG_SUCCESS_UNPACK, item)); + } + +} diff --git a/src/main/java/bagpacker/exception/InvalidIndexException.java b/src/main/java/bagpacker/exception/InvalidIndexException.java index 61268b25d7..c67a8009b6 100644 --- a/src/main/java/bagpacker/exception/InvalidIndexException.java +++ b/src/main/java/bagpacker/exception/InvalidIndexException.java @@ -1,4 +1,6 @@ package bagpacker.exception; -public class InvalidIndexException extends Exception { + + +public class InvalidIndexException extends Exception{ } diff --git a/src/main/java/bagpacker/exception/InvalidVariablesException.java b/src/main/java/bagpacker/exception/InvalidVariablesException.java index 163e70c5cb..428e531525 100644 --- a/src/main/java/bagpacker/exception/InvalidVariablesException.java +++ b/src/main/java/bagpacker/exception/InvalidVariablesException.java @@ -1,4 +1,6 @@ package bagpacker.exception; -public class InvalidVariablesException extends Exception { + + +public class InvalidVariablesException extends Exception{ } diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index cc44aa5bb2..676a9d6188 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -1,5 +1,6 @@ package bagpacker.iohandler; + import bagpacker.commands.AddCommand; import bagpacker.commands.ByeCommand; import bagpacker.commands.Command; @@ -9,32 +10,28 @@ import bagpacker.commands.IncorrectCommand; import bagpacker.commands.ListCommand; import bagpacker.commands.PackCommand; +import bagpacker.commands.UnpackCommand; import bagpacker.exception.EmptyInputException; import bagpacker.exception.InvalidIndexException; import bagpacker.exception.InvalidVariablesException; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Scanner; /** * Parser class contains methods to manipulate user input */ public class Parser { - private static String[] arguments; + private static ArrayList inputStringArray; private static String fullInput; public static void setFullInput(String fullInput) { Parser.fullInput = fullInput; } - /** - * Returns the user input in String format - */ - public static String getFullInput() { - return fullInput; - } - /** * Returns the user input as in array format */ @@ -45,40 +42,38 @@ public static ArrayList getInputStringArray() { public static void setInputStringArray(String[] inputStringArray) { Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray)); } - + /** - * parses user input into relevant subclasses of Command for execution. - * @return command based on user input + * Returns the user input in String format */ + public static String getFullInput() { + return fullInput; + } + public static Command parse() { - arguments = new String[2]; String inputLine = ""; while (inputLine.isEmpty()) { try { - inputLine = readLine().trim(); + inputLine = readLine(); } catch (EmptyInputException e) { Ui.errorMessage("Empty input received", "try to input a command, to view all commands input 'help'"); } } setFullInput(inputLine); - String[] inputStringList = inputLine.split(" "); + String[] inputStringList = inputLine.trim().split(" "); setInputStringArray(inputStringList); - switch (getCommand()) { + switch (inputStringList[0]) { case "add": - arguments = inputStringList[1].trim().split("/of"); return createAddObj(); case "delete": - arguments[0] = inputStringList[1].trim(); return createDeleteObj(); case "pack": - arguments = inputStringList[1].trim().split("/of"); return createPackObj(); case "unpack": - arguments = inputStringList[1].trim().split("/of"); return createUnpackObj(); case "list": - return createListObj(); + return listCommand(); case "help": return createHelpObj(); case "deletelist": @@ -86,11 +81,10 @@ public static Command parse() { case "bye": return createByeObj(); default: - return new IncorrectCommand("'" + inputStringList[0] + "' is an invalid User Command", + return new IncorrectCommand("'" + Parser.getCommand() + "' is an invalid User Command", "input 'help' to receive all valid commands"); } } - /** * Reads and returns the full user input from the command line interface * - trims the leading and trailing white spaces @@ -98,7 +92,7 @@ public static Command parse() { * @return inputLine the String input of the user * @throws EmptyInputException when user input empty line */ - public static String readLine() throws EmptyInputException { + private static String readLine() throws EmptyInputException { String inputLine; Scanner in = new Scanner(System.in); inputLine = in.nextLine().trim(); @@ -108,6 +102,35 @@ public static String readLine() throws EmptyInputException { return inputLine; } + /** + * Returns the user command in lower case + * + * @return command from user + */ + public static String getCommand() { + return getInputStringArray().get(0).toLowerCase(); + } + + /** + * Returns a string which represents the name of the item from the user input + * + * @return inputVariables which is the name of the item + * @throws InvalidVariablesException when the item name cannot be found + */ + public static String getItemName() throws InvalidVariablesException { + String itemName; + if (inputStringArray.size() <= 1) { + throw new InvalidVariablesException(); + } + try { + int itemIndStart = fullInput.indexOf(" ") + 1; + itemName = fullInput.substring(itemIndStart); + } catch (IndexOutOfBoundsException e) { + throw new InvalidVariablesException(); + } + return itemName; + } + /** * Returns a string which represents the index of the item from the user input * @@ -117,7 +140,7 @@ public static String readLine() throws EmptyInputException { public static String getItemIndex() throws InvalidIndexException { String inputIndex; int itemIndex; - if (arguments[0] == null) { + if (inputStringArray.size() != 2) { throw new InvalidIndexException(); } try { @@ -132,37 +155,59 @@ public static String getItemIndex() throws InvalidIndexException { } return inputIndex; } - /** * Returns a string which represents the relevant variable depending on the command * - "add" will return the item name * - "delete", "pack", "unpack" will return item index * + * @param command used to determine the type of variable to return * @return itemVariable which is the index OR name of the item in packing list * @throws InvalidIndexException when the item index is not valid */ - public static String getVariable() throws InvalidIndexException { + public static String getVariable(String command) throws InvalidVariablesException, InvalidIndexException { String itemVariable; try { - itemVariable = getItemIndex(); + if (command.equals("add")) { + itemVariable = getItemName(); + } else { + itemVariable = getItemIndex(); + } + } catch (InvalidVariablesException e) { + throw new InvalidVariablesException(); } catch (InvalidIndexException e) { throw new InvalidIndexException(); } return itemVariable; } - public static String[] getQuantityAndDescription() { - String[] itemQuantityAndDescription = new String[2]; - itemQuantityAndDescription[0] = arguments[0]; - itemQuantityAndDescription[1] = arguments[1]; - return itemQuantityAndDescription; + + /** + * Returns the user item description + */ + public static String getItemDescrip() { + //String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length); + int indexItemName = getFullInput().indexOf("i/") + 2; + return getFullInput().substring(indexItemName).trim(); } + + /** + * Attempts to create AddCommand object to be executed where it is called from + * + * @return AddCommand the command to be executed to add an item to the packing list, else + * an IncorrectCommand is created to be executed + */ public static Command createAddObj() { - String[] quantityAndDescription = getQuantityAndDescription(); - int itemQuantity = Integer.parseInt((quantityAndDescription[0]).trim()); - String itemDescription = quantityAndDescription[1].trim(); - return new AddCommand(new Item(itemQuantity, itemDescription)); + try { + String itemName = getVariable("add"); + return new AddCommand(new Item(itemName)); + } catch (InvalidVariablesException e) { + return new IncorrectCommand("Invalid Item Name", + "try to input a name (word(s)) to be added into the list"); + } catch (InvalidIndexException e) { + return new IncorrectCommand("Invalid Item Index", + "try to input an integer number between 1 and " + PackingList.getItemList().size()); + } } /** @@ -173,8 +218,11 @@ public static Command createAddObj() { */ public static Command createDeleteObj() { try { - String itemIndex = getVariable(); + String itemIndex = getVariable("delete"); return new DeleteCommand(Integer.parseInt(itemIndex)); + } catch (InvalidVariablesException e) { + return new IncorrectCommand("Invalid Item Name", + "Try to input a name (word(s)) to be added into the list"); } catch (InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { return new IncorrectCommand("Invalid Item Index", @@ -186,19 +234,6 @@ public static Command createDeleteObj() { } } - public static int[] getQuantityAndIndex() throws InvalidVariablesException, InvalidIndexException { - int[] itemQuantityAndIndex = new int[2]; - try { - itemQuantityAndIndex[0] = Integer.parseInt(arguments[0].trim()); - itemQuantityAndIndex[1] = Integer.parseInt(arguments[1].trim()); - } catch (IndexOutOfBoundsException e) { - throw new InvalidVariablesException(); - } catch (NumberFormatException e) { - throw new InvalidIndexException(); - } - return itemQuantityAndIndex; - } - /** * Attempts to create PackCommand object to be executed where it is called from * @@ -207,10 +242,8 @@ public static int[] getQuantityAndIndex() throws InvalidVariablesException, Inva */ public static Command createPackObj() { try { - int[] quantityAndIndex = getQuantityAndIndex(); - int itemQuantity = quantityAndIndex[0]; - int itemIndex = quantityAndIndex[1]; - return new PackCommand(itemQuantity, itemIndex); + String itemIndex = getVariable("pack"); + return new PackCommand(Integer.parseInt(itemIndex)); } catch (InvalidVariablesException e) { return new IncorrectCommand("Invalid Item Name", "try to input a name (word(s)) to be added into the list"); @@ -225,6 +258,7 @@ public static Command createPackObj() { } } + /** * Attempts to create UnpackCommand object to be executed where it is called from * @@ -233,10 +267,8 @@ public static Command createPackObj() { */ public static Command createUnpackObj() { try { - int[] quantityAndIndex = getQuantityAndIndex(); - int itemQuantity = -1 * quantityAndIndex[0]; - int itemIndex = quantityAndIndex[1]; - return new PackCommand(itemQuantity, itemIndex); + String itemIndex = getVariable("unpack"); + return new UnpackCommand(Integer.parseInt(itemIndex)); } catch (InvalidVariablesException e) { return new IncorrectCommand("Invalid Item Name", "try to input a name (word(s)) to be added into the list"); @@ -251,7 +283,7 @@ public static Command createUnpackObj() { } } - public static Command createListObj() { + public static Command listCommand() { return new ListCommand(); } diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java index 5af85eb755..212fefb558 100644 --- a/src/main/java/bagpacker/iohandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -3,9 +3,12 @@ import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; +import java.io.File; +import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; +import java.util.Scanner; /** * Storage class contains methods to save and retrieve saved packing list in txt file @@ -14,19 +17,17 @@ public class Storage { public static ArrayList packingList = new ArrayList<>(); private static final String FILE_PATH = "packingList.txt"; - - // to be edited by @coregano - // public static void load() throws FileNotFoundException { - // Scanner reader = new Scanner(new File(FILE_PATH)); - // String line; - // while (reader.hasNext()) { - // line = reader.nextLine(); - // boolean isPacked = line.charAt(1) == 'X'; - // String itemDesc = line.substring(4); - // Item item = new Item(itemDesc, isPacked); - // PackingList.getItemList().add(item); - // } - // } + public static void load() throws FileNotFoundException { + Scanner reader = new Scanner(new File(FILE_PATH)); + String line; + while (reader.hasNext()) { + line = reader.nextLine(); + boolean isPacked = line.charAt(1) == 'X'; + String itemDesc = line.substring(4); + Item item = new Item(itemDesc, isPacked); + PackingList.getItemList().add(item); + } + } public static void save() { try { diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index 9088c6dd0f..4b77544a14 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -5,6 +5,7 @@ import bagpacker.commands.DeleteCommand; import bagpacker.commands.ListCommand; import bagpacker.commands.PackCommand; +import bagpacker.commands.UnpackCommand; /** * Ui class contains methods to print messages to user interface on Command Line Interface @@ -65,7 +66,8 @@ public static void helpMessage() { System.out.println("2. " + DeleteCommand.HELP_MSG); System.out.println("3. " + ListCommand.HELP_MSG); System.out.println("4. " + PackCommand.HELP_MSG); - System.out.println("5. " + ByeCommand.HELP_MSG); + System.out.println("5. " + UnpackCommand.HELP_MSG); + System.out.println("6. " + ByeCommand.HELP_MSG); printLine(); } diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index 636a05cd86..2249ccc272 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -1,29 +1,41 @@ package bagpacker.packingfunc; - /** * Item class used to store information about item * Items to be packed can be saved in PackingList class */ public class Item { private String itemName; - private int packedQuantity; - private int totalQuantity; - - public Item(int quantity, String description) { + private boolean isPacked; + private String packIcon = " "; + public Item(String description) { + this.itemName = description; + isPacked = false; + } + public Item(String description, boolean isPacked) { this.itemName = description; - packedQuantity = 0; - totalQuantity = quantity; + this.isPacked = isPacked; + } + public void setPackIcon() { + if (this.isPacked) { + this.packIcon = "X"; + } else { + this.packIcon = " "; + } } public String getItemName() { return itemName; } - public void setPacked(int quantity) { - this.packedQuantity += quantity; + public boolean getIsPacked() { + return isPacked; + } + public void setPacked(boolean packed) { + isPacked = packed; + setPackIcon(); } public String toString() { - return "[" + packedQuantity + "/" + totalQuantity + "] " + this.getItemName(); + return "[" + this.packIcon + "] " + this.getItemName(); } } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index 29b3145e08..fc9949c2bb 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -7,8 +7,10 @@ */ public class PackingList { + private static ArrayList itemList = new ArrayList<>(); + private static int targetIndex = -1; public static void setItemList(ArrayList itemList) { PackingList.itemList = itemList; } @@ -21,7 +23,6 @@ public static void setItemList(ArrayList itemList) { public static ArrayList getItemList() { return itemList; } - /** * Adds an item to the list. */ @@ -37,17 +38,17 @@ public void deleteItem(Item toDelete) { } /** - * Adds quantity to quantity already packed + * Marks an item as packed in the list. */ - public void packItem(Item toPack, int quantity) { - toPack.setPacked(quantity); + public void packItem(Item toPack) { + toPack.setPacked(true); } /** - * Subtracts quantity from quantity already packed + * Marks an item as unpacked in the list. */ - public void unpackItem(Item toPack, int quantity) { - toPack.setPacked(quantity); + public void unpackItem(Item toPack) { + toPack.setPacked(false); } public static Item get(int targetIndex) { @@ -57,8 +58,9 @@ public static Item get(int targetIndex) { /** * Returns size of packing list */ - public int size() { + public int size(){ return itemList.size(); } + } diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index 8cf3f214e4..2f28ce9495 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -1,154 +1,14 @@ package bagpacker.iohandlertest; - -import bagpacker.commands.AddCommand; -import bagpacker.commands.ByeCommand; -import bagpacker.commands.DeleteCommand; -import bagpacker.commands.HelpCommand; -import bagpacker.commands.IncorrectCommand; -import bagpacker.commands.ListCommand; -import bagpacker.commands.PackCommand; -import bagpacker.commands.UnpackCommand; -import bagpacker.exception.EmptyInputException; -import bagpacker.exception.InvalidIndexException; -import bagpacker.exception.InvalidVariablesException; -import bagpacker.iohandler.Parser; -import bagpacker.packingfunc.PackingList; import org.junit.jupiter.api.Test; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * ParserTest to test Parser Class */ public class ParserTest { @Test - public void fullInputTest() { - String userInput = " add this item "; - InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); - System.setIn(inStream); - Parser.parse(); - assertEquals(userInput.trim(), Parser.getFullInput()); - } - - @Test - public void addCommandTest() { - String userInput = " add this item "; - InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); - System.setIn(inStream); - assertEquals(AddCommand.class, Parser.parse().getClass()); - } - - @Test - public void emptyInputTest() { - String userInput = " "; - InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); - System.setIn(inStream); - Exception exception = assertThrows(EmptyInputException.class, Parser::readLine); - assertEquals(EmptyInputException.class, exception.getClass()); - } - - @Test - public void addVariableTest() throws InvalidIndexException, InvalidVariablesException { - String userInput = " add this item 1 "; - InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); - System.setIn(inStream); - Parser.parse(); - assertEquals("this item 1", Parser.getVariable(Parser.getCommand())); - } - - @Test - public void deleteCommandTest() { - String userInput1 = " add this item "; - String userInput2 = " delete 1 "; - InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); - System.setIn(inStream); - PackingList dummyPackingList = new PackingList(); - Parser.parse().execute(dummyPackingList); - inStream = new ByteArrayInputStream(userInput2.getBytes()); - System.setIn(inStream); - assertEquals(DeleteCommand.class, Parser.parse().getClass()); - } - - @Test - public void packCommandTest() { - String userInput1 = " add this item "; - String userInput2 = " pack 1 "; - InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); - System.setIn(inStream); - PackingList dummyPackingList = new PackingList(); - Parser.parse().execute(dummyPackingList); - inStream = new ByteArrayInputStream(userInput2.getBytes()); - System.setIn(inStream); - assertEquals(PackCommand.class, Parser.parse().getClass()); - } - - @Test - public void unpackCommandTest() { - String userInput1 = " add this item "; - String userInput2 = " pack 1 "; - String userInput3 = " Unpack 1 "; - PackingList dummyPackingList = new PackingList(); - - InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); - System.setIn(inStream); - Parser.parse().execute(dummyPackingList); - - inStream = new ByteArrayInputStream(userInput2.getBytes()); - System.setIn(inStream); - Parser.parse().execute(dummyPackingList); - - inStream = new ByteArrayInputStream(userInput3.getBytes()); - System.setIn(inStream); - assertEquals(UnpackCommand.class, Parser.parse().getClass()); - } - - @Test - public void listCommandTest() { - String userInput1 = " add this item "; - String userInput2 = " lIST "; - PackingList dummyPackingList = new PackingList(); - - InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); - System.setIn(inStream); - Parser.parse().execute(dummyPackingList); - - inStream = new ByteArrayInputStream(userInput2.getBytes()); - System.setIn(inStream); - - assertEquals(ListCommand.class, Parser.parse().getClass()); - } - @Test - public void helpCommandTest() { - String userInput1 = " HelP "; - - InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); - System.setIn(inStream); - - assertEquals(HelpCommand.class, Parser.parse().getClass()); - } - - @Test - public void byeCommandTest() { - String userInput1 = " byE "; - - InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); - System.setIn(inStream); - - assertEquals(ByeCommand.class, Parser.parse().getClass()); + public void sampleTest() { + assertTrue(true); } - @Test - public void invalidCommandTest() { - String userInput1 = " thisIsNOTaVALID command "; - - InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); - System.setIn(inStream); - - assertEquals(IncorrectCommand.class, Parser.parse().getClass()); - } } - diff --git a/src/test/java/bagpacker/packingfunctest/CommandsTest.java b/src/test/java/bagpacker/packingfunctest/CommandsTest.java index db288dcbf0..88ef7ab2f7 100644 --- a/src/test/java/bagpacker/packingfunctest/CommandsTest.java +++ b/src/test/java/bagpacker/packingfunctest/CommandsTest.java @@ -1,11 +1,10 @@ package bagpacker.packingfunctest; -/* + import bagpacker.commands.AddCommand; import bagpacker.commands.Command; -//import bagpacker.packingfunc.Item; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; -import org.junit.jupiter.api.Assertions;*/ +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -18,10 +17,11 @@ public void sampleTest() { assertTrue(true); } - /*@Test + @Test public void testAddCommand() { PackingList packingList = new PackingList(); - Command addCommand = new AddCommand(new Item(1, "toothbrush")); + Item item = new Item("toothbrush"); + Command addCommand = new AddCommand(item); addCommand.execute(packingList); // Expect a Packinglist with a toothbrush item in first index @@ -29,13 +29,13 @@ public void testAddCommand() { Assertions.assertNotEquals("tooth", packingList.get(0).getItemName()); // Expect second index item in the packing list to be toothpaste - - addObj = new AddCommand(1, "toothpaste"); - addObj.execute(packingList); + Item itemTwo = new Item("toothpaste"); + addCommand = new AddCommand(itemTwo); + addCommand.execute(packingList); Assertions.assertEquals("toothpaste",packingList.get(1).getItemName()); Assertions.assertNotEquals("toothbrush", packingList.get(1).getItemName()); - }*/ + } } From 961ae6c060d83513eccbc8c4089cb65a817e9961 Mon Sep 17 00:00:00 2001 From: coregano Date: Fri, 24 Mar 2023 01:51:52 +0800 Subject: [PATCH 058/207] Update developer guide --- docs/DeveloperGuide.md | 32 +++++++++++++++----------------- docs/img_1.png | Bin 38579 -> 0 bytes docs/img_3.png | Bin 0 -> 30174 bytes 3 files changed, 15 insertions(+), 17 deletions(-) delete mode 100644 docs/img_1.png create mode 100644 docs/img_3.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f171e5cf9a..c8a76eb2d9 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -23,22 +23,6 @@ Mechanism: ```AddCommand.execute()``` calls the ```PackingList.addItem()``` meth It then updates the ```quantity``` variable according to the quantity inputted by the user. -#### Preventing duplicate items - -When using the `add` function, we have decided to implement a passive function that checks whether the item with the same name already exists in the packingList. - -This is done through the `contains()` method in class `PackingList()`, which is called during `execute` in an `AddCommand` object. - -Below is the UML diagram showing what occurs during `add` function. -![img_1.png](img_1.png) -When `execute()` is called in `a`(object of class `AddCommand`), the `addItem(item)` method is called in the object `packingList`. This method will see if method `contains()` will return `true`. - -The `contains()` method, which is shown as a reference on the right of the UML diagram, is a boolean method that loops through all items in the packingList, and returns `true` if any of the existing items have the same description as the item to be added in `toAdd`, and `false` otherwise. - -When `contains()` returns `true`, method `addItem(item)` will be interrupted and a `DuplicateItemException` will be thrown from `packingList`, which will be caught by `a`. If `contains()` returns false, the item will be added onto `packingList`. - -In both scenarios, `ui.printToUser` will be called to print a message to the user. In the former case, `ExistItemError` will be printed, while `AddSuccess` will be shown if the item was added with no issues. - #### Delete Command Delete command is used to delete an item from the packing list. @@ -68,7 +52,6 @@ All Commands: 6. bye : Stops the BagPacker Application Example: bye ____________________________________________________________ - ``` #### Bye Command @@ -83,6 +66,21 @@ The ```runBagPacker()``` method will continually parse and execute relevant comm Mechanism: ```DeleteListCommand.execute()``` reassigns the existing ```packingList``` to a new empty ArrayList of Items, thus deleting the ```packingList```. +#### Preventing duplicate items + +When using the `add` function, we have decided to implement a passive function that checks whether the item with the same name already exists in the packingList. + +This is done through the `contains()` method in class `PackingList()`, which is called during `execute` in an `AddCommand` object. + +Below is the UML diagram showing what occurs during `add` function. +![img_3.png](img_3.png) +When `execute()` is called in `a`(object of class `AddCommand`), the `addItem(item)` method is called in the object `packingList`. This method will see if method `contains()` will return `true`. + +The `contains()` method, which is shown as a reference on the right of the UML diagram, is a boolean method that loops through all items in the packingList, and returns `true` if any of the existing items have the same description as the item to be added in `toAdd`, and `false` otherwise. + +When `contains()` returns `true`, method `addItem(item)` will be interrupted and a `DuplicateItemException` will be thrown from `packingList`, which will be caught by `a`. If `contains()` returns false, the item will be added onto `packingList`. + +In both scenarios, `ui.printToUser` will be called to print a message to the user. In the former case, `ExistItemError` will be printed, while `AddSuccess` will be shown if the item was added with no issues. ## Product scope diff --git a/docs/img_1.png b/docs/img_1.png deleted file mode 100644 index 6899bf1bc9187a05077c7cf5c275153ce46b910a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38579 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 diff --git a/docs/img_3.png b/docs/img_3.png new file mode 100644 index 0000000000000000000000000000000000000000..768ac9646024def9b3d08bdfb75502242b7b424e GIT binary patch literal 30174 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 tvpZ1Xg6-- Date: Fri, 24 Mar 2023 14:31:20 +0800 Subject: [PATCH 059/207] Add Junit Test for Parser --- src/main/java/bagpacker/iohandler/Parser.java | 4 +- .../bagpacker/iohandlertest/ParserTest.java | 145 +++++++++++++++++- 2 files changed, 144 insertions(+), 5 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 676a9d6188..fdc652562b 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -63,7 +63,7 @@ public static Command parse() { setFullInput(inputLine); String[] inputStringList = inputLine.trim().split(" "); setInputStringArray(inputStringList); - switch (inputStringList[0]) { + switch (getCommand()) { case "add": return createAddObj(); case "delete": @@ -92,7 +92,7 @@ public static Command parse() { * @return inputLine the String input of the user * @throws EmptyInputException when user input empty line */ - private static String readLine() throws EmptyInputException { + public static String readLine() throws EmptyInputException { String inputLine; Scanner in = new Scanner(System.in); inputLine = in.nextLine().trim(); diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index 2f28ce9495..88a22b6b36 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -1,14 +1,153 @@ package bagpacker.iohandlertest; +import bagpacker.commands.AddCommand; +import bagpacker.commands.ByeCommand; +import bagpacker.commands.DeleteCommand; +import bagpacker.commands.HelpCommand; +import bagpacker.commands.IncorrectCommand; +import bagpacker.commands.ListCommand; +import bagpacker.commands.PackCommand; +import bagpacker.commands.UnpackCommand; +import bagpacker.exception.EmptyInputException; +import bagpacker.exception.InvalidIndexException; +import bagpacker.exception.InvalidVariablesException; +import bagpacker.iohandler.Parser; +import bagpacker.packingfunc.PackingList; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * ParserTest to test Parser Class */ public class ParserTest { @Test - public void sampleTest() { - assertTrue(true); + public void fullInputTest() { + String userInput = " add this item "; + InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inStream); + Parser.parse(); + assertEquals(userInput.trim(), Parser.getFullInput()); + } + + @Test + public void addCommandTest() { + String userInput = " add this item "; + InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inStream); + assertEquals(AddCommand.class, Parser.parse().getClass()); + } + + @Test + public void emptyInputTest() { + String userInput = " "; + InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inStream); + Exception exception = assertThrows(EmptyInputException.class, Parser::readLine); + assertEquals(EmptyInputException.class, exception.getClass()); + } + + @Test + public void addVariableTest() throws InvalidIndexException, InvalidVariablesException { + String userInput = " add this item 1 "; + InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inStream); + Parser.parse(); + assertEquals("this item 1", Parser.getVariable(Parser.getCommand())); } + @Test + public void deleteCommandTest() { + String userInput1 = " add this item "; + String userInput2 = " delete 1 "; + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + PackingList dummyPackingList = new PackingList(); + Parser.parse().execute(dummyPackingList); + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + assertEquals(DeleteCommand.class, Parser.parse().getClass()); + } + + @Test + public void packCommandTest() { + String userInput1 = " add this item "; + String userInput2 = " pack 1 "; + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + PackingList dummyPackingList = new PackingList(); + Parser.parse().execute(dummyPackingList); + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + assertEquals(PackCommand.class, Parser.parse().getClass()); + } + + @Test + public void unpackCommandTest() { + String userInput1 = " add this item "; + String userInput2 = " pack 1 "; + String userInput3 = " Unpack 1 "; + PackingList dummyPackingList = new PackingList(); + + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + Parser.parse().execute(dummyPackingList); + + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + Parser.parse().execute(dummyPackingList); + + inStream = new ByteArrayInputStream(userInput3.getBytes()); + System.setIn(inStream); + assertEquals(UnpackCommand.class, Parser.parse().getClass()); + } + + @Test + public void listCommandTest() { + String userInput1 = " add this item "; + String userInput2 = " lIST "; + PackingList dummyPackingList = new PackingList(); + + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + Parser.parse().execute(dummyPackingList); + + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + + assertEquals(ListCommand.class, Parser.parse().getClass()); + } + + @Test + public void helpCommandTest() { + String userInput1 = " HelP "; + + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + + assertEquals(HelpCommand.class, Parser.parse().getClass()); + } + + @Test + public void byeCommandTest() { + String userInput1 = " byE "; + + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + + assertEquals(ByeCommand.class, Parser.parse().getClass()); + } + + @Test + public void invalidCommandTest() { + String userInput1 = " thisIsNOTaVALID command "; + + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + + assertEquals(IncorrectCommand.class, Parser.parse().getClass()); + } } From 366b0b0c8d75c94807e5d0a1f401df06e3449094 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Wed, 29 Mar 2023 20:07:10 +0800 Subject: [PATCH 060/207] Enhance Item class to support quantities (v2) Enhance AddCommand, PackCommand, and UnpackCommand to support improved Item class (v2) Enhance Parser to support new input format for add, pack, and unpack (v2) Update CommandsTest to support new input formats (v2) --- .../java/bagpacker/commands/AddCommand.java | 2 +- .../java/bagpacker/commands/ByeCommand.java | 3 +- src/main/java/bagpacker/commands/Command.java | 2 +- .../bagpacker/commands/DeleteListCommand.java | 5 +- .../bagpacker/commands/IncorrectCommand.java | 1 + .../java/bagpacker/commands/ListCommand.java | 18 +++--- .../java/bagpacker/commands/PackCommand.java | 10 ++-- .../bagpacker/commands/UnpackCommand.java | 8 ++- .../exception/InvalidIndexException.java | 3 +- .../exception/InvalidVariablesException.java | 3 +- src/main/java/bagpacker/iohandler/Parser.java | 58 ++++++++++++++----- .../java/bagpacker/iohandler/Storage.java | 29 +++++----- src/main/java/bagpacker/iohandler/Ui.java | 11 +++- src/main/java/bagpacker/packingfunc/Item.java | 54 ++++++++++------- .../bagpacker/packingfunc/PackingList.java | 12 ++-- .../packingfunctest/CommandsTest.java | 4 +- 16 files changed, 137 insertions(+), 86 deletions(-) diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index 3e73fc1e84..1042555f35 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -7,7 +7,7 @@ public class AddCommand extends Command { public static final String MSG_SUCCESS_ADD = "New item added: %s"; public static final String HELP_MSG = "add : Adds an item to the packing list.\n" + - "\tExample: add toothbrush"; + "\tExample: add toothbrush"; private final Item item; diff --git a/src/main/java/bagpacker/commands/ByeCommand.java b/src/main/java/bagpacker/commands/ByeCommand.java index 1da5969222..b5616f236e 100644 --- a/src/main/java/bagpacker/commands/ByeCommand.java +++ b/src/main/java/bagpacker/commands/ByeCommand.java @@ -9,7 +9,8 @@ public class ByeCommand extends Command { public static boolean isBagPackerRunning = true; public static final String HELP_MSG = "bye : Stops the BagPacker Application\n" + "\tExample: bye"; - public void execute (PackingList packingList) { + + public void execute(PackingList packingList) { this.isBagPackerRunning = false; } } diff --git a/src/main/java/bagpacker/commands/Command.java b/src/main/java/bagpacker/commands/Command.java index b3ce81ba9e..36392ef0e0 100644 --- a/src/main/java/bagpacker/commands/Command.java +++ b/src/main/java/bagpacker/commands/Command.java @@ -43,7 +43,7 @@ protected Item getTargetItem() throws IndexOutOfBoundsException { * * @param packingList used to execute the command */ - public void execute (PackingList packingList) { + public void execute(PackingList packingList) { } } diff --git a/src/main/java/bagpacker/commands/DeleteListCommand.java b/src/main/java/bagpacker/commands/DeleteListCommand.java index ea4ea801c8..02df4ef368 100644 --- a/src/main/java/bagpacker/commands/DeleteListCommand.java +++ b/src/main/java/bagpacker/commands/DeleteListCommand.java @@ -8,13 +8,12 @@ public class DeleteListCommand extends Command { public static final String MSG_SUCCESS_DELETE_LIST = "list deleted"; + @Override public void execute(PackingList packingList) { - ArrayList< Item > emptyList = new ArrayList<>(); + ArrayList emptyList = new ArrayList<>(); packingList.setItemList(emptyList); Ui.printToUser(String.format(MSG_SUCCESS_DELETE_LIST)); } - - } diff --git a/src/main/java/bagpacker/commands/IncorrectCommand.java b/src/main/java/bagpacker/commands/IncorrectCommand.java index 4932cb1c29..038cec642a 100644 --- a/src/main/java/bagpacker/commands/IncorrectCommand.java +++ b/src/main/java/bagpacker/commands/IncorrectCommand.java @@ -6,6 +6,7 @@ public class IncorrectCommand extends Command { private final String errorType; private final String helpMessage; + public IncorrectCommand(String errorType, String helpMessage) { this.helpMessage = helpMessage; this.errorType = errorType; diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index 279520a779..12cdcba05d 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -19,14 +19,16 @@ public void execute(PackingList packingList) { System.out.println("____________________________________________________________"); System.out.println("Here are the items in your list"); for (int i = 0; i < packingList.size(); i++) { - String isItemPacked; - if (packingList.get(i).getIsPacked()) { - isItemPacked = "X"; - } else { - isItemPacked = " "; - } - String itemName = packingList.get(i).getItemName(); - System.out.println((i + 1) + ". [" + isItemPacked + "] " + itemName); + // String isItemPacked; + // if (packingList.get(i).getIsPacked()) { + // isItemPacked = "X"; + // } else { + // isItemPacked = " "; + // } + // String itemName = packingList.get(i).getItemName(); + // System.out.println((i + 1) + ". [" + isItemPacked + "] " + itemName); + System.out.print((i + 1) + ". "); + System.out.println(PackingList.get(i)); } System.out.println("____________________________________________________________"); } diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index fb7b0c8295..5c8f69b6b6 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -7,14 +7,16 @@ public class PackCommand extends Command { public static final String MSG_SUCCESS_PACK = "Item packed: %s"; - public static final String HELP_MSG= "pack : Marks an item as packed in the packing list.\n" + + public static final String HELP_MSG = "pack : Marks an item as packed in the packing list.\n" + "\tExample: pack 2 of 3\n" + "\tMeaning: packs 2 quantities of the third item in the packing list"; + private static int packQuantity; - public PackCommand(int targetIndex) { + public PackCommand(int quantity, int targetIndex) { super(targetIndex); - assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): + packQuantity = quantity; + assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : "Pack Command Target index is out of bounds"; } @@ -22,7 +24,7 @@ public PackCommand(int targetIndex) { public void execute(PackingList packingList) { this.packingList = packingList; final Item item = getTargetItem(); - packingList.packItem(item); + packingList.packItem(item, packQuantity); Ui.printToUser(String.format(MSG_SUCCESS_PACK, item)); } diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index 5e35bf08c7..c2197a734c 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -11,10 +11,12 @@ public class UnpackCommand extends Command { "\tExample: unpack 1 of 2\n" + "\tMeaning: unpacks 1 quantity of the second item in the packing list"; + private static int unpackQuantity; - public UnpackCommand(int targetIndex) { + public UnpackCommand(int quantity, int targetIndex) { super(targetIndex); - assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()): + unpackQuantity = quantity; + assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : "Unpack Command Target index is out of bounds"; } @@ -22,7 +24,7 @@ public UnpackCommand(int targetIndex) { public void execute(PackingList packingList) { this.packingList = packingList; final Item item = getTargetItem(); - packingList.unpackItem(item); + packingList.unpackItem(item, unpackQuantity); Ui.printToUser(String.format(MSG_SUCCESS_UNPACK, item)); } diff --git a/src/main/java/bagpacker/exception/InvalidIndexException.java b/src/main/java/bagpacker/exception/InvalidIndexException.java index c67a8009b6..1a96453b70 100644 --- a/src/main/java/bagpacker/exception/InvalidIndexException.java +++ b/src/main/java/bagpacker/exception/InvalidIndexException.java @@ -1,6 +1,5 @@ package bagpacker.exception; - -public class InvalidIndexException extends Exception{ +public class InvalidIndexException extends Exception { } diff --git a/src/main/java/bagpacker/exception/InvalidVariablesException.java b/src/main/java/bagpacker/exception/InvalidVariablesException.java index 428e531525..173a93677e 100644 --- a/src/main/java/bagpacker/exception/InvalidVariablesException.java +++ b/src/main/java/bagpacker/exception/InvalidVariablesException.java @@ -1,6 +1,5 @@ package bagpacker.exception; - -public class InvalidVariablesException extends Exception{ +public class InvalidVariablesException extends Exception { } diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index fdc652562b..33d930fe29 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -85,6 +85,7 @@ public static Command parse() { "input 'help' to receive all valid commands"); } } + /** * Reads and returns the full user input from the command line interface * - trims the leading and trailing white spaces @@ -155,6 +156,7 @@ public static String getItemIndex() throws InvalidIndexException { } return inputIndex; } + /** * Returns a string which represents the relevant variable depending on the command * - "add" will return the item name @@ -199,17 +201,27 @@ public static String getItemDescrip() { */ public static Command createAddObj() { try { - String itemName = getVariable("add"); - return new AddCommand(new Item(itemName)); + String[] quantityAndDescription = getAddVariables(); + int itemQuantity = Integer.parseInt(quantityAndDescription[0]); + String itemDescription = quantityAndDescription[1]; + if (itemDescription == null) { + throw new InvalidVariablesException(); + } + return new AddCommand(new Item(itemQuantity, itemDescription)); } catch (InvalidVariablesException e) { return new IncorrectCommand("Invalid Item Name", "try to input a name (word(s)) to be added into the list"); - } catch (InvalidIndexException e) { + } catch (NumberFormatException e) { return new IncorrectCommand("Invalid Item Index", "try to input an integer number between 1 and " + PackingList.getItemList().size()); } } + public static String[] getAddVariables() { + String[] inputStringList = fullInput.trim().split(" ", 2); + return inputStringList[1].trim().split("\\s+/of\\s+"); + } + /** * Attempts to create DeleteCommand object to be executed where it is called from * @@ -234,6 +246,19 @@ public static Command createDeleteObj() { } } + public static int[] getQuantityAndIndex() throws InvalidVariablesException, InvalidIndexException { + int[] itemQuantityAndIndex = new int[2]; + try { + itemQuantityAndIndex[0] = Integer.parseInt(inputStringArray.get(1).trim()); + itemQuantityAndIndex[1] = Integer.parseInt(inputStringArray.get(3).trim()); + } catch (IndexOutOfBoundsException e) { + throw new InvalidVariablesException(); + } catch (NumberFormatException e) { + throw new InvalidIndexException(); + } + return itemQuantityAndIndex; + } + /** * Attempts to create PackCommand object to be executed where it is called from * @@ -242,12 +267,11 @@ public static Command createDeleteObj() { */ public static Command createPackObj() { try { - String itemIndex = getVariable("pack"); - return new PackCommand(Integer.parseInt(itemIndex)); - } catch (InvalidVariablesException e) { - return new IncorrectCommand("Invalid Item Name", - "try to input a name (word(s)) to be added into the list"); - } catch (InvalidIndexException e) { + String[] quantityAndIndex = getPackVariables(); + int itemQuantity = Integer.parseInt(quantityAndIndex[0]); + int itemIndex = Integer.parseInt(quantityAndIndex[1]); + return new PackCommand(itemQuantity, itemIndex); + } catch (NumberFormatException e) { if (PackingList.getItemList().size() == 0) { return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to pack"); @@ -258,6 +282,11 @@ public static Command createPackObj() { } } + public static String[] getPackVariables() { + String[] inputStringList = fullInput.trim().split(" ", 2); + return inputStringList[1].trim().split("\\s+/of\\s+"); + } + /** * Attempts to create UnpackCommand object to be executed where it is called from @@ -267,12 +296,11 @@ public static Command createPackObj() { */ public static Command createUnpackObj() { try { - String itemIndex = getVariable("unpack"); - return new UnpackCommand(Integer.parseInt(itemIndex)); - } catch (InvalidVariablesException e) { - return new IncorrectCommand("Invalid Item Name", - "try to input a name (word(s)) to be added into the list"); - } catch (InvalidIndexException e) { + String[] quantityAndIndex = getPackVariables(); + int itemQuantity = Integer.parseInt(quantityAndIndex[0]); + int itemIndex = Integer.parseInt(quantityAndIndex[1]); + return new UnpackCommand(itemQuantity, itemIndex); + } catch (NumberFormatException e) { if (PackingList.getItemList().size() == 0) { return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to unpack"); diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java index 212fefb558..a8702dd846 100644 --- a/src/main/java/bagpacker/iohandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -3,12 +3,12 @@ import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; -import java.io.File; -import java.io.FileNotFoundException; +//import java.io.File; +//import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; -import java.util.Scanner; +//import java.util.Scanner; /** * Storage class contains methods to save and retrieve saved packing list in txt file @@ -17,17 +17,18 @@ public class Storage { public static ArrayList packingList = new ArrayList<>(); private static final String FILE_PATH = "packingList.txt"; - public static void load() throws FileNotFoundException { - Scanner reader = new Scanner(new File(FILE_PATH)); - String line; - while (reader.hasNext()) { - line = reader.nextLine(); - boolean isPacked = line.charAt(1) == 'X'; - String itemDesc = line.substring(4); - Item item = new Item(itemDesc, isPacked); - PackingList.getItemList().add(item); - } - } + + // public static void load() throws FileNotFoundException { + // Scanner reader = new Scanner(new File(FILE_PATH)); + // String line; + // while (reader.hasNext()) { + // line = reader.nextLine(); + // boolean isPacked = line.charAt(1) == 'X'; + // String itemDesc = line.substring(4); + // Item item = new Item(itemDesc, isPacked); + // PackingList.getItemList().add(item); + // } + // } public static void save() { try { diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index 4b77544a14..80d720b4b4 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -19,25 +19,29 @@ public class Ui { + "|____/ \\__,_|\\__, |_| \\__,_|\\___|_|\\_\\___|_|\n" + " __/ |\n" + " |___/\n"; + public static void printErrorLine() { System.out.println("/////////////////////////////////////////////////////////////"); } + public static void printLine() { System.out.println("____________________________________________________________"); } + /** * Prints initialising Message */ - public static void initialMessage(){ + public static void initialMessage() { printLine(); System.out.println("Hi this is,\n" + logo); System.out.println("Enter \"help\" to find out how to use BagPacker"); printLine(); } + /** * Prints goodbye Message */ - public static void goodbyeMessage(){ + public static void goodbyeMessage() { printLine(); System.out.println("Bye thanks for using,\n" + logo); printLine(); @@ -46,7 +50,7 @@ public static void goodbyeMessage(){ /** * Prints Error Message with the type of error and a helping message * - * @param errorType the type of error (e.g. invalid integer input) + * @param errorType the type of error (e.g. invalid integer input) * @param helpMessage a message to help the user (e.g. try to input a whole number digit) */ public static void errorMessage(String errorType, String helpMessage) { @@ -73,6 +77,7 @@ public static void helpMessage() { /** * Prints messages(s) to the user + * * @param message */ public static void printToUser(String... message) { diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index 2249ccc272..3936ef77e6 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -1,41 +1,51 @@ package bagpacker.packingfunc; + /** * Item class used to store information about item * Items to be packed can be saved in PackingList class */ public class Item { - private String itemName; - private boolean isPacked; - private String packIcon = " "; - public Item(String description) { - this.itemName = description; - isPacked = false; - } - public Item(String description, boolean isPacked) { + private final String itemName; + + private int packedQuantity; + private final int totalQuantity; + + public Item(int quantity, String description) { this.itemName = description; - this.isPacked = isPacked; - } - public void setPackIcon() { - if (this.isPacked) { - this.packIcon = "X"; - } else { - this.packIcon = " "; - } + packedQuantity = 0; + this.totalQuantity = quantity; } + // public Item(String description, boolean isPacked) { + // this.itemName = description; + // this.isPacked = isPacked; + // } + + // public void setPackIcon() { + // if (this.isPacked) { + // this.packIcon = "X"; + // } else { + // this.packIcon = " "; + // } + // } + public String getItemName() { return itemName; } - public boolean getIsPacked() { - return isPacked; + // public boolean getIsPacked() { + // return isPacked; + // } + + public void setPacked(int quantity) { + this.packedQuantity += quantity; } - public void setPacked(boolean packed) { - isPacked = packed; - setPackIcon(); + + public void setUnpacked(int quantity) { + this.packedQuantity -= quantity; } public String toString() { - return "[" + this.packIcon + "] " + this.getItemName(); + return "[" + packedQuantity + "/" + totalQuantity + "] " + this.getItemName(); } } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index fc9949c2bb..a2eec82c78 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -11,6 +11,7 @@ public class PackingList { private static ArrayList itemList = new ArrayList<>(); private static int targetIndex = -1; + public static void setItemList(ArrayList itemList) { PackingList.itemList = itemList; } @@ -23,6 +24,7 @@ public static void setItemList(ArrayList itemList) { public static ArrayList getItemList() { return itemList; } + /** * Adds an item to the list. */ @@ -40,15 +42,15 @@ public void deleteItem(Item toDelete) { /** * Marks an item as packed in the list. */ - public void packItem(Item toPack) { - toPack.setPacked(true); + public void packItem(Item toPack, int quantity) { + toPack.setPacked(quantity); } /** * Marks an item as unpacked in the list. */ - public void unpackItem(Item toPack) { - toPack.setPacked(false); + public void unpackItem(Item toPack, int quantity) { + toPack.setUnpacked(quantity); } public static Item get(int targetIndex) { @@ -58,7 +60,7 @@ public static Item get(int targetIndex) { /** * Returns size of packing list */ - public int size(){ + public int size() { return itemList.size(); } diff --git a/src/test/java/bagpacker/packingfunctest/CommandsTest.java b/src/test/java/bagpacker/packingfunctest/CommandsTest.java index 88ef7ab2f7..d29454980d 100644 --- a/src/test/java/bagpacker/packingfunctest/CommandsTest.java +++ b/src/test/java/bagpacker/packingfunctest/CommandsTest.java @@ -20,7 +20,7 @@ public void sampleTest() { @Test public void testAddCommand() { PackingList packingList = new PackingList(); - Item item = new Item("toothbrush"); + Item item = new Item(1, "toothbrush"); Command addCommand = new AddCommand(item); addCommand.execute(packingList); @@ -29,7 +29,7 @@ public void testAddCommand() { Assertions.assertNotEquals("tooth", packingList.get(0).getItemName()); // Expect second index item in the packing list to be toothpaste - Item itemTwo = new Item("toothpaste"); + Item itemTwo = new Item(1, "toothpaste"); addCommand = new AddCommand(itemTwo); addCommand.execute(packingList); From 2c1dc84254b670183cd4bbb2ac4b5983403646e0 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 30 Mar 2023 13:42:20 +0800 Subject: [PATCH 061/207] Add Jar file release v1.0 --- META-INF/MANIFEST.MF | 3 +++ src/main/java/bagpacker/iohandler/Parser.java | 7 +++---- 2 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 META-INF/MANIFEST.MF diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..9edbd3663c --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: bagpacker.BagPacker + diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index fdc652562b..b7f6c15705 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -61,7 +61,7 @@ public static Command parse() { } } setFullInput(inputLine); - String[] inputStringList = inputLine.trim().split(" "); + String[] inputStringList = inputLine.trim().split("\\s+"); setInputStringArray(inputStringList); switch (getCommand()) { case "add": @@ -124,7 +124,7 @@ public static String getItemName() throws InvalidVariablesException { } try { int itemIndStart = fullInput.indexOf(" ") + 1; - itemName = fullInput.substring(itemIndStart); + itemName = fullInput.substring(itemIndStart).trim(); } catch (IndexOutOfBoundsException e) { throw new InvalidVariablesException(); } @@ -144,8 +144,7 @@ public static String getItemIndex() throws InvalidIndexException { throw new InvalidIndexException(); } try { - int itemIndStart = fullInput.indexOf(" ") + 1; - inputIndex = fullInput.substring(itemIndStart); + inputIndex = inputStringArray.get(1); itemIndex = Integer.parseInt(inputIndex); if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) { throw new InvalidIndexException(); From eacc6ca4add6ff8a6c7ddebd2555f646cd0e019f Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 30 Mar 2023 16:29:37 +0800 Subject: [PATCH 062/207] Update help message to fit v2.0 --- src/main/java/bagpacker/commands/AddCommand.java | 3 ++- src/main/java/bagpacker/commands/PackCommand.java | 2 +- src/main/java/bagpacker/commands/UnpackCommand.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index 1042555f35..60c6a9fa4d 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -7,7 +7,8 @@ public class AddCommand extends Command { public static final String MSG_SUCCESS_ADD = "New item added: %s"; public static final String HELP_MSG = "add : Adds an item to the packing list.\n" + - "\tExample: add toothbrush"; + "\tExample: add 3 /of toothbrush" + + "\tMeaning: quantity of 3 toothbrushes to be packed"; private final Item item; diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 5c8f69b6b6..6f6e18fb07 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -8,7 +8,7 @@ public class PackCommand extends Command { public static final String MSG_SUCCESS_PACK = "Item packed: %s"; public static final String HELP_MSG = "pack : Marks an item as packed in the packing list.\n" + - "\tExample: pack 2 of 3\n" + + "\tExample: pack 2 /of 3\n" + "\tMeaning: packs 2 quantities of the third item in the packing list"; private static int packQuantity; diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index c2197a734c..93d29c329a 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -8,7 +8,7 @@ public class UnpackCommand extends Command { public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; public static final String HELP_MSG = "unpack : Marks an item as unpacked in the packing list.\n" + - "\tExample: unpack 1 of 2\n" + + "\tExample: unpack 1 /of 2\n" + "\tMeaning: unpacks 1 quantity of the second item in the packing list"; private static int unpackQuantity; From 23f9af918b35a08887aaad2d77ac7a3a9a713412 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 30 Mar 2023 16:43:17 +0800 Subject: [PATCH 063/207] Refactor the help message --- src/main/java/bagpacker/commands/AddCommand.java | 6 +++--- src/main/java/bagpacker/commands/DeleteCommand.java | 3 ++- src/main/java/bagpacker/commands/ListCommand.java | 2 +- src/main/java/bagpacker/commands/PackCommand.java | 4 ++-- src/main/java/bagpacker/commands/UnpackCommand.java | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index 60c6a9fa4d..67f4a60e09 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -6,9 +6,9 @@ public class AddCommand extends Command { public static final String MSG_SUCCESS_ADD = "New item added: %s"; - public static final String HELP_MSG = "add : Adds an item to the packing list.\n" + - "\tExample: add 3 /of toothbrush" + - "\tMeaning: quantity of 3 toothbrushes to be packed"; + public static final String HELP_MSG = "add : Adds quantity and name of item to the packing list.\n" + + "\tExample: add 3 /of toothbrush\n" + + "\tMeaning: add quantity of 3 toothbrushes to the packing list"; private final Item item; diff --git a/src/main/java/bagpacker/commands/DeleteCommand.java b/src/main/java/bagpacker/commands/DeleteCommand.java index abd800d69f..8a5cbd8db8 100644 --- a/src/main/java/bagpacker/commands/DeleteCommand.java +++ b/src/main/java/bagpacker/commands/DeleteCommand.java @@ -10,7 +10,8 @@ public class DeleteCommand extends Command { public static final String MSG_SUCCESS_DELETE = "%s removed from the list"; public static final String HELP_MSG = "delete : Deletes an item from the packing list.\n" + - "\tExample: delete 1"; + "\tExample: delete 1\n" + + "\tMeaning: removes the first item in the packing list"; public DeleteCommand(int targetIndex) { diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index 12cdcba05d..3f979b591c 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -3,7 +3,7 @@ import bagpacker.packingfunc.PackingList; public class ListCommand extends Command { - public static final String HELP_MSG = "list : List all items in packing list.\n" + + public static final String HELP_MSG = "list : List all items and their total quantities packed in packing list.\n" + "\tExample: list"; @Override diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 6f6e18fb07..2db2ba0488 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -7,9 +7,9 @@ public class PackCommand extends Command { public static final String MSG_SUCCESS_PACK = "Item packed: %s"; - public static final String HELP_MSG = "pack : Marks an item as packed in the packing list.\n" + + public static final String HELP_MSG = "pack : Adds to the current quantity of items packed in the packing list.\n" + "\tExample: pack 2 /of 3\n" + - "\tMeaning: packs 2 quantities of the third item in the packing list"; + "\tMeaning: packs 2 more quantities of the third item in the packing list"; private static int packQuantity; diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index 93d29c329a..4f75ffcab7 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -7,7 +7,7 @@ public class UnpackCommand extends Command { public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; - public static final String HELP_MSG = "unpack : Marks an item as unpacked in the packing list.\n" + + public static final String HELP_MSG = "unpack : Deducts from the current quantity of items packed in the packing list.\n" + "\tExample: unpack 1 /of 2\n" + "\tMeaning: unpacks 1 quantity of the second item in the packing list"; From e8762224acebb71d15b10bfab1deb922790dc022 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 30 Mar 2023 21:29:25 +0800 Subject: [PATCH 064/207] Handle error when trying to pack/unpack an out of bounds packing list index --- src/main/java/bagpacker/iohandler/Parser.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 71b4152d26..1d747f8235 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -270,20 +270,24 @@ public static Command createPackObj() { int itemQuantity = Integer.parseInt(quantityAndIndex[0]); int itemIndex = Integer.parseInt(quantityAndIndex[1]); return new PackCommand(itemQuantity, itemIndex); - } catch (NumberFormatException e) { + } catch (NumberFormatException | InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to pack"); } else { return new IncorrectCommand("Invalid Item Index", - "Try to input an integer number between 1 and " + PackingList.getItemList().size()); + "Try to input an item index number between 1 and " + PackingList.getItemList().size()); } } } - public static String[] getPackVariables() { + public static String[] getPackVariables() throws InvalidIndexException { String[] inputStringList = fullInput.trim().split(" ", 2); - return inputStringList[1].trim().split("\\s+/of\\s+"); + String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); + if(Integer.parseInt(inputVariables[1])<1 | Integer.parseInt(inputVariables[1])> PackingList.getItemList().size()){ + throw new InvalidIndexException(); + } + return inputVariables; } @@ -299,13 +303,13 @@ public static Command createUnpackObj() { int itemQuantity = Integer.parseInt(quantityAndIndex[0]); int itemIndex = Integer.parseInt(quantityAndIndex[1]); return new UnpackCommand(itemQuantity, itemIndex); - } catch (NumberFormatException e) { + } catch (NumberFormatException | InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to unpack"); } else { return new IncorrectCommand("Invalid Item Index", - "Try to input an integer number between 1 and " + PackingList.getItemList().size()); + "Try to input an item index number between 1 and " + PackingList.getItemList().size()); } } } From 1cf4d3a590555a650b4bab2fa63d944c5d48315f Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 30 Mar 2023 22:00:22 +0800 Subject: [PATCH 065/207] Fix error message when add input quantities are incorrect --- src/main/java/bagpacker/iohandler/Parser.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 1d747f8235..47340aa683 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -208,17 +208,21 @@ public static Command createAddObj() { } return new AddCommand(new Item(itemQuantity, itemDescription)); } catch (InvalidVariablesException e) { - return new IncorrectCommand("Invalid Item Name", - "try to input a name (word(s)) to be added into the list"); + return new IncorrectCommand("Invalid input format", + AddCommand.HELP_MSG); } catch (NumberFormatException e) { return new IncorrectCommand("Invalid Item Index", - "try to input an integer number between 1 and " + PackingList.getItemList().size()); + "for item quantity, try to input a positive integer number"); } } - public static String[] getAddVariables() { + public static String[] getAddVariables() throws InvalidVariablesException{ String[] inputStringList = fullInput.trim().split(" ", 2); - return inputStringList[1].trim().split("\\s+/of\\s+"); + String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); + if(inputVariables.length != 2){ + throw new InvalidVariablesException(); + } + return inputVariables; } /** From a6ef4c31ac50468a9a367a9699c2fd0caea68ddb Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 30 Mar 2023 22:18:37 +0800 Subject: [PATCH 066/207] Handle add error where user does not input enough variables --- src/main/java/bagpacker/iohandler/Parser.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 47340aa683..ad8a3592ec 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -206,12 +206,15 @@ public static Command createAddObj() { if (itemDescription == null) { throw new InvalidVariablesException(); } + if (itemQuantity < 1){ + throw new InvalidIndexException(); + } return new AddCommand(new Item(itemQuantity, itemDescription)); - } catch (InvalidVariablesException e) { + } catch (InvalidVariablesException | ArrayIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid input format", AddCommand.HELP_MSG); - } catch (NumberFormatException e) { - return new IncorrectCommand("Invalid Item Index", + } catch (NumberFormatException | InvalidIndexException e) { + return new IncorrectCommand("Invalid Item Quantity", "for item quantity, try to input a positive integer number"); } } @@ -281,7 +284,7 @@ public static Command createPackObj() { } else { return new IncorrectCommand("Invalid Item Index", "Try to input an item index number between 1 and " + PackingList.getItemList().size()); - } + } } } From faf3a74f7b51a211f3ff0265e0801a56ca0000c3 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 30 Mar 2023 22:22:47 +0800 Subject: [PATCH 067/207] Handle error for pack and unpack for missing or wrong input variables --- src/main/java/bagpacker/iohandler/Parser.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index ad8a3592ec..2320d9ed92 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -196,7 +196,7 @@ public static String getItemDescrip() { * Attempts to create AddCommand object to be executed where it is called from * * @return AddCommand the command to be executed to add an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createAddObj() { try { @@ -206,7 +206,7 @@ public static Command createAddObj() { if (itemDescription == null) { throw new InvalidVariablesException(); } - if (itemQuantity < 1){ + if (itemQuantity < 1) { throw new InvalidIndexException(); } return new AddCommand(new Item(itemQuantity, itemDescription)); @@ -219,10 +219,10 @@ public static Command createAddObj() { } } - public static String[] getAddVariables() throws InvalidVariablesException{ + public static String[] getAddVariables() throws InvalidVariablesException { String[] inputStringList = fullInput.trim().split(" ", 2); String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); - if(inputVariables.length != 2){ + if (inputVariables.length != 2) { throw new InvalidVariablesException(); } return inputVariables; @@ -232,7 +232,7 @@ public static String[] getAddVariables() throws InvalidVariablesException{ * Attempts to create DeleteCommand object to be executed where it is called from * * @return DeleteCommand the command to be executed to delete an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createDeleteObj() { try { @@ -269,7 +269,7 @@ public static int[] getQuantityAndIndex() throws InvalidVariablesException, Inva * Attempts to create PackCommand object to be executed where it is called from * * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createPackObj() { try { @@ -277,21 +277,24 @@ public static Command createPackObj() { int itemQuantity = Integer.parseInt(quantityAndIndex[0]); int itemIndex = Integer.parseInt(quantityAndIndex[1]); return new PackCommand(itemQuantity, itemIndex); - } catch (NumberFormatException | InvalidIndexException e) { + } catch (NumberFormatException | InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to pack"); } else { return new IncorrectCommand("Invalid Item Index", "Try to input an item index number between 1 and " + PackingList.getItemList().size()); - } + } + } catch (ArrayIndexOutOfBoundsException e) { + return new IncorrectCommand("Invalid Input Variables", + PackCommand.HELP_MSG); } } public static String[] getPackVariables() throws InvalidIndexException { String[] inputStringList = fullInput.trim().split(" ", 2); String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); - if(Integer.parseInt(inputVariables[1])<1 | Integer.parseInt(inputVariables[1])> PackingList.getItemList().size()){ + if (Integer.parseInt(inputVariables[1]) < 1 | Integer.parseInt(inputVariables[1]) > PackingList.getItemList().size()) { throw new InvalidIndexException(); } return inputVariables; @@ -302,7 +305,7 @@ public static String[] getPackVariables() throws InvalidIndexException { * Attempts to create UnpackCommand object to be executed where it is called from * * @return UnpackCommand the command to be executed to unpack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createUnpackObj() { try { @@ -310,7 +313,7 @@ public static Command createUnpackObj() { int itemQuantity = Integer.parseInt(quantityAndIndex[0]); int itemIndex = Integer.parseInt(quantityAndIndex[1]); return new UnpackCommand(itemQuantity, itemIndex); - } catch (NumberFormatException | InvalidIndexException e) { + } catch (NumberFormatException | InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to unpack"); @@ -318,6 +321,9 @@ public static Command createUnpackObj() { return new IncorrectCommand("Invalid Item Index", "Try to input an item index number between 1 and " + PackingList.getItemList().size()); } + } catch (ArrayIndexOutOfBoundsException e) { + return new IncorrectCommand("Invalid Input Variables", + UnpackCommand.HELP_MSG); } } From 1389bf990c1324ae74a77cb3465b5788df873917 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Fri, 31 Mar 2023 00:42:37 +0800 Subject: [PATCH 068/207] Update error messages for creating unpack command --- src/main/java/bagpacker/commands/UnpackCommand.java | 3 ++- src/main/java/bagpacker/iohandler/Parser.java | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index 4f75ffcab7..e5fc6f1a65 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -7,7 +7,8 @@ public class UnpackCommand extends Command { public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; - public static final String HELP_MSG = "unpack : Deducts from the current quantity of items packed in the packing list.\n" + + public static final String HELP_MSG = + "unpack : Deducts from the current quantity of items packed in the packing list.\n" + "\tExample: unpack 1 /of 2\n" + "\tMeaning: unpacks 1 quantity of the second item in the packing list"; diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 2320d9ed92..afeb183165 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -196,7 +196,7 @@ public static String getItemDescrip() { * Attempts to create AddCommand object to be executed where it is called from * * @return AddCommand the command to be executed to add an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createAddObj() { try { @@ -232,7 +232,7 @@ public static String[] getAddVariables() throws InvalidVariablesException { * Attempts to create DeleteCommand object to be executed where it is called from * * @return DeleteCommand the command to be executed to delete an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createDeleteObj() { try { @@ -269,7 +269,7 @@ public static int[] getQuantityAndIndex() throws InvalidVariablesException, Inva * Attempts to create PackCommand object to be executed where it is called from * * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createPackObj() { try { @@ -294,7 +294,8 @@ public static Command createPackObj() { public static String[] getPackVariables() throws InvalidIndexException { String[] inputStringList = fullInput.trim().split(" ", 2); String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); - if (Integer.parseInt(inputVariables[1]) < 1 | Integer.parseInt(inputVariables[1]) > PackingList.getItemList().size()) { + if (Integer.parseInt(inputVariables[1]) < 1 | Integer.parseInt(inputVariables[1]) + > PackingList.getItemList().size()) { throw new InvalidIndexException(); } return inputVariables; @@ -305,7 +306,7 @@ public static String[] getPackVariables() throws InvalidIndexException { * Attempts to create UnpackCommand object to be executed where it is called from * * @return UnpackCommand the command to be executed to unpack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createUnpackObj() { try { From 1ee47750adb5e2fd0e393bed44c9c83f57ff2f1f Mon Sep 17 00:00:00 2001 From: linuspuah Date: Fri, 31 Mar 2023 01:51:25 +0800 Subject: [PATCH 069/207] Catch invalid packing variable errors --- src/main/java/bagpacker/iohandler/Parser.java | 12 ++++++++++++ src/main/java/bagpacker/packingfunc/Item.java | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index afeb183165..aedb42053d 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -272,10 +272,15 @@ public static int[] getQuantityAndIndex() throws InvalidVariablesException, Inva * an IncorrectCommand is created to be executed */ public static Command createPackObj() { + int quantityNotPacked = 0; try { String[] quantityAndIndex = getPackVariables(); int itemQuantity = Integer.parseInt(quantityAndIndex[0]); int itemIndex = Integer.parseInt(quantityAndIndex[1]); + quantityNotPacked = PackingList.get(itemIndex - 1).getTotalQuantity() - PackingList.get(itemIndex - 1).getPackedQuantity(); + if(itemQuantity < 1 | itemQuantity > quantityNotPacked){ + throw new InvalidVariablesException(); + } return new PackCommand(itemQuantity, itemIndex); } catch (NumberFormatException | InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { @@ -288,6 +293,13 @@ public static Command createPackObj() { } catch (ArrayIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid Input Variables", PackCommand.HELP_MSG); + } catch (InvalidVariablesException e){ + if(quantityNotPacked == 0){ + return new IncorrectCommand("Invalid Pack Usage", + "this item is fully packed"); + } + return new IncorrectCommand("Invalid Input Quantity", + "try to input a quantity between 0 and "+ quantityNotPacked +" to be packed"); } } diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index 3936ef77e6..4c2c0a3891 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -7,7 +7,16 @@ public class Item { private final String itemName; + public int getPackedQuantity() { + return packedQuantity; + } + private int packedQuantity; + + public int getTotalQuantity() { + return totalQuantity; + } + private final int totalQuantity; public Item(int quantity, String description) { From a17a9affc3f35f01b3a380bb67ec6b826395ada8 Mon Sep 17 00:00:00 2001 From: Sophie Date: Fri, 31 Mar 2023 02:13:08 +0800 Subject: [PATCH 070/207] Add error handling for unpack command inputs --- src/main/java/bagpacker/iohandler/Parser.java | 18 +++++++++++++++++- src/main/java/bagpacker/packingfunc/Item.java | 4 +++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 71b4152d26..4b160863d0 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -21,6 +21,8 @@ import java.util.Arrays; import java.util.Scanner; +import static bagpacker.commands.PackCommand.HELP_MSG; + /** * Parser class contains methods to manipulate user input */ @@ -276,7 +278,8 @@ public static Command createPackObj() { "Your packing list is empty, there is nothing to pack"); } else { return new IncorrectCommand("Invalid Item Index", - "Try to input an integer number between 1 and " + PackingList.getItemList().size()); + "Try to input an integer number between 1 and " + PackingList.getItemList().size() + + "\n" + HELP_MSG); } } } @@ -297,7 +300,20 @@ public static Command createUnpackObj() { try { String[] quantityAndIndex = getPackVariables(); int itemQuantity = Integer.parseInt(quantityAndIndex[0]); + if (itemQuantity <= 0) { + return new IncorrectCommand("Invalid Item Quantity", "Your item quantity should " + + "be greater than 0"); + } + int itemIndex = Integer.parseInt(quantityAndIndex[1]); + if (itemIndex > PackingList.getItemList().size()) { + return new IncorrectCommand("Invalid Item Index", + "Try to input an integer number between 1 and " + PackingList.getItemList().size()); + } +// if (itemQuantity > PackingList.get(itemIndex).getTotalQuantity()) { +// return new IncorrectCommand("Invalid Item Quantity", "Your item quantity should " + +// "not exceed total quantity"); +// } return new UnpackCommand(itemQuantity, itemIndex); } catch (NumberFormatException e) { if (PackingList.getItemList().size() == 0) { diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index 3936ef77e6..8bc3c8cc81 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -36,7 +36,9 @@ public String getItemName() { // public boolean getIsPacked() { // return isPacked; // } - + public int getTotalQuantity(){ + return totalQuantity; + } public void setPacked(int quantity) { this.packedQuantity += quantity; } From 42840e8c5e378a6d1ff300facaf3156d2706414b Mon Sep 17 00:00:00 2001 From: Sophie Date: Fri, 31 Mar 2023 02:42:52 +0800 Subject: [PATCH 071/207] Fix style check --- src/main/java/bagpacker/commands/UnpackCommand.java | 3 ++- src/main/java/bagpacker/iohandler/Parser.java | 5 +---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index 4f75ffcab7..ad990eaa87 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -7,7 +7,8 @@ public class UnpackCommand extends Command { public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; - public static final String HELP_MSG = "unpack : Deducts from the current quantity of items packed in the packing list.\n" + + public static final String HELP_MSG = "unpack : Deducts from the current quantity of items packed in the packing " + + "list.\n" + "\tExample: unpack 1 /of 2\n" + "\tMeaning: unpacks 1 quantity of the second item in the packing list"; diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 4b160863d0..1f307d28a6 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -310,10 +310,7 @@ public static Command createUnpackObj() { return new IncorrectCommand("Invalid Item Index", "Try to input an integer number between 1 and " + PackingList.getItemList().size()); } -// if (itemQuantity > PackingList.get(itemIndex).getTotalQuantity()) { -// return new IncorrectCommand("Invalid Item Quantity", "Your item quantity should " + -// "not exceed total quantity"); -// } + return new UnpackCommand(itemQuantity, itemIndex); } catch (NumberFormatException e) { if (PackingList.getItemList().size() == 0) { From 51e0ee60caf1bbf782c00f46f826df3df8689acb Mon Sep 17 00:00:00 2001 From: linuspuah Date: Fri, 31 Mar 2023 06:01:07 +0800 Subject: [PATCH 072/207] Handle invalid unpack variable errors --- src/main/java/bagpacker/iohandler/Parser.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index aedb42053d..f87fa16a29 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -299,7 +299,7 @@ public static Command createPackObj() { "this item is fully packed"); } return new IncorrectCommand("Invalid Input Quantity", - "try to input a quantity between 0 and "+ quantityNotPacked +" to be packed"); + "try to input a quantity between 1 and "+ quantityNotPacked +" to be packed"); } } @@ -321,10 +321,15 @@ public static String[] getPackVariables() throws InvalidIndexException { * an IncorrectCommand is created to be executed */ public static Command createUnpackObj() { + int quantityPacked = 0; try { String[] quantityAndIndex = getPackVariables(); int itemQuantity = Integer.parseInt(quantityAndIndex[0]); int itemIndex = Integer.parseInt(quantityAndIndex[1]); + quantityPacked = PackingList.get(itemIndex - 1).getPackedQuantity(); + if(itemQuantity < 1 | itemQuantity > quantityPacked){ + throw new InvalidVariablesException(); + } return new UnpackCommand(itemQuantity, itemIndex); } catch (NumberFormatException | InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { @@ -337,7 +342,14 @@ public static Command createUnpackObj() { } catch (ArrayIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid Input Variables", UnpackCommand.HELP_MSG); + } catch (InvalidVariablesException e){ + if(quantityPacked == 0){ + return new IncorrectCommand("Invalid Unpack Usage", + "this item is not even packed yet"); } + return new IncorrectCommand("Invalid Input Quantity", + "try to input a quantity between 1 and "+ quantityPacked +" to be packed"); + } } public static Command listCommand() { From 8119c002112752fb0da081d623292334286f3ac5 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Fri, 31 Mar 2023 13:49:12 +0800 Subject: [PATCH 073/207] Add help message for deletelist command --- .../java/bagpacker/commands/DeleteListCommand.java | 4 ++++ src/main/java/bagpacker/commands/UnpackCommand.java | 4 ++-- src/main/java/bagpacker/iohandler/Ui.java | 10 +++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/bagpacker/commands/DeleteListCommand.java b/src/main/java/bagpacker/commands/DeleteListCommand.java index 02df4ef368..3b73fc8eaf 100644 --- a/src/main/java/bagpacker/commands/DeleteListCommand.java +++ b/src/main/java/bagpacker/commands/DeleteListCommand.java @@ -9,6 +9,10 @@ public class DeleteListCommand extends Command { public static final String MSG_SUCCESS_DELETE_LIST = "list deleted"; + public static final String HELP_MSG = + "deletelist : Deletes all items in the packing list.\n" + + "\tExample: deletelist"; + @Override public void execute(PackingList packingList) { ArrayList emptyList = new ArrayList<>(); diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index e5fc6f1a65..617614bc95 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -9,8 +9,8 @@ public class UnpackCommand extends Command { public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; public static final String HELP_MSG = "unpack : Deducts from the current quantity of items packed in the packing list.\n" + - "\tExample: unpack 1 /of 2\n" + - "\tMeaning: unpacks 1 quantity of the second item in the packing list"; + "\tExample: unpack 1 /of 2\n" + + "\tMeaning: unpacks 1 quantity of the second item in the packing list"; private static int unpackQuantity; diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index 80d720b4b4..d91070a534 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -1,11 +1,6 @@ package bagpacker.iohandler; -import bagpacker.commands.AddCommand; -import bagpacker.commands.ByeCommand; -import bagpacker.commands.DeleteCommand; -import bagpacker.commands.ListCommand; -import bagpacker.commands.PackCommand; -import bagpacker.commands.UnpackCommand; +import bagpacker.commands.*; /** * Ui class contains methods to print messages to user interface on Command Line Interface @@ -71,7 +66,8 @@ public static void helpMessage() { System.out.println("3. " + ListCommand.HELP_MSG); System.out.println("4. " + PackCommand.HELP_MSG); System.out.println("5. " + UnpackCommand.HELP_MSG); - System.out.println("6. " + ByeCommand.HELP_MSG); + System.out.println("6. " + DeleteListCommand.HELP_MSG); + System.out.println("7. " + ByeCommand.HELP_MSG); printLine(); } From 84da5266467685244a014619225d8cf9ce8851f2 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Fri, 31 Mar 2023 14:50:13 +0800 Subject: [PATCH 074/207] Add java -jar file --- src/Team_Project_jar/Team_Project.jar | Bin 0 -> 626470 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/Team_Project_jar/Team_Project.jar diff --git a/src/Team_Project_jar/Team_Project.jar b/src/Team_Project_jar/Team_Project.jar new file mode 100644 index 0000000000000000000000000000000000000000..1a09665217c76f972371247ffc794c76dfde23be GIT binary patch literal 626470 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
7Ql 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 Date: Fri, 31 Mar 2023 15:00:07 +0800 Subject: [PATCH 075/207] Update User and Developer Guide --- docs/DeveloperGuide.md | 63 ++++++------ docs/UserGuide.md | 99 +++++++++++++++---- .../bagpacker/commands/DeleteListCommand.java | 2 +- 3 files changed, 114 insertions(+), 50 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f171e5cf9a..1a31a933ff 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -3,8 +3,7 @@ ## Acknowledgements -{list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the -original source as well} +This project is based on the AddressBook-Level3 project created by the SE-EDU initiative. ## Design & implementation @@ -32,7 +31,7 @@ This is done through the `contains()` method in class `PackingList()`, which is Below is the UML diagram showing what occurs during `add` function. ![img_1.png](img_1.png) When `execute()` is called in `a`(object of class `AddCommand`), the `addItem(item)` method is called in the object `packingList`. This method will see if method `contains()` will return `true`. - +. The `contains()` method, which is shown as a reference on the right of the UML diagram, is a boolean method that loops through all items in the packingList, and returns `true` if any of the existing items have the same description as the item to be added in `toAdd`, and `false` otherwise. When `contains()` returns `true`, method `addItem(item)` will be interrupted and a `DuplicateItemException` will be thrown from `packingList`, which will be caught by `a`. If `contains()` returns false, the item will be added onto `packingList`. @@ -45,7 +44,6 @@ Delete command is used to delete an item from the packing list. Mechanism: ```DeleteCommand.execute()``` calls the ```PackingList.deleteItem()``` method from the ```PackingList``` class which executes the ```ArrayList.remove()``` method to remove the item from the ```PackingList``` ArrayList. - #### Help Command Help command is used to exit the BagPacker application. @@ -53,37 +51,40 @@ Execute: ```HelpCommand.execute()``` prints the following help message. ``` All Commands: -1. add : Adds a quantity of items to the packing list. - Example: add 3 toothbrushes +1. add : Adds quantity and name of item to the packing list. + Example: Example: add 3 /of toothbrush + Meaning: Meaning: add quantity of 3 toothbrushes to the packing list 2. delete : Deletes an item from the packing list. - Example: delete 1 + Example: delete 1 + Meaning: removes the first item in the packing list 3. list : List all items in packing list. - Example: list -4. pack : Marks an item as packed in the packing list. - Example: pack 2 of 3 - Meaning: packs 2 quantities of the third item in the packing list -5. unpack : Marks an item as unpacked in the packing list. - Example: unpack 1 of 2 - Meaning: unpacks 1 quantity of the second item in the packing list -6. bye : Stops the BagPacker Application - Example: bye + Example: list +4. pack : Adds to the current quantity of items packed in the packing list. + Example: pack 2 /of 3 + Meaning: packs 2 more quantities of the third item in the packing list +5. unpack : Deducts from the current quantity of items packed in the packing list. + Example: unpack 1 /of 2 + Meaning: unpacks 1 quantity of the second item in the packing list +6. deletelist : Deletes all items in the packing list. + Example: deletelist +7. bye : Stops the BagPacker Application + Example: bye ____________________________________________________________ ``` -#### Bye Command -```ByeCommand``` is used to exit the BagPacker application. - -Mechanism: ```ByeCommand.execute()``` updates the static boolean ```isBagPackerRunning``` to be false. -The ```runBagPacker()``` method will continually parse and execute relevant commands (refer to Command Mechanisms in DG) until -```isBagPackerRunning == false``` which occurs upon the execution of the ```byeCommand```. - #### DeleteList Command ```DeleteListCommand``` is used to delete a whole packing list in the BagPacker application. Mechanism: ```DeleteListCommand.execute()``` reassigns the existing ```packingList``` to a new empty ArrayList of Items, thus deleting the ```packingList```. +#### Bye Command +```ByeCommand``` is used to exit the BagPacker application. + +Mechanism: ```ByeCommand.execute()``` updates the static boolean ```isBagPackerRunning``` to be false. +The ```runBagPacker()``` method will continually parse and execute relevant commands (refer to Command Mechanisms in DG) until +```isBagPackerRunning == false``` which occurs upon the execution of the ```byeCommand```. ## Product scope @@ -100,20 +101,22 @@ BagPacker aims to help busy students simplify their packing process by allowing | Version | As a ... | I want to ... | So that I can ... | |---------|----------|------------------------------------------------|------------------------------------------------------------------------------| -| v1 | user | Add an item to my packing list | update my packing list | -| v1 | user | Remove an item from my packing list | update my packing list | +| v1 | user | add an item to my packing list | update my packing list | +| v1 | user | remove an item from my packing list | update my packing list | | v1 | user | view a list of my packed and unpacked items | keep track of my packing list | | v1 | user | mark an item as packed | keep track of what is packed | | v1 | user | mark an item as unpacked | keep track of what is unpacked | | v1 | new user | see usage instructions | refer to them when I forget how to use the application | -| v2a | user | find an item by name | find the pack status of an item without having to go through the entire list | -| v2a | user | remove my packing list | clear my list once I am done packing | -| v2a | user | Specify the quantity of an item I need to pack | keep track of individual item quantities being packed | -| v2b | user | Save my packing list | keep track of my packing list even after leaving the app | +| v2.0 | user | remove my packing list | clear my list once I am done packing | +| v2.0 | user | specify the quantity of an item I need to pack | keep track of individual item quantities being packed | +| v2.1 | user | find an item by name | find the pack status of an item without having to go through the entire list | +| v2.1 | user | save my packing list | keep track of my packing list even after leaving the app | ## Non-Functional Requirements -{Give non-functional requirements} +- be able to retrieve the user's packing list quickly and accurately +- the quantity of each item to be packed should not be unreasonably large +- the total number of items to be packed should not be unreasonably large ## Glossary diff --git a/docs/UserGuide.md b/docs/UserGuide.md index abd9fbe891..ca03d3b2b9 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -2,41 +2,102 @@ ## Introduction -{Give a product intro} +BagPacker is an application to help users manage their packing list. ## Quick Start -{Give steps to get started quickly} +1. Ensure that you have Java 11 above installed. +2. Download the jar file, and move it into an empty folder. +3. Open a command line interface, and enter the directory with the jar file. +4. Execute the following command `java -jar Team_Project.jar` -1. Ensure that you have Java 11 or above installed. -1. Down the latest version of `Duke` from [here](http://link.to/duke). +## Features -## Features +### Add a new item: add +Adds a new item and its quantity to the packing list. -{Give detailed description of each feature} +Format: `add n/QUANTITY /of d/NAME` +* `QUANTITY` is the number of items to be packed, it should not be too large. +* `NAME` is the name of the item to be packed. -### Adding a todo: `todo` -Adds a new item to the list of todo items. +Examples of usage: +* `add 3 /of jackets` +* `add 2 /of water bottles` -Format: `todo n/TODO_NAME d/DEADLINE` +### Delete an item: delete +Deletes an item from the packing list. -* The `DEADLINE` can be in a natural language format. -* The `TODO_NAME` cannot contain punctuation. +Format: `delete i/INDEX` +* `INDEX` is the index of the list item to be deleted. -Example of usage: +Examples of usage: +* `delete 2` -`todo n/Write the rest of the User Guide d/next week` +### Pack some items: pack +Packs some of an item in the packing list. -`todo n/Refactor the User Guide to remove passive voice d/13/04/2020` +Format: `pack n/QUANTITY /of i/INDEX` +* `QUANTITY` is the additional number of that item to be packed. It should not be a negative number, and adding it to the current quantity packed should not exceed the total quantity to be packed. +* `INDEX` is the index of the item that is being packed. + +Examples of usage: +* `pack 3 /of 1` + +### Unpacks some items: unpack +Unpacks some of an item in the packing list. + +Format: `unpack n/QUANTITY /of i/INDEX` +* `QUANTITY` is the number of that item to be unpacked. It should not be a negative number, and subtracting it from the current quantity packed should not result in a negative number. +* `INDEX` is the index of the item that is being unpacked. + +Examples of usage: +* `unpack 2 /of 5` + +### List all items: list +Lists all the items in the packing list, and includes the current packed quantity, and the total quantity to be packed. + +Format: `list` + +Examples of usage: +* `list` + +### Delete the entire list: deletelist +Want to start on a new packing list? This command will clear the whole packing list. + +Format: `deletelist` + +Example of usage: +* `deletelist` + +### Help message: help +Some command doesn't seem to be giving you the results you want? Refer to the help message to see which command should be used. + +Format: `help` + +Examples of usage: +* `help` + +### Exiting the application: bye +Done packing for today? Exit BagPacker and continue tomorrow! + +Format: `bye` + +Examples of usage: +* `bye` ## FAQ -**Q**: How do I transfer my data to another computer? +**Q**: I keep getting a message that says the command is invalid, why? -**A**: {your answer here} +**A**: Please check that there are no typos in the command. To check the correct spelling of the commands, please type `help` and hit enter. ## Command Summary -{Give a 'cheat sheet' of commands here} - -* Add todo `todo n/TODO_NAME d/DEADLINE` +* Add an item | `add n/QUANTITY /of d/NAME` +* Delete an item | `delete i/INDEX` +* Pack some item | `pack n/QUANTITY /of i/INDEX` +* Unpack some item | `unpack n/QUANTITY /of i/INDEX` +* List all items | `list` +* Delete the whole list | `deletelist` +* Help message | `help` +* Exit | `bye` \ No newline at end of file diff --git a/src/main/java/bagpacker/commands/DeleteListCommand.java b/src/main/java/bagpacker/commands/DeleteListCommand.java index 3b73fc8eaf..eba29dd17d 100644 --- a/src/main/java/bagpacker/commands/DeleteListCommand.java +++ b/src/main/java/bagpacker/commands/DeleteListCommand.java @@ -16,7 +16,7 @@ public class DeleteListCommand extends Command { @Override public void execute(PackingList packingList) { ArrayList emptyList = new ArrayList<>(); - packingList.setItemList(emptyList); + PackingList.setItemList(emptyList); Ui.printToUser(String.format(MSG_SUCCESS_DELETE_LIST)); } From 8131cf5075b5366a87bbb7b94e2119c715298c71 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Sat, 1 Apr 2023 01:41:59 +0800 Subject: [PATCH 076/207] Update User Guide with table of contents and colours --- docs/UserGuide.md | 91 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 64 insertions(+), 27 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index ca03d3b2b9..4cc0ddb3d0 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -1,19 +1,46 @@ # User Guide -## Introduction +## Table of contents +- [Introduction](#span-stylecolor00a36c-introduction-span) +- [Quick Start](#span-stylecolor00a36c-quick-start-span) +- [Features](#span-stylecolor00a36c-features-span) + - [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) + - [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) + - [Packing some items](#span-stylecolor6495ed-packing-some-items--span-pack) + - [Unpacking some items](#span-stylecolor6495ed-unpacking-some-items--span-unpack) + - [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) + - [Deleting the entire list](#span-stylecolor6495ed-deleting-the-entire-list--span-deletelist) + - [Help message](#span-stylecolor6495ed-help-message--span-help) + - [Exiting the application](#span-stylecolor6495ed-exiting-the-application--span-bye) +- [Frequently Asked Questions (FAQ)](#span-stylecolor00a36c-frequently-asked-questions--faq--span) +- [Command Summary](#span-stylecolor00a36c-command-summary-span) + +--- + +## Introduction BagPacker is an application to help users manage their packing list. -## Quick Start +--- -1. Ensure that you have Java 11 above installed. -2. Download the jar file, and move it into an empty folder. -3. Open a command line interface, and enter the directory with the jar file. -4. Execute the following command `java -jar Team_Project.jar` +## Quick Start -## Features +1. Ensure that you have Java 11 installed. +2. Download the latest `jar` file from [here](https://github.com/AY2223S2-CS2113-T14-2/tp/releases) +3. Move this `jar` file into an empty folder on your computer. +4. Open a command line interface, and enter the directory with the jar file. + - For Windows users: search for Command Prompt, and launch it. + - For macOS users: +5. Execute the following command `java -jar Team_Project.jar` -### Add a new item: add +--- + +## Features +> **Notes about command format** +> - `n/`, `i/` and `d/` indicate that a user input is expected. +> - The `/` in `/of` is necessary for `of` to be recognised as a keyword. + +### Adding a new item: `add` Adds a new item and its quantity to the packing list. Format: `add n/QUANTITY /of d/NAME` @@ -24,7 +51,7 @@ Examples of usage: * `add 3 /of jackets` * `add 2 /of water bottles` -### Delete an item: delete +### Deleting an item: `delete` Deletes an item from the packing list. Format: `delete i/INDEX` @@ -33,7 +60,7 @@ Format: `delete i/INDEX` Examples of usage: * `delete 2` -### Pack some items: pack +### Packing some items: `pack` Packs some of an item in the packing list. Format: `pack n/QUANTITY /of i/INDEX` @@ -43,7 +70,7 @@ Format: `pack n/QUANTITY /of i/INDEX` Examples of usage: * `pack 3 /of 1` -### Unpacks some items: unpack +### Unpacking some items: `unpack` Unpacks some of an item in the packing list. Format: `unpack n/QUANTITY /of i/INDEX` @@ -53,7 +80,7 @@ Format: `unpack n/QUANTITY /of i/INDEX` Examples of usage: * `unpack 2 /of 5` -### List all items: list +### Listing all items: `list` Lists all the items in the packing list, and includes the current packed quantity, and the total quantity to be packed. Format: `list` @@ -61,23 +88,24 @@ Format: `list` Examples of usage: * `list` -### Delete the entire list: deletelist -Want to start on a new packing list? This command will clear the whole packing list. +### Deleting the entire list: `deletelist` +Want to start on a new packing list? This command will clear the whole packing list. +Be careful, this action is irreversible. Format: `deletelist` Example of usage: * `deletelist` -### Help message: help -Some command doesn't seem to be giving you the results you want? Refer to the help message to see which command should be used. +### Help message: `help` +Can't get the results you want? Refer to the help message to see which command should be used. Format: `help` Examples of usage: * `help` -### Exiting the application: bye +### Exiting the application: `bye` Done packing for today? Exit BagPacker and continue tomorrow! Format: `bye` @@ -85,19 +113,28 @@ Format: `bye` Examples of usage: * `bye` -## FAQ +--- + +## Frequently Asked Questions (FAQ) **Q**: I keep getting a message that says the command is invalid, why? **A**: Please check that there are no typos in the command. To check the correct spelling of the commands, please type `help` and hit enter. -## Command Summary +--- + +## Command Summary + +| Action description | Syntax | +|:----------------------|:--------------------------------| +| Add an item | `add n/QUANTITY /of d/NAME` | +| Delete an item | `delete i/INDEX` | +| Pack some of an item | `pack n/QUANTITY /of i/INDEX` | +| Unpack some item | `unpack n/QUANTITY /of i/INDEX` | +| List all items | `list` | +| Delete the whole list | `deletelist` | +| Help message | `help` | +| Exit | `bye` | -* Add an item | `add n/QUANTITY /of d/NAME` -* Delete an item | `delete i/INDEX` -* Pack some item | `pack n/QUANTITY /of i/INDEX` -* Unpack some item | `unpack n/QUANTITY /of i/INDEX` -* List all items | `list` -* Delete the whole list | `deletelist` -* Help message | `help` -* Exit | `bye` \ No newline at end of file +--- +back to [table of contents](#table-of-contents) \ No newline at end of file From 85f5942b589122d7cd1a936d61135f3c69820b15 Mon Sep 17 00:00:00 2001 From: Sophie Date: Sat, 1 Apr 2023 15:23:02 +0800 Subject: [PATCH 077/207] Remove redundant code from merge conflict --- src/main/java/bagpacker/commands/UnpackCommand.java | 9 +-------- src/main/java/bagpacker/iohandler/Parser.java | 6 +++--- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index daf8832c03..0f29f04417 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -7,18 +7,11 @@ public class UnpackCommand extends Command { public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; -<<<<<<< HEAD + public static final String HELP_MSG = "unpack : Deducts from the current quantity of items packed in the packing " + "list.\n" + "\tExample: unpack 1 /of 2\n" + "\tMeaning: unpacks 1 quantity of the second item in the packing list"; -======= - public static final String HELP_MSG = - "unpack : Deducts from the current quantity of items packed in the packing list.\n" + - "\tExample: unpack 1 /of 2\n" + - "\tMeaning: unpacks 1 quantity of the second item in the packing list"; ->>>>>>> a00331e81217091efb8dec3bf7a94da76f2016fd - private static int unpackQuantity; public UnpackCommand(int quantity, int targetIndex) { diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 63f7571c6d..17591cecaf 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -338,18 +338,18 @@ public static Command createUnpackObj() { } int itemIndex = Integer.parseInt(quantityAndIndex[1]); -<<<<<<< HEAD + if (itemIndex > PackingList.getItemList().size()) { return new IncorrectCommand("Invalid Item Index", "Try to input an integer number between 1 and " + PackingList.getItemList().size()); } -======= + quantityPacked = PackingList.get(itemIndex - 1).getPackedQuantity(); if(itemQuantity < 1 | itemQuantity > quantityPacked){ throw new InvalidVariablesException(); } ->>>>>>> a00331e81217091efb8dec3bf7a94da76f2016fd + return new UnpackCommand(itemQuantity, itemIndex); } catch (NumberFormatException | InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { From 361a83bfd3012533d40575828ae13a48b70b6010 Mon Sep 17 00:00:00 2001 From: Sophie Date: Sat, 1 Apr 2023 15:36:30 +0800 Subject: [PATCH 078/207] Update UG with Mac Prompts --- docs/UserGuide.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 4cc0ddb3d0..130d6535f6 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -25,14 +25,22 @@ BagPacker is an application to help users manage their packing list. ## Quick Start +#### For Windows users: 1. Ensure that you have Java 11 installed. 2. Download the latest `jar` file from [here](https://github.com/AY2223S2-CS2113-T14-2/tp/releases) 3. Move this `jar` file into an empty folder on your computer. -4. Open a command line interface, and enter the directory with the jar file. - - For Windows users: search for Command Prompt, and launch it. - - For macOS users: +4. Open your Terminal, and enter the directory with the jar file. Search for Command Prompt, and launch it. 5. Execute the following command `java -jar Team_Project.jar` +#### For macOS users: +1. Ensure that you have Java 11 installed. +2. Download the latest `jar` file from [here](https://github.com/AY2223S2-CS2113-T14-2/tp/releases) +3. Create a new folder on your computer where you want to run the program. Move this `jar` file into the folder. +4. Open your Terminal and navigate to the directory with the downloaded `jar` file using the `cd` command. +5. Execute the following command `java -jar Team_Project.jar` + +You should now be able to use BagPacker on your device. + --- ## Features From ae8f5345f5522daebd51464ba9d5472a4a76ee82 Mon Sep 17 00:00:00 2001 From: Sophie Date: Sat, 1 Apr 2023 15:40:18 +0800 Subject: [PATCH 079/207] Resolve merge conflict --- src/main/java/bagpacker/iohandler/Parser.java | 4 ---- src/main/java/bagpacker/packingfunc/Item.java | 4 +--- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 17591cecaf..e578b75cf4 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -290,12 +290,8 @@ public static Command createPackObj() { "Your packing list is empty, there is nothing to pack"); } else { return new IncorrectCommand("Invalid Item Index", -<<<<<<< HEAD "Try to input an integer number between 1 and " + PackingList.getItemList().size() + "\n" + HELP_MSG); -======= - "Try to input an item index number between 1 and " + PackingList.getItemList().size()); ->>>>>>> a00331e81217091efb8dec3bf7a94da76f2016fd } } catch (ArrayIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid Input Variables", diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index d30b6d41b4..4c2c0a3891 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -45,9 +45,7 @@ public String getItemName() { // public boolean getIsPacked() { // return isPacked; // } - public int getTotalQuantity(){ - return totalQuantity; - } + public void setPacked(int quantity) { this.packedQuantity += quantity; } From cf3ed33b367abbec682f080c549fd69ead6c470c Mon Sep 17 00:00:00 2001 From: coregano Date: Sat, 1 Apr 2023 15:44:59 +0800 Subject: [PATCH 080/207] Revert "Update developer guide" This reverts commit 961ae6c060d83513eccbc8c4089cb65a817e9961. --- docs/DeveloperGuide.md | 32 +++++++++++++++++--------------- docs/img_1.png | Bin 0 -> 38579 bytes docs/img_3.png | Bin 30174 -> 0 bytes 3 files changed, 17 insertions(+), 15 deletions(-) create mode 100644 docs/img_1.png delete mode 100644 docs/img_3.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c8a76eb2d9..f171e5cf9a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -23,6 +23,22 @@ Mechanism: ```AddCommand.execute()``` calls the ```PackingList.addItem()``` meth It then updates the ```quantity``` variable according to the quantity inputted by the user. +#### Preventing duplicate items + +When using the `add` function, we have decided to implement a passive function that checks whether the item with the same name already exists in the packingList. + +This is done through the `contains()` method in class `PackingList()`, which is called during `execute` in an `AddCommand` object. + +Below is the UML diagram showing what occurs during `add` function. +![img_1.png](img_1.png) +When `execute()` is called in `a`(object of class `AddCommand`), the `addItem(item)` method is called in the object `packingList`. This method will see if method `contains()` will return `true`. + +The `contains()` method, which is shown as a reference on the right of the UML diagram, is a boolean method that loops through all items in the packingList, and returns `true` if any of the existing items have the same description as the item to be added in `toAdd`, and `false` otherwise. + +When `contains()` returns `true`, method `addItem(item)` will be interrupted and a `DuplicateItemException` will be thrown from `packingList`, which will be caught by `a`. If `contains()` returns false, the item will be added onto `packingList`. + +In both scenarios, `ui.printToUser` will be called to print a message to the user. In the former case, `ExistItemError` will be printed, while `AddSuccess` will be shown if the item was added with no issues. + #### Delete Command Delete command is used to delete an item from the packing list. @@ -52,6 +68,7 @@ All Commands: 6. bye : Stops the BagPacker Application Example: bye ____________________________________________________________ + ``` #### Bye Command @@ -66,21 +83,6 @@ The ```runBagPacker()``` method will continually parse and execute relevant comm Mechanism: ```DeleteListCommand.execute()``` reassigns the existing ```packingList``` to a new empty ArrayList of Items, thus deleting the ```packingList```. -#### Preventing duplicate items - -When using the `add` function, we have decided to implement a passive function that checks whether the item with the same name already exists in the packingList. - -This is done through the `contains()` method in class `PackingList()`, which is called during `execute` in an `AddCommand` object. - -Below is the UML diagram showing what occurs during `add` function. -![img_3.png](img_3.png) -When `execute()` is called in `a`(object of class `AddCommand`), the `addItem(item)` method is called in the object `packingList`. This method will see if method `contains()` will return `true`. - -The `contains()` method, which is shown as a reference on the right of the UML diagram, is a boolean method that loops through all items in the packingList, and returns `true` if any of the existing items have the same description as the item to be added in `toAdd`, and `false` otherwise. - -When `contains()` returns `true`, method `addItem(item)` will be interrupted and a `DuplicateItemException` will be thrown from `packingList`, which will be caught by `a`. If `contains()` returns false, the item will be added onto `packingList`. - -In both scenarios, `ui.printToUser` will be called to print a message to the user. In the former case, `ExistItemError` will be printed, while `AddSuccess` will be shown if the item was added with no issues. ## Product scope diff --git a/docs/img_1.png b/docs/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6899bf1bc9187a05077c7cf5c275153ce46b910a GIT binary patch literal 38579 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 literal 0 HcmV?d00001 diff --git a/docs/img_3.png b/docs/img_3.png deleted file mode 100644 index 768ac9646024def9b3d08bdfb75502242b7b424e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30174 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 tvpZ1Xg6-- Date: Sat, 1 Apr 2023 15:58:08 +0800 Subject: [PATCH 081/207] Edit help message to be more informative --- src/main/java/bagpacker/iohandler/Parser.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index e578b75cf4..9c214fef6e 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -217,7 +217,7 @@ public static Command createAddObj() { AddCommand.HELP_MSG); } catch (NumberFormatException | InvalidIndexException e) { return new IncorrectCommand("Invalid Item Quantity", - "for item quantity, try to input a positive integer number"); + "For item quantity, try to input a positive integer number between 1 and 1000000"); } } @@ -299,10 +299,10 @@ public static Command createPackObj() { } catch (InvalidVariablesException e){ if(quantityNotPacked == 0){ return new IncorrectCommand("Invalid Pack Usage", - "this item is fully packed"); + "This item is fully packed"); } return new IncorrectCommand("Invalid Input Quantity", - "try to input a quantity between 1 and "+ quantityNotPacked +" to be packed"); + "Try to input a quantity between 1 and "+ quantityNotPacked +" to be packed"); } } @@ -361,10 +361,10 @@ public static Command createUnpackObj() { } catch (InvalidVariablesException e){ if(quantityPacked == 0){ return new IncorrectCommand("Invalid Unpack Usage", - "this item is not even packed yet"); + "This item is not even packed yet"); } return new IncorrectCommand("Invalid Input Quantity", - "try to input a quantity between 1 and "+ quantityPacked +" to be packed"); + "Try to input a quantity between 1 and "+ quantityPacked +" to be packed"); } } From d612948fe0d0a041a7ecc936066cf2096077df63 Mon Sep 17 00:00:00 2001 From: Sophie Date: Sat, 1 Apr 2023 16:12:35 +0800 Subject: [PATCH 082/207] Update UG for list feature example output --- docs/UserGuide.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 130d6535f6..8956fae4ba 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -96,6 +96,16 @@ Format: `list` Examples of usage: * `list` +Example output: +``` +Here are the items in your list +1. [1000000/1000000] tooth +2. [0/1] toothpaste +``` +Format explanation: + +`ITEM_INDEX. [CURRENTLY_PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME` + ### Deleting the entire list: `deletelist` Want to start on a new packing list? This command will clear the whole packing list. Be careful, this action is irreversible. From 27b8f81f50efa2fe6ce4eff4b4913d75a7b4fe45 Mon Sep 17 00:00:00 2001 From: Sophie Date: Sat, 1 Apr 2023 16:49:16 +0800 Subject: [PATCH 083/207] Change error message --- src/main/java/bagpacker/iohandler/Parser.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 9c214fef6e..05e97d57ad 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -249,7 +249,8 @@ public static Command createDeleteObj() { "Your packing list is empty, there is nothing to delete"); } else { return new IncorrectCommand("Invalid Item Index", - "Try to input an integer number between 1 and " + PackingList.getItemList().size()); + "Try to input a positive integer number that is at most " + + PackingList.getItemList().size()); } } } @@ -279,7 +280,8 @@ public static Command createPackObj() { String[] quantityAndIndex = getPackVariables(); int itemQuantity = Integer.parseInt(quantityAndIndex[0]); int itemIndex = Integer.parseInt(quantityAndIndex[1]); - quantityNotPacked = PackingList.get(itemIndex - 1).getTotalQuantity() - PackingList.get(itemIndex - 1).getPackedQuantity(); + quantityNotPacked = PackingList.get(itemIndex - 1).getTotalQuantity() - + PackingList.get(itemIndex - 1).getPackedQuantity(); if(itemQuantity < 1 | itemQuantity > quantityNotPacked){ throw new InvalidVariablesException(); } @@ -290,7 +292,8 @@ public static Command createPackObj() { "Your packing list is empty, there is nothing to pack"); } else { return new IncorrectCommand("Invalid Item Index", - "Try to input an integer number between 1 and " + PackingList.getItemList().size() + + "Try to input a positive integer number that is at most " + + PackingList.getItemList().size() + "\n" + HELP_MSG); } } catch (ArrayIndexOutOfBoundsException e) { @@ -302,7 +305,8 @@ public static Command createPackObj() { "This item is fully packed"); } return new IncorrectCommand("Invalid Input Quantity", - "Try to input a quantity between 1 and "+ quantityNotPacked +" to be packed"); + "Try to input a positive quantity that is at most " + + quantityNotPacked + " to be packed"); } } @@ -337,7 +341,8 @@ public static Command createUnpackObj() { if (itemIndex > PackingList.getItemList().size()) { return new IncorrectCommand("Invalid Item Index", - "Try to input an integer number between 1 and " + PackingList.getItemList().size()); + "Try to input a positive integer number that does not exceed " + + PackingList.getItemList().size()); } @@ -353,7 +358,8 @@ public static Command createUnpackObj() { "Your packing list is empty, there is nothing to unpack"); } else { return new IncorrectCommand("Invalid Item Index", - "Try to input an item index number between 1 and " + PackingList.getItemList().size()); + "Try to input a positive item index number that is at most " + + PackingList.getItemList().size()); } } catch (ArrayIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid Input Variables", @@ -364,7 +370,7 @@ public static Command createUnpackObj() { "This item is not even packed yet"); } return new IncorrectCommand("Invalid Input Quantity", - "Try to input a quantity between 1 and "+ quantityPacked +" to be packed"); + "Try to input a positive quantity that does not exceed "+ quantityPacked +" to be packed"); } } From e72174d83a9458481216834f544e6580d42c3ac0 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Sat, 1 Apr 2023 17:06:58 +0800 Subject: [PATCH 084/207] Update User Guide Resolve GitHub issues #90, #93, #95, #99, #120, #123 --- docs/UserGuide.md | 126 +++++++++++++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 46 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 4cc0ddb3d0..fa93fbb3c6 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -1,51 +1,64 @@ -# User Guide - -## Table of contents -- [Introduction](#span-stylecolor00a36c-introduction-span) -- [Quick Start](#span-stylecolor00a36c-quick-start-span) -- [Features](#span-stylecolor00a36c-features-span) - - [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) - - [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) - - [Packing some items](#span-stylecolor6495ed-packing-some-items--span-pack) - - [Unpacking some items](#span-stylecolor6495ed-unpacking-some-items--span-unpack) - - [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) - - [Deleting the entire list](#span-stylecolor6495ed-deleting-the-entire-list--span-deletelist) - - [Help message](#span-stylecolor6495ed-help-message--span-help) - - [Exiting the application](#span-stylecolor6495ed-exiting-the-application--span-bye) -- [Frequently Asked Questions (FAQ)](#span-stylecolor00a36c-frequently-asked-questions--faq--span) -- [Command Summary](#span-stylecolor00a36c-command-summary-span) +# BagPacker User Guide + +--- + +## Table of contents +* [Introduction](#span-stylecolor00a36c-introduction-span) +* [Quick Start](#span-stylecolor00a36c-quick-start-span) +* [Features](#span-stylecolor00a36c-features-span) + * [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) + * [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) + * [Packing some items](#span-stylecolor6495ed-packing-some-items--span-pack) + * [Unpacking some items](#span-stylecolor6495ed-unpacking-some-items--span-unpack) + * [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) + * [Deleting the entire list](#span-stylecolor6495ed-deleting-the-entire-list--span-deletelist) + * [Help message](#span-stylecolor6495ed-help-message--span-help) + * [Exiting the application](#span-stylecolor6495ed-exiting-the-application--span-bye) +* [Frequently Asked Questions (FAQ)](#span-stylecolor00a36c-frequently-asked-questions--faq--span) +* [Command Summary](#span-stylecolor00a36c-command-summary-span) --- ## Introduction -BagPacker is an application to help users manage their packing list. +Meant for travellers, BagPacker is an application to help travellers manage their packing list. +Users can add items of multiple quantities to their packing list, delete items, and view their packing lists. --- ## Quick Start 1. Ensure that you have Java 11 installed. -2. Download the latest `jar` file from [here](https://github.com/AY2223S2-CS2113-T14-2/tp/releases) + * If not, please follow the instructions here for [Windows](https://docs.oracle.com/en/java/javase/11/install/installation-jdk-microsoft-windows-platforms.html#GUID-A7E27B90-A28D-4237-9383-A58B416071CA) and [macOS](https://docs.oracle.com/en/java/javase/11/install/installation-jdk-macos.html#GUID-2FE451B0-9572-4E38-A1A5-568B77B146DE) +2. Download the `jar` file from the **latest release** [here](https://github.com/AY2223S2-CS2113-T14-2/tp/releases) 3. Move this `jar` file into an empty folder on your computer. 4. Open a command line interface, and enter the directory with the jar file. - - For Windows users: search for Command Prompt, and launch it. - - For macOS users: + * For Windows users: search for Command Prompt, and launch it. + * For macOS users: 5. Execute the following command `java -jar Team_Project.jar` +[Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) + --- ## Features > **Notes about command format** -> - `n/`, `i/` and `d/` indicate that a user input is expected. -> - The `/` in `/of` is necessary for `of` to be recognised as a keyword. +> * Words that are fully capitalised (such as `QUANTITY`) indicate that an input is expected from the user. +> * The `/` in `/of` is necessary for `of` to be recognised as a keyword. +> * `NAME` is a case-sensitive input. +> * Additional parameters will be ignored for commands that do not need them. +> * For example, `deletelist abc123` will be interpreted as `deletelist`. ### Adding a new item: `add` Adds a new item and its quantity to the packing list. -Format: `add n/QUANTITY /of d/NAME` -* `QUANTITY` is the number of items to be packed, it should not be too large. +Format: `add QUANTITY /of NAME` +* `QUANTITY` is the number of items to be packed. + * It must be a positive integer. + * It must be more than 0, but not more than 1 million (1,000,000). + * An invalid `QUANTITY` will result in an error message. * `NAME` is the name of the item to be packed. + * `NAME` is case-sensitive. Examples of usage: * `add 3 /of jackets` @@ -54,36 +67,51 @@ Examples of usage: ### Deleting an item: `delete` Deletes an item from the packing list. -Format: `delete i/INDEX` -* `INDEX` is the index of the list item to be deleted. +Format: `delete INDEX` +* `INDEX` is the index of the item to be deleted. + * It must be a positive integer. + * It must be more than 0, but no more than the number of items in the list. + * An invalid index will result in an error message. Examples of usage: * `delete 2` ### Packing some items: `pack` -Packs some of an item in the packing list. +Packs the given amount of that item in the packing list. -Format: `pack n/QUANTITY /of i/INDEX` -* `QUANTITY` is the additional number of that item to be packed. It should not be a negative number, and adding it to the current quantity packed should not exceed the total quantity to be packed. +Format: `pack QUANTITY /of INDEX` +* `QUANTITY` is the additional number of that item to be packed. + * It must be a positive integer that is more than 0. + * Adding `QUANTITY` to the current quantity packed must not exceed the total quantity to be packed. + * An invalid `QUANTITY` will result in an error message. * `INDEX` is the index of the item that is being packed. + * It must be a positive integer that is more than 0, but no more than the number of items in the list. + * An invalid `INDEX` will result in an error message. Examples of usage: * `pack 3 /of 1` ### Unpacking some items: `unpack` -Unpacks some of an item in the packing list. +Unpacks the given amount of that item in the packing list. -Format: `unpack n/QUANTITY /of i/INDEX` -* `QUANTITY` is the number of that item to be unpacked. It should not be a negative number, and subtracting it from the current quantity packed should not result in a negative number. +Format: `unpack QUANTITY /of INDEX` +* `QUANTITY` is the number of that item to be unpacked. + * It must be a positive integer that is more than 0. + * Subtracting `QUANTITY` from the current quantity packed must not result in a negative integer. + * An invalid `QUANTITY` will result in an error message. * `INDEX` is the index of the item that is being unpacked. + * It must be a positive integer that is more than 0, but no more than the number of items in the list. + * An invalid `INDEX` will result in an error message. Examples of usage: * `unpack 2 /of 5` ### Listing all items: `list` -Lists all the items in the packing list, and includes the current packed quantity, and the total quantity to be packed. +Lists all the items in the packing list. +* Includes the current packed quantity, the total quantity to be packed, and the name of the item. Format: `list` +* This command is not expecting any parameters. Any additional parameters will be ignored. Examples of usage: * `list` @@ -93,6 +121,7 @@ Want to start on a new packing list? This command will clear the whole packing l Be careful, this action is irreversible. Format: `deletelist` +* This command is not expecting any parameters. Any additional parameters will be ignored. Example of usage: * `deletelist` @@ -101,6 +130,7 @@ Example of usage: Can't get the results you want? Refer to the help message to see which command should be used. Format: `help` +* This command is not expecting any parameters. Any additional parameters will be ignored. Examples of usage: * `help` @@ -109,10 +139,13 @@ Examples of usage: Done packing for today? Exit BagPacker and continue tomorrow! Format: `bye` +* This command is not expecting any parameters. Any additional parameters will be ignored. Examples of usage: * `bye` +[Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [Go to Features](#span-stylecolor00a36c-table-of-contents-span) + --- ## Frequently Asked Questions (FAQ) @@ -121,20 +154,21 @@ Examples of usage: **A**: Please check that there are no typos in the command. To check the correct spelling of the commands, please type `help` and hit enter. +[Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) + --- ## Command Summary -| Action description | Syntax | -|:----------------------|:--------------------------------| -| Add an item | `add n/QUANTITY /of d/NAME` | -| Delete an item | `delete i/INDEX` | -| Pack some of an item | `pack n/QUANTITY /of i/INDEX` | -| Unpack some item | `unpack n/QUANTITY /of i/INDEX` | -| List all items | `list` | -| Delete the whole list | `deletelist` | -| Help message | `help` | -| Exit | `bye` | - ---- -back to [table of contents](#table-of-contents) \ No newline at end of file +| Action description | Syntax | Remarks | +|:----------------------|:----------------------------|:---------------------------------------------------------------------------------------------------------------------------------| +| Add an item | `add QUANTITY /of NAME` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000 | +| Delete an item | `delete INDEX` | `INDEX` must be a valid list index | +| Pack some of an item | `pack QUANTITY /of INDEX` |
  • Adding `QUANTITY` should not cause the quantity to exceed the total quantity
  • `INDEX` must be a valid list index
  • | +| Unpack some item | `unpack QUANTITY /of INDEX` |
  • Subtracting `QUANTITY` should not cause the quantity to be less than 0
  • `INDEX` must be a valid list index
  • | | +| List all items | `list` | Additional parameters will be ignored | +| Delete the whole list | `deletelist` | Additional parameters will be ignored | +| Help message | `help` | Additional parameters will be ignored | +| Exit | `bye` | Additional parameters will be ignored | + +[Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [Go to Features](#span-stylecolor00a36c-table-of-contents-span) \ No newline at end of file From 85d3e83fb5d07e5c5715d38892c736a1cf51f9d7 Mon Sep 17 00:00:00 2001 From: Sophie Date: Sat, 1 Apr 2023 18:23:40 +0800 Subject: [PATCH 085/207] Create packall feature --- src/main/java/bagpacker/BagPacker.java | 8 +-- .../bagpacker/commands/DeleteListCommand.java | 2 +- .../bagpacker/commands/PackAllCommand.java | 34 ++++++++++++ src/main/java/bagpacker/iohandler/Parser.java | 54 +++++++++++++++++-- src/main/java/bagpacker/iohandler/Ui.java | 3 +- src/main/java/bagpacker/packingfunc/Item.java | 3 ++ 6 files changed, 94 insertions(+), 10 deletions(-) create mode 100644 src/main/java/bagpacker/commands/PackAllCommand.java diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index ce64d96cbe..9c92d181cd 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -12,15 +12,15 @@ public class BagPacker { * Main entry-point for the java.BagPacker application. */ public static void main(String[] args) { - // initialise variables + // Initialise variables BagPacker.packingList = new PackingList(); - //initialise BagPacker program + // Initialise BagPacker program Ui.initialMessage(); - //run main program + // Run main program runBagPacker(); - //Close program + // Close program Ui.goodbyeMessage(); } diff --git a/src/main/java/bagpacker/commands/DeleteListCommand.java b/src/main/java/bagpacker/commands/DeleteListCommand.java index eba29dd17d..dfb84c0241 100644 --- a/src/main/java/bagpacker/commands/DeleteListCommand.java +++ b/src/main/java/bagpacker/commands/DeleteListCommand.java @@ -7,7 +7,7 @@ import java.util.ArrayList; public class DeleteListCommand extends Command { - public static final String MSG_SUCCESS_DELETE_LIST = "list deleted"; + public static final String MSG_SUCCESS_DELETE_LIST = "Packing list deleted"; public static final String HELP_MSG = "deletelist : Deletes all items in the packing list.\n" + diff --git a/src/main/java/bagpacker/commands/PackAllCommand.java b/src/main/java/bagpacker/commands/PackAllCommand.java new file mode 100644 index 0000000000..0615a55562 --- /dev/null +++ b/src/main/java/bagpacker/commands/PackAllCommand.java @@ -0,0 +1,34 @@ +package bagpacker.commands; + +import bagpacker.iohandler.Ui; +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; + +public class PackAllCommand extends Command { + + public static final String MSG_SUCCESS_PACK = "Item packed: %s"; + + public static final String HELP_MSG = "packall : Marks all quantity of the specified item as packed in the " + + "packing list.\n" + + "\tExample: packall /of 3\n" + + "\tMeaning: packs all of the quantities of the third item in the packing list"; + + private static int packQuantity; + + public PackAllCommand(int targetIndex) { + super(targetIndex); + + assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : + "PackAll Command Target index is out of bounds"; + } + + @Override + public void execute(PackingList packingList) { + this.packingList = packingList; + final Item item = getTargetItem(); + packQuantity = item.getUnpackedQuantity(); + packingList.packItem(item, packQuantity); + Ui.printToUser(String.format(MSG_SUCCESS_PACK, item)); + } + +} diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 05e97d57ad..b37c7d37b3 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -11,6 +11,7 @@ import bagpacker.commands.ListCommand; import bagpacker.commands.PackCommand; import bagpacker.commands.UnpackCommand; +import bagpacker.commands.PackAllCommand; import bagpacker.exception.EmptyInputException; import bagpacker.exception.InvalidIndexException; import bagpacker.exception.InvalidVariablesException; @@ -80,6 +81,8 @@ public static Command parse() { return createHelpObj(); case "deletelist": return createDeletelistObj(); + case "packall": + return createPackAllObj(); case "bye": return createByeObj(); default: @@ -280,8 +283,7 @@ public static Command createPackObj() { String[] quantityAndIndex = getPackVariables(); int itemQuantity = Integer.parseInt(quantityAndIndex[0]); int itemIndex = Integer.parseInt(quantityAndIndex[1]); - quantityNotPacked = PackingList.get(itemIndex - 1).getTotalQuantity() - - PackingList.get(itemIndex - 1).getPackedQuantity(); + quantityNotPacked = PackingList.get(itemIndex - 1).getUnpackedQuantity(); if(itemQuantity < 1 | itemQuantity > quantityNotPacked){ throw new InvalidVariablesException(); } @@ -293,8 +295,7 @@ public static Command createPackObj() { } else { return new IncorrectCommand("Invalid Item Index", "Try to input a positive integer number that is at most " + - PackingList.getItemList().size() + - "\n" + HELP_MSG); + PackingList.getItemList().size()); } } catch (ArrayIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid Input Variables", @@ -310,6 +311,13 @@ public static Command createPackObj() { } } + /** + * Attempts to create PackCommand object to be executed where it is called from + * + * @return PackCommand the command to be executed to Pack an item in the packing list, else + * an IncorrectCommand is created to be executed + */ + public static String[] getPackVariables() throws InvalidIndexException { String[] inputStringList = fullInput.trim().split(" ", 2); String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); @@ -320,6 +328,44 @@ public static String[] getPackVariables() throws InvalidIndexException { return inputVariables; } + public static int getPackAllIndex() throws InvalidIndexException { + String[] inputStringList = fullInput.trim().split("/", 2); + inputStringList = inputStringList[1].split(" ", 2); + int itemIndex = Integer.parseInt(inputStringList[1]); + + if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) { + throw new InvalidIndexException(); + } + + return itemIndex; + } + + public static Command createPackAllObj() { + int quantityNotPacked = 0; + + try { + int itemIndex = getPackAllIndex(); + + quantityNotPacked = PackingList.get(itemIndex - 1).getUnpackedQuantity(); + + return new PackAllCommand(itemIndex); + } catch (NumberFormatException | InvalidIndexException e) { + if (PackingList.getItemList().size() == 0) { + return new IncorrectCommand("Invalid Item Index", + "Your packing list is empty, there is nothing to pack"); + } else { + return new IncorrectCommand("Invalid Item Index", + "Try to input a positive integer number that is at most " + + PackingList.getItemList().size()); + } + } catch (ArrayIndexOutOfBoundsException e) { + return new IncorrectCommand("Invalid Input Variables", + PackCommand.HELP_MSG); + } + } + + + /** * Attempts to create UnpackCommand object to be executed where it is called from diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index d91070a534..20dbf2405c 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -67,7 +67,8 @@ public static void helpMessage() { System.out.println("4. " + PackCommand.HELP_MSG); System.out.println("5. " + UnpackCommand.HELP_MSG); System.out.println("6. " + DeleteListCommand.HELP_MSG); - System.out.println("7. " + ByeCommand.HELP_MSG); + System.out.println("7. " + PackAllCommand.HELP_MSG); + System.out.println("8. " + ByeCommand.HELP_MSG); printLine(); } diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index 4c2c0a3891..7945130e2c 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -18,6 +18,9 @@ public int getTotalQuantity() { } private final int totalQuantity; + public int getUnpackedQuantity() { + return totalQuantity - packedQuantity; + } public Item(int quantity, String description) { this.itemName = description; From d02a5ff887b7c22491737a4f845726a10cbfbb80 Mon Sep 17 00:00:00 2001 From: coregano Date: Sun, 2 Apr 2023 00:21:55 +0800 Subject: [PATCH 086/207] feature - automatic save and load added for users --- .gitignore | 1 + src/main/java/bagpacker/BagPacker.java | 21 ++++++- .../java/bagpacker/iohandler/Storage.java | 57 ++++++++++++------- src/main/java/bagpacker/iohandler/Ui.java | 11 +++- src/main/java/bagpacker/packingfunc/Item.java | 17 ++++++ 5 files changed, 83 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index c8079eadd6..64b484c164 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ bin/ /text-ui-test/ACTUAL.TXT packList.txt packingList.txt +packing_list.txt diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index ce64d96cbe..3f03f314a4 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -2,25 +2,40 @@ import bagpacker.commands.ByeCommand; import bagpacker.commands.Command; +import bagpacker.iohandler.Storage; import bagpacker.iohandler.Ui; import bagpacker.iohandler.Parser; import bagpacker.packingfunc.PackingList; +import java.io.FileNotFoundException; + public class BagPacker { private static PackingList packingList; + /** * Main entry-point for the java.BagPacker application. */ public static void main(String[] args) { // initialise variables BagPacker.packingList = new PackingList(); - //initialise BagPacker program + Ui.initialMessage(); - //run main program + // load save file if possible + try { + Storage.load(); + Ui.showUserReturn(); + } catch (FileNotFoundException | RuntimeException e) { + Ui.showNewUser(); + } + + // run main program runBagPacker(); - //Close program + // save packingList + Storage.save(packingList); + + // Close program Ui.goodbyeMessage(); } diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java index a8702dd846..900ad2e34b 100644 --- a/src/main/java/bagpacker/iohandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -5,9 +5,12 @@ //import java.io.File; //import java.io.FileNotFoundException; +import java.io.File; +import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; +import java.util.Scanner; //import java.util.Scanner; /** @@ -15,34 +18,48 @@ */ public class Storage { - public static ArrayList packingList = new ArrayList<>(); - private static final String FILE_PATH = "packingList.txt"; - - // public static void load() throws FileNotFoundException { - // Scanner reader = new Scanner(new File(FILE_PATH)); - // String line; - // while (reader.hasNext()) { - // line = reader.nextLine(); - // boolean isPacked = line.charAt(1) == 'X'; - // String itemDesc = line.substring(4); - // Item item = new Item(itemDesc, isPacked); - // PackingList.getItemList().add(item); - // } - // } - - public static void save() { + private static final String FILE_PATH = "packing_list.txt"; + + /** + * Loads packingList with items containing relevant packedQuantity, totalQuantity and item description + * @throws FileNotFoundException + */ + public static void load() throws FileNotFoundException { + Scanner reader = new Scanner(new File(FILE_PATH)); + String line; + while (reader.hasNext()) { + line = reader.nextLine(); + + // packedQuantity of an item is integer form of number after first [ + int packedQuantity = Integer.parseInt(String.valueOf(line.charAt(line.indexOf('[') + 1))); + + // totalQuantity of an item is integer form of number after first / + int totalQuantity = Integer.parseInt(String.valueOf(line.charAt(line.indexOf('/') + 1))); + + // itemDesc will be after a whitespace after first ] + String itemDesc = line.substring(line.indexOf(']') + 2); + Item item = new Item(totalQuantity, packedQuantity, itemDesc); + PackingList.getItemList().add(item); + } + } + + /** + * saves packingList onto user's file directory + * @param packingList + */ + public static void save(PackingList packingList) { try { - writeToFile(); + writeToFile(packingList); } catch (IOException e) { System.out.println("Something went wrong: " + e.getMessage()); } } - public static void writeToFile() throws IOException { + public static void writeToFile(PackingList packingList) throws IOException { FileWriter fw = new FileWriter(FILE_PATH); - ArrayList packingList = PackingList.getItemList(); for (int i = 0; i < packingList.size(); i++) { - fw.write(packingList.get(i).toString() + "\n"); + fw.write(PackingList.get(i).toString() + "\n"); } + fw.close(); } } diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index d91070a534..f43647ba0a 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -6,6 +6,8 @@ * Ui class contains methods to print messages to user interface on Command Line Interface */ public class Ui { + private static final String RETURN_USER_GREET = "Welcome back, User!"; + private static final String NEW_USER_GREET = "No save files detected. Hello new user!"; public static String logo = " ____ _____ _\n" + "| _ \\ | __ \\ | |\n" + "| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __\n" @@ -74,7 +76,7 @@ public static void helpMessage() { /** * Prints messages(s) to the user * - * @param message + * @param message Message to be shown to the user */ public static void printToUser(String... message) { printLine(); @@ -83,4 +85,11 @@ public static void printToUser(String... message) { } printLine(); } + + public static void showUserReturn() { + printToUser(RETURN_USER_GREET); + } + public static void showNewUser() { + printToUser(NEW_USER_GREET); + } } diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index 4c2c0a3891..e534ce9420 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -19,12 +19,29 @@ public int getTotalQuantity() { private final int totalQuantity; + /** + * Constructor of an Item class used in @AddCommand + * @param quantity no. of items user wants to pack + * @param description name of the item + */ public Item(int quantity, String description) { this.itemName = description; packedQuantity = 0; this.totalQuantity = quantity; } + /** + * Constructor of an Item class used in @Storage + * @param totalQuantity total no. of items needed to pack shown in save file + * @param packedQuantity no. of items currently packed shown in the save file + * @param description name of item to be packed shown in save file + */ + public Item(int totalQuantity, int packedQuantity, String description) { + itemName = description; + this.packedQuantity = packedQuantity; + this.totalQuantity = totalQuantity; + } + // public Item(String description, boolean isPacked) { // this.itemName = description; // this.isPacked = isPacked; From d5be78c75d2aecedb6de0838b9688248cb508eb1 Mon Sep 17 00:00:00 2001 From: coregano Date: Sun, 2 Apr 2023 00:55:37 +0800 Subject: [PATCH 087/207] fix - improve load() function in Storage class to read quantities of above 9 --- .../java/bagpacker/iohandler/Storage.java | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java index 900ad2e34b..bebfa55335 100644 --- a/src/main/java/bagpacker/iohandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -21,31 +21,42 @@ public class Storage { private static final String FILE_PATH = "packing_list.txt"; /** - * Loads packingList with items containing relevant packedQuantity, totalQuantity and item description - * @throws FileNotFoundException + * Loads packingList with items saved in save file + * @throws FileNotFoundException when no save file in directory FILE_PATH is found */ public static void load() throws FileNotFoundException { Scanner reader = new Scanner(new File(FILE_PATH)); String line; while (reader.hasNext()) { line = reader.nextLine(); + PackingList.getItemList().add(readItem(line)); + } + } + + /** + * Returns an item with details saved in save file + * @param line line from save file + * @return item containing relevant packedQuantity, totalQuantity and item description + */ + private static Item readItem(String line) { + int openBracketIndex = line.indexOf('['); + int forwardSlashIndex = line.indexOf('/'); + int closeBracketIndex = line.indexOf(']'); - // packedQuantity of an item is integer form of number after first [ - int packedQuantity = Integer.parseInt(String.valueOf(line.charAt(line.indexOf('[') + 1))); + // packedQuantity of an item is integer form of number after '[' and before '/' + int packedQuantity = Integer.parseInt(line.substring(openBracketIndex + 1, forwardSlashIndex)); - // totalQuantity of an item is integer form of number after first / - int totalQuantity = Integer.parseInt(String.valueOf(line.charAt(line.indexOf('/') + 1))); + // totalQuantity of an item is integer form of number after '/' and before ']' + int totalQuantity = Integer.parseInt(line.substring(forwardSlashIndex + 1, closeBracketIndex)); - // itemDesc will be after a whitespace after first ] - String itemDesc = line.substring(line.indexOf(']') + 2); - Item item = new Item(totalQuantity, packedQuantity, itemDesc); - PackingList.getItemList().add(item); - } + // itemDesc will be after '] ' + String itemDesc = line.substring(line.indexOf(']') + 2); + return new Item(totalQuantity, packedQuantity, itemDesc); } /** - * saves packingList onto user's file directory - * @param packingList + * saves current list of items onto file directory FILE_PATH + * @param packingList list of items used by user */ public static void save(PackingList packingList) { try { From 647710360393e4f29c691f19aae09ab317251984 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 3 Apr 2023 03:51:01 +0800 Subject: [PATCH 088/207] Update the add function to deal with repeated items of same name --- .../java/bagpacker/commands/AddCommand.java | 7 +++ src/main/java/bagpacker/iohandler/Parser.java | 2 +- src/main/java/bagpacker/packingfunc/Item.java | 6 ++- .../bagpacker/packingfunc/PackingList.java | 44 ++++++++++++++++++- 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index 67f4a60e09..60493a35e3 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -6,6 +6,8 @@ public class AddCommand extends Command { public static final String MSG_SUCCESS_ADD = "New item added: %s"; + public static final String MSG_SUCCESS_ADD_EXISTING = "Add to quantity of existing item: %s"; + public static final String HELP_MSG = "add : Adds quantity and name of item to the packing list.\n" + "\tExample: add 3 /of toothbrush\n" + "\tMeaning: add quantity of 3 toothbrushes to the packing list"; @@ -18,6 +20,11 @@ public AddCommand(Item item) { @Override public void execute(PackingList packingList) { + if(PackingList.itemFinder(item.getItemName())){ + PackingList.addItemQuantity(item.getItemName(), item.getTotalQuantity()); + Ui.printToUser(String.format(MSG_SUCCESS_ADD_EXISTING, PackingList.getExistingItem(item.getItemName()))); + return; + } this.packingList = packingList; packingList.addItem(item); Ui.printToUser(String.format(MSG_SUCCESS_ADD, item)); diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index b37c7d37b3..9a903d39a2 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -416,7 +416,7 @@ public static Command createUnpackObj() { "This item is not even packed yet"); } return new IncorrectCommand("Invalid Input Quantity", - "Try to input a positive quantity that does not exceed "+ quantityPacked +" to be packed"); + "Try to input a positive quantity that does not exceed "+ quantityPacked); } } diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index 5287246cdc..72c9dc2162 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -17,7 +17,11 @@ public int getTotalQuantity() { return totalQuantity; } - private final int totalQuantity; + public void setTotalQuantity(int totalQuantity) { + this.totalQuantity = totalQuantity; + } + + private int totalQuantity; public int getUnpackedQuantity() { return totalQuantity - packedQuantity; } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index a2eec82c78..3f908f187f 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -1,13 +1,55 @@ package bagpacker.packingfunc; - import java.util.ArrayList; /** * PackingList class contains methods to manipulate the users packing list */ public class PackingList { + /*** + * Checks if item of the same name as itemName is found in the current packing list + * + * @param itemName + * @return true if item of same name as itemName is found else false + */ + public static boolean itemFinder(String itemName) { + for (Item item : itemList) { + if (itemName.equals(item.getItemName())) { + return true; + } + } + return false; + } + /*** + * getExistingItem returns the object of type Item of the same name as input itemName + * + * this should only be called after checking that item does exist in the itemList + * + * @param itemName + * @return item of the name itemName + */ + public static Item getExistingItem(String itemName) { + Item existingItem = null; + for (int i = 0; i < itemList.size(); i++) { + if (itemName.equals(itemList.get(i).getItemName())) { + existingItem = itemList.get(i); + } + } + assert(existingItem != null); + return existingItem; + } + /*** + * Adds the added quantity to the current total quantity of an item in the itemList + * + * @param itemName name of the item to add total quantity to be packed + * @param addQty the quantity to add to the old total + */ + public static void addItemQuantity(String itemName, int addQty) { + Item itemToAdd = getExistingItem(itemName); + int totalQuantity = itemToAdd.getTotalQuantity(); + itemToAdd.setTotalQuantity(totalQuantity + addQty); + } private static ArrayList itemList = new ArrayList<>(); private static int targetIndex = -1; From 6e617ca8d2eeeaf559eac77af9c6097bb1267b65 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 3 Apr 2023 04:01:36 +0800 Subject: [PATCH 089/207] Refactor code to fit checkstyle --- src/main/java/bagpacker/iohandler/Parser.java | 36 +++++++--------- .../java/bagpacker/iohandler/Storage.java | 4 -- src/main/java/bagpacker/iohandler/Ui.java | 15 +++++-- src/main/java/bagpacker/packingfunc/Item.java | 43 ++++++------------- .../bagpacker/packingfunc/PackingList.java | 6 +-- 5 files changed, 43 insertions(+), 61 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 9a903d39a2..ce7156cb21 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -22,8 +22,6 @@ import java.util.Arrays; import java.util.Scanner; -import static bagpacker.commands.PackCommand.HELP_MSG; - /** * Parser class contains methods to manipulate user input */ @@ -201,7 +199,7 @@ public static String getItemDescrip() { * Attempts to create AddCommand object to be executed where it is called from * * @return AddCommand the command to be executed to add an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createAddObj() { try { @@ -237,7 +235,7 @@ public static String[] getAddVariables() throws InvalidVariablesException { * Attempts to create DeleteCommand object to be executed where it is called from * * @return DeleteCommand the command to be executed to delete an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createDeleteObj() { try { @@ -275,7 +273,7 @@ public static int[] getQuantityAndIndex() throws InvalidVariablesException, Inva * Attempts to create PackCommand object to be executed where it is called from * * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createPackObj() { int quantityNotPacked = 0; @@ -284,7 +282,7 @@ public static Command createPackObj() { int itemQuantity = Integer.parseInt(quantityAndIndex[0]); int itemIndex = Integer.parseInt(quantityAndIndex[1]); quantityNotPacked = PackingList.get(itemIndex - 1).getUnpackedQuantity(); - if(itemQuantity < 1 | itemQuantity > quantityNotPacked){ + if (itemQuantity < 1 | itemQuantity > quantityNotPacked) { throw new InvalidVariablesException(); } return new PackCommand(itemQuantity, itemIndex); @@ -300,8 +298,8 @@ public static Command createPackObj() { } catch (ArrayIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid Input Variables", PackCommand.HELP_MSG); - } catch (InvalidVariablesException e){ - if(quantityNotPacked == 0){ + } catch (InvalidVariablesException e) { + if (quantityNotPacked == 0) { return new IncorrectCommand("Invalid Pack Usage", "This item is fully packed"); } @@ -315,7 +313,7 @@ public static Command createPackObj() { * Attempts to create PackCommand object to be executed where it is called from * * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static String[] getPackVariables() throws InvalidIndexException { @@ -365,13 +363,11 @@ public static Command createPackAllObj() { } - - /** * Attempts to create UnpackCommand object to be executed where it is called from * * @return UnpackCommand the command to be executed to unpack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createUnpackObj() { int quantityPacked = 0; @@ -393,7 +389,7 @@ public static Command createUnpackObj() { quantityPacked = PackingList.get(itemIndex - 1).getPackedQuantity(); - if(itemQuantity < 1 | itemQuantity > quantityPacked){ + if (itemQuantity < 1 | itemQuantity > quantityPacked) { throw new InvalidVariablesException(); } @@ -410,14 +406,14 @@ public static Command createUnpackObj() { } catch (ArrayIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid Input Variables", UnpackCommand.HELP_MSG); - } catch (InvalidVariablesException e){ - if(quantityPacked == 0){ - return new IncorrectCommand("Invalid Unpack Usage", - "This item is not even packed yet"); + } catch (InvalidVariablesException e) { + if (quantityPacked == 0) { + return new IncorrectCommand("Invalid Unpack Usage", + "This item is not even packed yet"); + } + return new IncorrectCommand("Invalid Input Quantity", + "Try to input a positive quantity that does not exceed " + quantityPacked); } - return new IncorrectCommand("Invalid Input Quantity", - "Try to input a positive quantity that does not exceed "+ quantityPacked); - } } public static Command listCommand() { diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java index bebfa55335..2c0d6e8bbe 100644 --- a/src/main/java/bagpacker/iohandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -3,15 +3,11 @@ import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; -//import java.io.File; -//import java.io.FileNotFoundException; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; -import java.util.ArrayList; import java.util.Scanner; -//import java.util.Scanner; /** * Storage class contains methods to save and retrieve saved packing list in txt file diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index b95748a020..a8bd3369c6 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -1,13 +1,19 @@ package bagpacker.iohandler; -import bagpacker.commands.*; + +import bagpacker.commands.AddCommand; +import bagpacker.commands.ByeCommand; +import bagpacker.commands.DeleteCommand; +import bagpacker.commands.DeleteListCommand; +import bagpacker.commands.ListCommand; +import bagpacker.commands.PackAllCommand; +import bagpacker.commands.PackCommand; +import bagpacker.commands.UnpackCommand; /** * Ui class contains methods to print messages to user interface on Command Line Interface */ public class Ui { - private static final String RETURN_USER_GREET = "Welcome back, User!"; - private static final String NEW_USER_GREET = "No save files detected. Hello new user!"; public static String logo = " ____ _____ _\n" + "| _ \\ | __ \\ | |\n" + "| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __\n" @@ -16,6 +22,8 @@ public class Ui { + "|____/ \\__,_|\\__, |_| \\__,_|\\___|_|\\_\\___|_|\n" + " __/ |\n" + " |___/\n"; + private static final String RETURN_USER_GREET = "Welcome back, User!"; + private static final String NEW_USER_GREET = "No save files detected. Hello new user!"; public static void printErrorLine() { System.out.println("/////////////////////////////////////////////////////////////"); @@ -90,6 +98,7 @@ public static void printToUser(String... message) { public static void showUserReturn() { printToUser(RETURN_USER_GREET); } + public static void showNewUser() { printToUser(NEW_USER_GREET); } diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index 72c9dc2162..9cc3e0170c 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -7,24 +7,9 @@ public class Item { private final String itemName; - public int getPackedQuantity() { - return packedQuantity; - } - private int packedQuantity; - public int getTotalQuantity() { - return totalQuantity; - } - - public void setTotalQuantity(int totalQuantity) { - this.totalQuantity = totalQuantity; - } - private int totalQuantity; - public int getUnpackedQuantity() { - return totalQuantity - packedQuantity; - } /** * Constructor of an Item class used in @AddCommand @@ -49,27 +34,25 @@ public Item(int totalQuantity, int packedQuantity, String description) { this.totalQuantity = totalQuantity; } - // public Item(String description, boolean isPacked) { - // this.itemName = description; - // this.isPacked = isPacked; - // } + public int getTotalQuantity() { + return totalQuantity; + } + + public int getPackedQuantity() { + return packedQuantity; + } + public void setTotalQuantity(int totalQuantity) { + this.totalQuantity = totalQuantity; + } - // public void setPackIcon() { - // if (this.isPacked) { - // this.packIcon = "X"; - // } else { - // this.packIcon = " "; - // } - // } + public int getUnpackedQuantity() { + return totalQuantity - packedQuantity; + } public String getItemName() { return itemName; } - // public boolean getIsPacked() { - // return isPacked; - // } - public void setPacked(int quantity) { this.packedQuantity += quantity; } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index 3f908f187f..47616470ae 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -5,6 +5,8 @@ * PackingList class contains methods to manipulate the users packing list */ public class PackingList { + private static ArrayList itemList = new ArrayList<>(); + /*** * Checks if item of the same name as itemName is found in the current packing list * @@ -38,7 +40,6 @@ public static Item getExistingItem(String itemName) { assert(existingItem != null); return existingItem; } - /*** * Adds the added quantity to the current total quantity of an item in the itemList * @@ -50,9 +51,6 @@ public static void addItemQuantity(String itemName, int addQty) { int totalQuantity = itemToAdd.getTotalQuantity(); itemToAdd.setTotalQuantity(totalQuantity + addQty); } - private static ArrayList itemList = new ArrayList<>(); - - private static int targetIndex = -1; public static void setItemList(ArrayList itemList) { PackingList.itemList = itemList; From 1cc74b595a51930074c8d3c4a0d0e240896ff7a8 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 3 Apr 2023 04:04:55 +0800 Subject: [PATCH 090/207] Update parser class J-unit test --- .../java/bagpacker/iohandlertest/ParserTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index 88a22b6b36..156eacdc51 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -35,7 +35,7 @@ public void fullInputTest() { @Test public void addCommandTest() { - String userInput = " add this item "; + String userInput = " add 500 /of this item "; InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); System.setIn(inStream); assertEquals(AddCommand.class, Parser.parse().getClass()); @@ -61,7 +61,7 @@ public void addVariableTest() throws InvalidIndexException, InvalidVariablesExce @Test public void deleteCommandTest() { - String userInput1 = " add this item "; + String userInput1 = " add 3 /of this item "; String userInput2 = " delete 1 "; InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); System.setIn(inStream); @@ -74,8 +74,8 @@ public void deleteCommandTest() { @Test public void packCommandTest() { - String userInput1 = " add this item "; - String userInput2 = " pack 1 "; + String userInput1 = " add 3 /of this item "; + String userInput2 = " pack 1 /of 1"; InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); System.setIn(inStream); PackingList dummyPackingList = new PackingList(); @@ -87,9 +87,9 @@ public void packCommandTest() { @Test public void unpackCommandTest() { - String userInput1 = " add this item "; - String userInput2 = " pack 1 "; - String userInput3 = " Unpack 1 "; + String userInput1 = " add 3 /of this item "; + String userInput2 = " pack 2 /of 1"; + String userInput3 = " Unpack 1 /of 1"; PackingList dummyPackingList = new PackingList(); InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); @@ -107,7 +107,7 @@ public void unpackCommandTest() { @Test public void listCommandTest() { - String userInput1 = " add this item "; + String userInput1 = " add 1 /of this item "; String userInput2 = " lIST "; PackingList dummyPackingList = new PackingList(); From 316b7979e7c64f4089970e4e3daf5397625c245f Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 3 Apr 2023 21:04:58 +0800 Subject: [PATCH 091/207] Update DG for add command --- docs/DeveloperGuide.md | 23 +++++++----- docs/img_1.png | Bin 38579 -> 0 bytes docs/umlDiagrams/AddExistingItemDiagram.png | Bin 0 -> 24246 bytes docs/umlDiagrams/AddExistingItemDiagram.puml | 35 ++++++++++++++++++ .../java/bagpacker/commands/AddCommand.java | 2 +- src/main/java/bagpacker/iohandler/Parser.java | 10 ++--- .../bagpacker/packingfunc/PackingList.java | 2 +- 7 files changed, 56 insertions(+), 16 deletions(-) delete mode 100644 docs/img_1.png create mode 100644 docs/umlDiagrams/AddExistingItemDiagram.png create mode 100644 docs/umlDiagrams/AddExistingItemDiagram.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 1a31a933ff..b2d090df5a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -24,19 +24,24 @@ It then updates the ```quantity``` variable according to the quantity inputted b #### Preventing duplicate items -When using the `add` function, we have decided to implement a passive function that checks whether the item with the same name already exists in the packingList. +When using the `add` function, we have decided to implement method that checks whether the item with the same name already exists in the packingList. -This is done through the `contains()` method in class `PackingList()`, which is called during `execute` in an `AddCommand` object. +This is done through the `itemFinder()` method in class `PackingList()`, which is called during `AddCommand.execute()`. -Below is the UML diagram showing what occurs during `add` function. -![img_1.png](img_1.png) -When `execute()` is called in `a`(object of class `AddCommand`), the `addItem(item)` method is called in the object `packingList`. This method will see if method `contains()` will return `true`. -. -The `contains()` method, which is shown as a reference on the right of the UML diagram, is a boolean method that loops through all items in the packingList, and returns `true` if any of the existing items have the same description as the item to be added in `toAdd`, and `false` otherwise. +Below is the UML diagram showing what occurs during `add` function when trying to add an item that already exists. -When `contains()` returns `true`, method `addItem(item)` will be interrupted and a `DuplicateItemException` will be thrown from `packingList`, which will be caught by `a`. If `contains()` returns false, the item will be added onto `packingList`. +![AddExistingItemDiagram.png](C:\Users\sunil\desktop\NUS\CS2113\Team_Project\docs\umlDiagrams\AddExistingItemDiagram.png) + +When `AddCommand.execute()` is called in `BagPacker`, the `PackingList.itemFinder()` method is called. + +The `PackingList.itemFinder()` method loops through all items in the packingList, and returns `true` if any of the existing items have the same name as the item to be added, else `false`. + +If `PackingList.itemFinder()` returns `true`, method `AddToItemQty(itemName, addQty)` will be called to update the existing item in the packing list by adding the addQty to the current total quantity of that item. + +If `PackingList.itemFinder()` returns false, the item will be added onto `packingList` using `PackingList.AddItem(Item)`. + +In both scenarios, the relevant `ui.printToUser` messages (omitted in the sequence diagram for easier reading) will be called to print a message to the user. -In both scenarios, `ui.printToUser` will be called to print a message to the user. In the former case, `ExistItemError` will be printed, while `AddSuccess` will be shown if the item was added with no issues. #### Delete Command diff --git a/docs/img_1.png b/docs/img_1.png deleted file mode 100644 index 6899bf1bc9187a05077c7cf5c275153ce46b910a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38579 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 diff --git a/docs/umlDiagrams/AddExistingItemDiagram.png b/docs/umlDiagrams/AddExistingItemDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..2de5da7eeb7167a7160b1038732e879884471138 GIT binary patch literal 24246 zcmd43bwHI{_bp6{h=NM0lypjWi->f0NrQB6ItA$lsV&kWDbgw32qN9xu<8C5>N)zp z_q+FgzyH4T&pz(`?B`i)%{j*$W306al$92}cjxgPI5@a_Vy|Av!@(hxz`?6$%yRnC>JlIF85u8Kx^_9J2#Nf3k6_4&2=jNDe{{zvA()kVtE3s)kEU`hKSogPQOTKEm`oV401fa56rNnBzn$+=a*Ex8NH=;!fm z{W7Irwc;G9?F*t6=V$n)kI#=2SI)scZq@mU$vC%4X{;TEXPyKT0Y&~Cn1!s zE0voaEV{m5cWc@h{h-`OW^iif3~r8nOOBbJO@Xxb%ql|_+BU-AW2{i?wTSvSWZLPL ze*X8tutw43iiD?398nh|V_1*vzbtq2;Tu?ecJiguLh@nJeC`O>+{`=Ce~hkcA zB$KhSPyL;}5<$quDm$K+HO@tk=4h>Te;c_gr-aHBWIw7xcJ zU%zlwP1UEg=EKZ}kRs|-Ghr(;>7u6(Gfwok#Be<8h-!^&c^BSYf*ork&UeAw`JxRtgFPyY;LM5dk&#KEm4l=cs;LVblIlu
    Qsbv6tB zu+3NAln}`fB7xJ@Zy_Ne8*#&3vANXL)Lr{}l8i}x9g?*0s}aNbL;NSiB6YiTRMnDF zDcoAlJ{gUeycDbGVtl%BgH?7Tl+wvLybNtfpVvZq${u>5KN8@Vt6Qg|<$ltINrnua zWnyyU%eZ|XeRC*8pOiUl#<)B6t~w$=Yt__0diZdCZcgsw z^QDXo!}Tkd=z@`0-LzOZ`**%jVo`>uL@`kVGhq$qECl4qVKE8_LdyIr?77b#%RR%* z0W!y{-zd4O)2fq5AL0&_=&wA)G%hzC5}N8QTts8aXO<$jHegRkWHa0QidNLpR<8K- z(Y)6S;n&Y}>c75ciay>Euz@YURm$f_M@M(Qz7$!PvM1LlqHTTwqJF=f4?g_RF0yCZ zB&uK*)jp_zhNLf3PkU{BXJMgxzNleZ#(|uQiqrE7AyYz>Ui;#~&X1y*h_7!i*U)V* zPE6g9T4e<;?VGy0CHTMh3tZ#i9@l1P8!IZF$_Pwl5gIRbIg~NrD9rBYWSD$wB;-4T zayukANlQ)P-Ix6&opRjv6xKsw+7H#Yhpx2@Zp!xT+qZE$ZHpU+s~h(v_g9q0 z?o1qS3HeTAi(aj!9}ee_=rM71@Vno_rNvnU3tOb!tX1Rj+IigV?7*2-N+bxW2U-VN z9gy?zcne$VZm^ycN8uS&rzv}?CD{BmXr(tvWz%ZoWcX(uzL-ZP8_^iiCTo=_SxzEv zE|K8C?PpLe_GzS0*J1v8&5~`u#q5YLl&#vhyp_-VPSEu``7&HOqcamT^F5o!X{lki#rQ#ip0zp|9pre*hV-Q*r_H>|V6m<~kE2`Q zlIcD=0r%kZG}BDlj)tp4gx-^jQ=&oS)+Y4wxH}fA6_&n5_2Z)L#77kl7jF`b$l(Y` z_K?zS4@juBgV<*1(6y_pAkde@8rEkAu^@XNJcxu9FoQe^CRJ+Ll7lUF3JQA~ zwA3(L59xROQ=U~LzLxPDXu#UXRIRe@nXYSBlXSXpD>Yw2!=ZZ>orCuw7$5PP?`B!w z`ul%=&puPKAlv4vmi69K_UW^S&M0#8@*mMZc-ALzjPZGVk^Bq*s?(p+`cy>TE#9YV@Gj`BGvuy_U*lV!^9huSb%y(V&aO4PSce?o2vax1vL(*kEg|* zs@R!$gO-K^P}C+Ph-&%pWbb;hU&pI8nzDiD!GnbNoWVFVg<1l;P=5aUuV1;XoOH$f zVK5lC-Ev+U%a<@BfzVG(7Nu4*o>uU6b#-iJ4F=hgKa0^Qnxc1#Fw=Ah=abl{6xQyG z+OaN`99h$qzUKK^`@KXKW7OcfI(LX^c0PvItSX&!fYGM}EPV|LkxjZQlYc6!#YQGo znt4q9G)#wVt6r_tWesOvqkL1d+*~U3u|u`P#z#w~+fc!5PI(cm{jpAntj`sC~w%y>daIS5Vis7jZNQ9DV$z(aR|+Doze+DcBtw ztQ=woYA7cMW@?&51!dGdo3IK`O&JtIC*)1WrRGBsC@_l?cb@ilo^F?Z9LZ4fjZ=!ji=-lQ!}sME4Yi zt*V`j-mA(&-BunKq?fiu*r1-JhAJ4qxr1t6;MUF%1EX==auVRF=!NX ztRav<0B8#hX2oBM$%MbvtABa3vJE|@v|+cLEF?5Og(;5v{kTkEQNet8CZ`7S@6C@- zZ_gH(H9+f%=%+{_;ci~fMhGYDO+98g$0o+Ms>c0j$7$4Kum`ekXZ%pO#<71eZ};Hf zlU%yAcvp69VAet}hwJ&-+36|vn+f)?88@o9IPM>kK_vy5Y41%$!*rhhq#a~XLA#WE zL$f6wk4XE)UcHUMf|rxK3*i-m&tQg8r^rZgWDL?O`qiB8&h>7(eR-U-j35xvIeBvgQx2;ZhVqK=kcsyE+(pODft|f93N0c-t!Xd{q<_4i{_E zk4RHxgn_62yGY?%gZBW&*yaS0QD&&~pqn5a_6scMJ+AdTVt z;@airUtH$YWCgAumS+c#ep5l4g|^Vn=6V;;Cq;uN z$<&{%Cza?^=EQ%q7Vrhr4I&ew4*`PVN;t zG-@J7Y~USO+?IKbeYaXri2Z-~##tj;$F28faJB@#_4npbZwPh-D({VOgJbrlym=9% z*hRW|?LdMy(%>C<<3`+L9D!TpzUBVpE2b*4uLsjD1H>LSxT-Lr84zdXrc^Yn|H&KT zGK>!EkXQY0X6mO-_gAn#FWK*%x^|W3=eI5 zorYR%dwBonzvB^QUNe@U`p|>VW^HFt?^5s!6(fUxXrl3YH<3xp#+iEy5kcU`;Oy=R z7U~aFJOyuOyeDqA@D^&oLo9_~e(a^$o@ylwLGTsh6G9(H@O>ux_iXVb6EPRx(KD_h zApgfb49t8s|LbDzMbybMStq+#kGkT3cCKntl-6*e{nxC~T$G8#8ZIj-)ASnUwN5)w zJ?TgPIo&W91PA67toyR6DLo>cI`y@OOx>w{SU~s?4y02;dTKt?p6+#M5PhD#iI%|= zV?LqoxKMU0wU@$t+pq4HWg9mIVRw5} z9P1x;(Dhw>X+gvypn8=kP_LLf57u6z=2;*)gVyv+rOj4jqt}?-OEbd7!YNaSjW&q0 z^DPwI^VegFB4%rY|DGO zD@ArQuwj516loV-?5$wrn%Z^Z>@peGalpn8eYL82X)Rlo>fP4Za_v@kapp$|0yBI+T=hBww24xa^3K_tcFPj zKKy8Ko9bk1e!8Q>I_@qi>c#%@gVyr$t_CC6SF0K7sE;4LRf-5wXX6!gIx%3|I+WiD z*v&P^>)q*)ZESi4F3n2{uGWb;D@UvLd3LypXWHokDH&H08Hk_!Q>gadl$gqz$i!4M1sD6z#>El5rbjAII^b))2okKog$8(*Y@z3m7o;`y&iyT|LD zyZBrt0t($;UOob9ocamj^MbDL>75Jh;T4usAb%zBXG%z+{F$DXHDIOM#Ag;k$ewH&3!i0Vxk;0IJ1$$l+wAUiNi6Jo|lIs z#l^)--SO9Z?L?yCgaw*aw(|0W>Fy5R%lQykEUF3fh~cVRaFzI= zx5VPUfFKA<0Cg$#rZ0sD_wi$w^COGA4J_IuqEt00XMhR(V5}>rS~ZTtpVXqSbBI`V zTJ@W^r=7MZ)rz$Fa7K!BK1eU5Z;cz67Q(}Ed4qP-B_V&r>%HuBz!rTLFNBdKR(gkA z>dnhAd@hp#;ycqG=UZ~=FZV7oCE^oVP3Jc@YD~V7X!o;51K!35*(IKdsC3#PL@U&+ z8qAVn;h4M+K!DA>(s;Q|7U?ZTEDZT`bJJVVfmRbx93|$Nw zv$0nc{(bY#6GGZJ|$WY-~I{JV0Z=zC4~$17b98bLjlu6ZU~f2^Z}e#{%I1 zbSM;xO{+Xv1u~y1nnNyXk;{;#kW#I{ZKyR z-o(R|51!AoYdN1j^(HrMex_ADKwlz#eB`vt6j!WlD!Nce6TjOvOCx83Fhn1v1@)p4@PCCQ*kStd{EBNJ1_ilUgThy*J<5(eVmO=_&{E-sAGD z)79V4Z?e`o`dIfJ&qIuGO11z%(+5JIaHzUno*jZ&?O#2_|6m3uh^{+O@e$^evxe%p zB@Ga)t-G5AKs!ozR_S7^#CalX?#9MOo%OdD+M;aHX@%N610S1*pipF5WxDgJ>2Sd1 zV=pbnSw9wxms_|jtsm2gB{8URa}lR9t}Ptyb6Bd2yY_z&m>G8vLw6kDH6N!jy*iQ4 z3<~DkA}lW;Rm30{--okRj8a-XL1X|?b##qkw-_(Zayx~|wPwz4Pt{mrY$O;lb8{zJ zeo~W+5O^gmZB$ZI!*f3CeT6M>Yqmji*7se>6nZ>^PFBrzWo2a)xkQjguIn4Z;@bpI zUFR$lu1k#Jp#sh@GDGPP{Pa6w3_(ORqLUB8TQinr?Q?plCOu#KuZm9V_$=Jy-_u|D z$Hpgg3d6=Q;a zzj;x`L`P4iCct9j_ONi^Ag>pGYzro5$Jl3MVPWB&$*N|S3ago{Co>@-cY|^Rxn%_f zU@ln+n-dj9Cn0md@>?G%>YpzzW<278pMpoZb*q$YWdZ~7PuFK@DRB1xwcsC@F?<{^9vnE>KHr6vADNgOC@{}y-n3UQU-*?IS<&q3>I#AA>zr)y z+_^gA*bLZOiDodxjHETtCEO3biF#h0u2jr;NEq6J-2Ft&&kq%l*+v=U24M!en3x!#MTTNmyh5=wO2F@Uwg#5AAHb6=GZ$AC zz%jZ60ne*1W+T&}T-fJ$G8c;)u4o?Ry$pTqdbFv_gnV|feG9IUm5SkAB6RkKr92_P z9jOI0MSB9aRc_--icxNSb&l`)w4Am9wK8yML4mQ>O7kG zpBXRh;sd6Y{rv5nbz{ULod!Yz0;vM5GLvsU+a?O~@{@!(?7d_{%Bj*R+yFcQm}^(t zQ}+*DTIMSk)YjG}a#%?-Nd!H4)0Qa4BrPQs8Wfb){GQ*v+Ksjs5yw@#%62Ki7`k_K zRH$4q{w-ZpEy{D}_5O0N{Y4aXQDT06p6U@MX7h*p1{hp8&om)m?ru83ol4s$eU$gB z1L!j$Z*~&{WhBfAwrp5)n5<`?e8^znwTB=USpbS?+-I3RYu;7?%gEW?odtxAI?8^f zcl+xN568o6jGA9gEHRP~VZ+e)oITatH~7HTlu$6NOH2mNzV$5{?#mForUo8{-jdd5cHjXmu}&mpae5KVD#>*pJ&S z=0ZDDT#oJ$(KYY2#btg`TS-Pi5N*-6-ltzn?HCspA#npO4`p5tplH+ef&M!+H3hJ@ z6Lbs3d}XOI^M4f_y0Z@;)@f-ZYep{P2fDT8z)CI_3HFbXly;VZVu>I#KP#-Ns4)J` zpkRRd1Il;=gPBj)K5eBl&7beeufa1TEH?s$oRUep_`8f>C3-;<_}yKae2_aI`MrG` z3cT;}FJ@hYH2an1L?^VfR%BdVVyPszW?hgZ_4Ag<|t$R3hs*U`V5XL0Sa=)ruvwQl>#&@5l z--b5EFbd1oLiT`P7e}K6f&jh1c*Jz0#hw8NMvyP>({T(pFeNGxP^7Ig{6rA z*cp<{Yi38lWa{0V4^a^B{QQCtE_8MT&GoyO#>0kH&x@87z!wycBVS!PA+(T29+%P9 zJI86KM1y-`0=lMJqW5O`MpVNOgM~g>M1<$m{M>52;babr7(RQ3c z^Aia^yFPSU_EgEKQu=Rwdb(_CwzAa!p})Dg&T%VG$20m9|3jwVI`q5eRyA2%t-Z77 zLfaQaL`0+hN4>5=dSb2b6WhfKB;useZ&OL0K`t*sli~(D9~>`L&Z2(0u`FDg7oo5F zCYc(vCM9e>@N1zHObf)Lz&In2lgaf7r7eDeN!FFzSabNfe2t*liq@ zhy-Jv2CVBz4NvC%)!1tHgJM~<-AYmn^3&Vdqr*SCE9GH1fG7pI%YDnlJp{m}Qk0-o zZI3FFkEbw@KSJwyaVq>~T=R;EyuDpOV52VbAgadRS$R_2&JOyWS9)F0H$o(p6woh1 zuDt#oPu^07cI1CTMRAODvEA?@P}b2*8s{l9bFvfX=}Evk&)`jgl?eyvC%ETv4Hic5`z&FlQ)l8RX4oi>foz2aC%Po>D$Eq*-lSIE4 z=+V`?LGRwXSL?FXSSN}h7PC+k7A_-&HN>T8wVL|Z>djtnU-sxZ9V1v`P|Fev>{zdC z@3~^+J#MHO-gI7rc~ma|d7@ovP?@AW{C$!}r=GGySXR(gH^o#Ggj=WTtj>UTFfdw2 zcKQ2Sk+Z*r$BvMa+x}U zz1e`@Bxv>i^pS80=eJ8H+WsK)O@64j2Lw`_VeEU0?H0P*LiE8~U>pp5N=(#{gZ);f zaSm6u6M1c+X5AIl$Fp__UYYG(3J(`SRQ;iF=FSRBmqtHBXWHdSS1CuG8r; zffhH{QeDFpeZ}Z4qgAmzJ@z7BQ#@8MW?V2&!W=f#`a?+wv-mY6-~)3su|w zAK#jM7Z&Cd^LZA7{!Or+e!THmWImzsap%a$IYPp1;2HIDRtQf$RrwdOjIN%M7-0RL z|G_O@_?UAa%HkUfa`herf$I3*df7#i-A02pCIWy><&fMDnKS9A{Cy={eCh#GBWnk( zcP%y^+Rt_LqGY6pi4$8Pw;=$?n|(NoDj8h+utUSU#0!|5VC)D(Bt=Lt<=1pSag)Ni z?f&~)&g2ml2>S3ca9-1lolXzDO(RqgoM{i2w#ezoFpCjB2c{+gm|9J#Idr8^*jiF?Baekyd`yb9j4GN?C*})CN0P24yfyEfcdp<(WF!#apDp&3EGB_pz z@kdVlZ0;o3+x(tM{}zEjaFaU(A(i8wFlf%BuFms=?PKjamlC4xc!m#&iNHnKY7NHS z4=-9+SO9v)eWfo2aLOq9*JA7)t~+(dKQydL?#h&UwO#D@3k(eo<`fo_g$iE+o;{r@ zfm=d}_5u=B4#fMj;c_;!A2H9g)W78k+V$|epWy>tveR&#hPX#e%4#A4^=DYNnO_6oM|9x;J@F*;xDN4il)ik71Rpn0xBNxqcUrbIHn=K zg;zoRz;VK5cnbdGu$p!&`ca_Kia0R2c$MzD()o~FT=r4A*BxsE1G1e)^zcNgdfTNt{j>C<;Xs*MqY6iv7VW}8Tizs=jl?soz98t&g;0V*uswwtRu5&;$d?+3O^0q{wSMhS{Q*QvEWO52PXddc{DXH)p~6lV zSd(?GDxWC>D044Z%}0v`y%DsvwLusa%4i1ghX6C*ddiBv)2I`<{L#o1m$xsTfkMH^jorF4dNTZTLfGL0y}r_1|8X=PzcJS zZcmsYw~J1Q!wu>akU z?uV=2d?~jG1w$XR9c_-Kchnq_UjRQ7xJt{9dewg5zW`dzH>}pEH?fw5k!rk~;60oe zd8JhmHePV@E>do8uAH2ly(p*qnf-KVkf^3+az%xcq-03-h1GN|7dyLh)k+7h_U(!qd-_9IV8B7yBT7#T>#3TCrAH_8Oq zpin+nn2ZfR{EP_FKivzj4-<=4*}U2R9lW~EFa5@RQc+r3T0nbIgO$MFbd+CR^=lz$ zmD4OnlS)M5Jun{ zzGmYG!v;pSep`s{2TX(dZ_3qUQF7B@H#1A59%<=U504mP6mIlzy8rm`IM9Bebp;cE z9#j~~AoQCPEK(WV7LTENfR9h-!I%mM2*KlDj|B`uu&?QgUkLOOETX$qfE!f5{BvJn z&MT+8bN_iO?p-9ok&gJ(-vq{%04$~1qJ->kx>1D=Ce8*Ur}{-`yfjh%^J#^Mz*-1( zL+$!SaEM0$wf_5&8-SB&k?Q#TCOjPu|232U!Q)8+c)gR7HqRP009x#tNW|GFeB7L4 z)V9frfwpQP9yFPM4pQ9L@z?UT-=7pIb393d)ez#*YHb0C~Hmu2|rwo}8TloBs$f z6*_819QV#&B!C><6(ALbRN}yLFb;j`7c@9cK8pF2KVuK{3#oc4HQ6z3ZHvo&CpM*QkMORQf9c zY{xNWy{$%zb-fXgft>~#L$(QacR@`}&4h3c5P>_>d=AFF4_=s*0hcZS;Y{U1*4t?S z-@6@b8=P+xHBeQ$9v2p9!OhbA=a}(;S*u-X{gg=RGhu+geS|0(OvCk65}$dF zNoEf)CcEZ=B~HW(*#&g*m$j*MP=-B0GrG68cj4@#qT?P*Zt7%@2bL_u9Xw#+m#sR` zbg=rZ`NuOjYwW-BGx-P!RA(OWe(K#$Rr!?59M`{h4h==OsuXHEFDDq+*42RnM~(-p zayRXyz{ee=i*kXwv$Hds)pW96oPo@P-{xT=>FxVJUn+VHPM156(5gxI5L11JWJjAjDB6#Spcj#QGl+1&snQ{?5#TPP@^FJ3g> zhnwa7GYzzMJ|Pzum-LsR9d~3)0Y(E(8}Jmak^HZ4Z@M5{H3<#~cg5182*Y`y{RIu9 zhe&{2>hgQJ`b0!TP%C6f0`j7F7Jo}91h0gpL~HvA{Eblhg&TxDS%Y`p{hSPddlQg9 zhwH;h>=us+38gy+25vT3Xxb6rRPlaltFs%Z0gs-x17*PHdPJv?b(hN*G`%JqIJg%- z<=A>RKr8D>OvaP;TY&G)&CLNusbmia$Jq%EPsUJ_!pXc={~jy&0)U{1G9P?^ySZ1u zJ$P%bO*zD7c<|XjG#PX{yb~UOu<2z-=#^WiR&fr9b4*_eQDa zF<5=!R5Y9dhu{%<64@kb&ze9Ja~_VbP{&_J9WOIwX_BqoYkOip%3@sYemG1DJ3ijw zHouD`6s~ZXSfNbmkg49Q4vr1o{^vV6UD|9|!0|;TI4ZYz+>e<-aE)vAVl=&{Eg$iv{@5ryO9iDH*6ufWX0+c!0uY2OU_@H3yRZ@TE zLga-<5()!i{P&fM5tOfFWUK~Ko6@%m$?~CI1W%gu9f(ROk@fi{^JVj))xHb!JWKl3 zvTi;2kBNMG$RG%2Pm4f`1V;-)1w-t7Hk}b1wCSgZ_N2@^PalvyMCt!VAQXWLTmt$< zC7tOvHl=f@^+0%KLtVPs+uNt6>cI90Xc30a$_bE0&mPnp!Ae*{R;Bp1Ya5x5&)rQQ z>h@+D*Au38azFz}8HlF+s5>#>eg zxJ648vSMehzaQu@$PzV>z|-rvSPVDmm=iofgG#KbP^IGC8#V4S7wztJD!mVT$tY)@j zD0dGTo;NL)Nj2jZq@|k2uIuGjihW+u&VWn?IbbRbQs-b!1Uap8>9&1$&``TreosBb zf0c|-ie8HtzzkXegw}?_LIi#cL8HCR$IoWSBpYksqkO4)dKT7k5_>$I&$9CU7}~GE z#sCH2?wsEW&H@vcTTY2TiDS@#mb=dfQmRHNQ8;YcK70txY&t(udhGMb#fRqbiQMjs z`U|BetXbdTlapm<6T=@NJ`+fcL6I0k+&1Qf53?>19$MY78E?aG&`@5o*s$C;3u`u;8gMF zH!ZMoy^+BZeNm1l{=^`6x=wR2lq=RJhXoklG3#b_2NldyXxAsSLR#xF9ox&;d^ph` z`G6R`5c=q)SNmkxgXSo40(R1nM09}+g&U0hRq?+kybFV+N%ir2DUrriVAn)g?palj zu_LJ+BFQnaQ9&q8xy~B}h&dI_4|jXq5+t0i1d%IsYkFiTs_S?xHv`P5U(bln@>#U% zMdjL@OA1Gy*7)uXQJYMVL!&%I5U8NL-zeQF8j7mu!_C+%q=k0Gb|P7M1Z4|v0}TIF zH8;tyyK6me0FG6Vz6^Oi{BEgrw7)-mekfb!+KMGx*WU|2aQu!zKPKJD8v!M?>eDQk z%oQ=yl0wOs^Hs68L0Il2IvzB07*M9oO(MKS?SaoO3r4}^M8#}bc)?;>*yqx$&PUEi zA-WqXz_GVaj6yW(V|a+QsWIAc*geHsv1BtCKO>@4pgk}Vz!#so4JTAZ!mEG#Pc)i< z90U|d{gY~m<6=M!I)*#X~;sT%t3qpl(q_<4=V)W_TYzKR@zU9?7>{cdHeL0FQpgpCF(EHa=280 zWBk<*^+4HltZL)^Qm)HTWh_zt%mhHS3=VK|2H^V*(y-{iTqc?Zpc!(el_3Kj95Idb zZ&m_giXWFI zj!Y-7sxoWBa%wu4vJPkNm{2SYPQGC2`~qoz>JVjSGRQpcHhO_EEG3!f`%-^06f*fq?^%y?UcEUg`4V^m!T%QE8Xgc!Gi3MmZk`g+Cja=>l+6LD)IBo? zg9~|V8X2t$r5?`GSj__ji5Iat4ztEg>DzG{gS>c9`{kIygbXkYp1(3JjExVT`gFh) zLx#bDql&etV@#I4Ez-PnHvjUatgSBBeJyjv-si-}w-rGnNC_rdSt z!|!&vK?+3x+rgL${Goa3Q+27vb7|gI96;gmngC=74O32uRqqB zzcYmOGDZ6aiSkA=Tu*$CFD9ERRLW5*l8sDLG+jiFr9^3Hc>l6vXInc<{EH3kj}i)h z7h3stZA9o=oS;wuhl}Gno7YPGHn)7Pw6D)JKk7o(o&{U9WDrsO7MF6m4c+0VJ;lw^ z9S^K?s<43V7aJ|*u!FsV;ZLnWmz2)^+L*=zb=0OElNkOC>LS@Hye#%SS66LY^Motz zB>_?EduuVE`*0xJm2YM|(TOv^w5=%Ixp11Q-p$ErPE21BSIO%->OhhCTq3=Rp5u&H zo>7I?OFbkB)+pC{Pz{^I32cD~>ip{QszaCqnWwQ$%^LLwkIy3u1AV78ULB9|wacu0 zC~9-u9>ns^2zvJ|9>(hTfHm}wWA zTUdl+!38KIgU(>17>CQ50YEkk2JQbN83*pPlN zjN^Rk*g3SQH;n;V(Q=BqaAC5xVK*ZVjJ6dMgh#K#BQy`@h?_-oFxT(SKM zhW8vf1jUg(Cve`-HH?~F5tq^S^(h*btUc*BJ`UHoV)bSUdv(>p?veQGtjV{ct%%iC zM0Mt&dXf}2DWe3k`;437lW&(}Oes=$GZ!`M+%H>t39x>;CO-i*4u-T&HiS|WK1h!{ z?4_sM>daBykBKHgl;M%@`1C=fn2rbKjWIaHx!IPoJ<95u$MJFgf!1f~Wh;z3F4EEy zWMh7cbv7&&qPgEV|x)5x0S~k$B)Zhl_hBq zn9y&dXFisJAG_TPU6*=qvcuOVy@bJMV#(||G2N4mMx;G7rVMD{iq%B?(Jbkm_1)A7 z{`xATD6u{L$kf?u59#8a7avJPZi2*0kuQ_R+V78N%zuC6ngC}c%;HqC!ta??c*xdC zluL9Oirx3+VU89CWGl;5`EIbW@p>_>i!U2N!Cw%LfU zsT;Mr9XmW4mcj-?g-WaC*cd`qZK{v)q?8OfxPdQcbg|0Mqv)=SN~Bxvwd_%jb1-g= z{kt6zhL5LcMX;uyxU}YVx{nk(;iP!*Abe#_nnC9L#P0EDKtJS^^7BQ9LI8ml%eHCk zIV}t3kDkG}%Mdv;mBNSj5%0r++m28|xLSz#VuCz&K3U(^-teux5OWY*| zyu5YdFI5!duO9>pF=bPGbt0+boxu3H=Dh5`=+2ha1vs#ntnKcKM3CfiQHHV< z#E#`@I8-jdJB38sW`C7~MLAc{qV{LTvi8e^zbbJknJ3epe+*Z(hw@+61PDUJ2J;@u z=Vw?6^bS#FCg<>1TNqh;`9I=w@zb|Wv05EBKS?k9;R|GvcdI}?9uwO>S?_xZcFn*1 zV)NdV9j2$)sCebCTSZZ1zIgI|ls2bzKJd8jZ*+8txDKWG*`VlHcCDDg+T;6r?pf6N}^e%9Gg&Kqj{LG;LP5w?4f z2bTPL`RPavnu>DaaYnU(fy%mqxUua?ni7_z<`;feIyz3yO8LXYx;7~X-~<2Ff^Ucs z7Kz4va45Adsq3W*l{U%O?e<%LVE2YeW#CjGzX*(q%<9%m@LyG%IhDw3dYY#HT1N{7o9~0paYG=6}JZWw# z?nh;w@u!_K7Yn%giN|ln37k@)i03``kpldXP*4K=-?F`#lHTLJahBQs$l*W|;rlq+ z$&+3uO)?R<-0$oO)L+Jh@II{ta=bv{g z38Q>pYb2Z$uN_RMzz!JC)E%LSg+F(1KY-3Q*R{KbCaLGTNF9x+P!y^c5n}qJ(xLu& zBBm?CQIp`_!v}`xw6grQ5F0#%+qQv!9>Vm2a+c_B42?$Ni_VTzl*apl5okcd*@ym= za3Cr|FAS)c5y3Izr&eLfqZS>ng2p`8gYcO2jP+_Va;K}RXu*0vAS<{b-unD9yK~bE zR(GE$WVzX^LO5%9BPrieDLoFyc^+X1_V<5F{GJt5NPnjpJL{XNXCR^8d(nHP;w$LE zDAzLz{}=(1o2c)BUu1Ci>(}6B9Kne0R*!;I<39>w$Q7aR<|dXygq|PZd^Df^w1j@G z>jLWgU8lQGJC?w5{pR)UZ*GWvJlg-B`3E@rR6I1!oe?<$Z4^mJZCE2P0hb$skWc(m zRy6a%f6E<#b6FW^;0_0y+iP{aZ?N7bT+`^ii8T)fD`M6r1M1c4`~l*V;o(c&!eLWC zFiy}!4i$VLe19?Ik9v*-KUDZQN5;gZCuW;_Cw2EyK~S@&ob0QBUUb z1&R8%mtyzSD|AX17|`gXb#tfQ=5Ywq+mWPgxXxW`&`#wC z!dbokK>hV=;=1@pJt({H_cWh3Jcn;JY2*jL8eiV$pCQ0j@C_?(4c1acIqdc$?s)V^ z#E~8&#cuGaFtmDn2;Ss4nll;zkv19o3S zayQCLPkNaYvfMAYkPQeRDCmYA_bUyrlrj^_u#v$5Q(Kt`M$5-rF$mm>^5OU~??I${~%4KzlRiqhCm-5rh3gTNy#bLN1rE*0QSXa4RF&z?u?@=bTtCfzW*e z}n;d@j+9AJB3ouP8Oy%lN;2|4JNot@Y^L*qAD^QgTT8Mb6dU`2i8Gdu7 z)~3e&yn#uE=GMi|GK%L7@O0n#H*Y$?A3AWp57ySlDJt$W#s#8}aH}$qV|U`VFTC$q zH#_#rPXdjnFQ6#_f6kAvV@it?Eg3ptd?h#7GeZ#aLE1Y$9=9$&7`uD3Tt8qUfT)z- z+{H&-DoJ6$b0QFiH7(8T7{@E98a_wsH zOV$gv=Mg1-J0v&0@69KmcDUmuZc6*vUp)DzB})AVJAT#Se|D|KjK7?Tn=kw|{r{m~ z@U!fr|Dw05?UM@tFQ#k zB14`VIZkWF9usQghIXDGt;q%rvN$WkeZ%goKGl*@CHjRjVy9IoHc!@hy}H1(@JZau zbf#hFSCoH&Xd=`r#%;AMAUnP~Ni#8)?MYV~XOt9<+m{(&;%Uo8roIjuCNQ@sJVHvG zD$PLcTm$x->gHG7e?)u00r8)urrSVO2J{iQdvwy0r>uEz96*Y^4Zc+$%Na}_@99+Q zXf6R5UTb$uQgXE%Q-{Q506#DTNW_|w^eIrV!*8mx!k9s~6T^|HKsH|+u=g1}CLwK7 zXWQNLU{k+~?QO$6#U~Yd1ZH|U6(kOuY_kcLs95%pbmMGoM2H7i>ezKws@1J%fC@9p zES(6g+RB?ea+Kw}<>#NsQoRxL$GWV9>SAZK5gaA~HJVAtd1MKWTre4*Z)wi#a zMay*;{owg3(qKt!NZ~6SzscAWms19GO`gq|FG+hFh*Nj|Dj{l_#*SzXhN&;@;16r$ zg{AeclNvi8!WeKW*Jl~lgI!nxR>T~}mKfYIdCsh#@$@u_7=Hs>c2 zwM^~i$1<&9no%T#Udt3@)%nkK(%G*g=Rb;dt4dakqk+ScTi>+ID2Cy4O9mN zQ^s1Poknd^Ho010N4NR|s~-4S)~Ce=dA07BC&c$-$p4_G1lUN3TJxO}UHefbZJz&2 z;0j~^zYAQxrGV>4=)JykVl;8z*ftEVj#5)sfFloF3jj%Wt}%~8_0@(jWfn=}qmNb# z*`n9IVj2YD`6&qQ?lj5-kDf;E5yiNTpiAfvcJN{dsXhFQofF3vX>TMH@~s}ZoKfoR zTEaIy?F^94NBQV84$$)61Rw2<%tk>9kPprFGWRo*Ii!#*I|kv01rV}wBs5r9Ef2j7 z=zphiii?)qV4*Ya8%~we>}z>`W0^QKx-cITi|?}ql>iqHrWyqP`ops+hnA6scY3t9 zZEw!F{$pGIpX6jLm4-Gx+2QDE$ErANCUL(KIL6wW90mXzKt`G!DOx>LuHN)|BxY~i zL&$C*b_d7PRkozl4)s#|(Lo`}DX`1>4>x6m{##P=-am%fXUAuQhI_cl?;@`_ybjK{ z%>Pn|Jxk4l?=xwYmYi>QMg8js0|VA{z!gncJTC2g%bV>J)n7{C8u>I zN_UkbUgsZ_VZ_vZF)h?v4U7|%KJ`X{OGkyLmds4#d}*4j4q5Wz;0I|N72ppr$jRcn zfxU>i%=DA=b4^e-(uF?i)bE^O)Gk_!j3={+VubHp)yh{?3$l9G?nb~T9cAf&q*#q;UD+2ajRz)WJReNVCEo+Vz3pv1p>85~lW(I@;& z1qfM#gwg_Sh%+ql-nz2JAB07L5@)lWT($yt2v$?0@=KbrCQNHpmfF@)4xgF_zkE_} z63dOTQQgHU;w`@?KfQIwzk*U{8}UF^3VI9Lo1gm$u`GQ0h78Fc?Sbn}xV z-}E{8;0c8Prs;6I=Ul(J%*^w9p5Og_p3nW^6%l##_BuqlU#g$~ zB8=_j<@59NGrq$pwr!g}PUoI>(1fe++oFC|=`+p!-M`neNlemI3Fprz^!L|wAyd#; zGD!0?87YPA-a^kPpvVJ^4b$%-%^8Q+Y|Qlg{HM4TSUrQc-0~x^kazcuS$}`?1^wS+ zUAR7!nPzWy;;@0ZZ}^3ePef81m%hNO0wyqI=@(Sqdp!C;Fo@a#YG zWAZ!|+;8tMy=$dA(ALR)?)vU)Jfpw7KS*xV(m9^z=pYyXtul1bmcLA2_gS~l(=%cy z{@6rSOxm&CNT3fI5K2ms7V_5+%*Pl97f- zIn+$yu0L#ImSk&}c zygkJ?AjN+G=%-BPCx{4cZu9TJ$2C#FF@EsqAKKwed%samJdh^Pg$zW5IMwD~0rtSG z3BT)sfq|*1`)Z;@jG6t(v^lxq$Tq}~(ry@1J9sA0GXuvMuk98GAPX@1^(oA(1s;bd z(TsgJ{QUu-@%Yf1#*!!2%+v1U#SNcurJ@%Ltb92@=*JrU8ff2a(gV&9x^c%g!6&g| znLcv89~KgY%RrWphzX02zz%|>%oJLq;DED}k`HWs*WRzMHMFf+%a(u3r5<8DNB;-a zuef}E?!B$k^Ryc;ey1 zf^Z7|wSq>Fld~f$?dp=oAKT}?0>~aQN_b%8btpEZnq<&{CiwAg52h^1FQ4-s$}c*r7~eZP@Y({=B!?3?+SJRtyHixcQt+!7 zJSYSQ2BGmbz#sFKILf$dSs5gP7pdGNx;HF>k)rC!t_u}38ExvOg&MgJkS;^^AS{A@ zats=+m#TF{&^EdR|K94O+l2=g;in#m7kJYYoMhd+jo8&_fK5}_Qo(@0xUw?Zp$nzu0a};iZ_`0~#TBidY+YyaeEOv@4!58D zuO%AR76$RPQBTFK-wv%TX+DzmJl~dn&(BZsy^l`_24Pm+{;@{92{e)*87sG3G2N3V z{m=?F-C`{=ZUwrgJuoc!wzRO2yYTVpysjB79bJ7KUSYghJDA<4vJ{BoB&YK}C4O8; z@9o^j4zy|_%>a}LW&ASRfF}^-;Ow81Re!ZbvnZ{~xY%XqWH5ncVToPPL^9{(y|NSy zvyoU`UFpqKEE&2f^1Z6z;2-15Q|ZbZ<%qSB!ATxvnU#&j)yI}L6BFB`501`e*$*#$ zy?UiF-h&W={C4r`mk$L-Y7F3is36>;_C%vwGdi3)vbl}0hvMX~?o!tc;oX#HBeqKh z6&`1v0L}2gnKrNM`cAPo=Hv`OzX0n}x6Fp(E(A?k{iVHtU1dfmbJ4omX`;D~FiX#t z8SnhAN6x~+uJKExlyfVni^f>a=qs_rHRahn-Fd{N&}S`S>iI$c3*ZKjb$r)4Shc3; z?LOVtuSa3zT@y}3?ZEVvH{=HC?8)~aq#l^u1g45Ss%SXSMB$lku{t{6_%;eCSQNt08O zSt#no4%k2Aj6<#|mc$?KtZ3Is*!r>EVY1xp~C)2`_UDxmAxli)DROQndhq?=WW$E1kIy=4FJYWk0`)5*%vIoUP z5Yx9P3vWtc!@I=N`NP5EcjGi8v%H`Q*p``f&^5%e4^JcK)R)rO=)~4Ca@3ux1}$F8 zGRr7bsmwdYqiQPD+CSUiG0R_C^)!-f5+hDiiQ-S)nv$rK4(5w;)Rvu^GQZ&!lx0w` zKEZD^2roT4_x3?`K9%Rk61SM8InH;<>Hz};KD1^!TfUXCTBL!g(e3A+vv9*+nIRZf zQ`ZJOKB`<6U!3Z;@~vT9d~EBhu(C35FE8IiL$TGzgikQ7J10fYE^AMAeOb82B4+mR zt;NFv-4s#WLI8LDv|vue{M_8~a8$6@zMFI`PNVp;1cgToGaWL^uGI3GJq(P_`g$?Y?PDIrqH>R%_9ruN4d6%|=e zMoolQlLy1TIjOiiQPQEyS1PC=%sM(w`phC7tI*^-Pb02JqGw%4M9$-iiWtQvQC|}1 zxq=DfjnJuSVSgztFqXjWu=Bey?-OmS3jZ15-kIQ}9_iBtVm%h#wUM#4ky&ZrqAPNg zYt5n~nQc#|2U?s3R(H>u92?PSHEm)vZfZmh)G7q|)xA%W9rH`Uj2F_t>L7u*9DCUL zL;%B1W3|1Yhvd73wXh+H@N$mEpu9UT9_geu#7Jj(GAdw!}H4>Y;o+n556=BWw|$_Ck0N-sxdo-Jux+`6Nz zu#|k?8yPCOVP_01-d~=Uaft}PM*ceGq6)UUp5IzANf}HyVmpZ2Znzk> z=C}hQ=4F(%!7T}#m-q>t?K;|O`8|V%wPYRMsND6eh^YnT=1(zuGol=^0_GAPpPJ#m zge5W*i5r`ooF%ZAO0AVa1G)xIUzw%D;si|bTP(CZiV9JN?Mf$dVZ8wdKoYfTu*$o1 zkEvrf=~x*U#SYjuUs?9pTF4e@wXe%C!(j4V&%w1l^{?-Aw+)JzV^w1sOOUQ3cE^t+ zg-*l$SNE_$%g5CEG)VkD6O(k6Y>Za)`kE3s=e(`)lt}~X^SmgAs@u^bSh(vzCvdUj zld%aa?6gbSwZftqF5QHBzG!{f+#DL}jyrU}o{3>3H0xA>&7rVBj|DOLW=7bGEdH!S zT+DVYSeG{5eQs=TR?-%@!+Uwgpi8+-O#*+dJamXKZl}gh<7}=5We354)j45|KNRVj ztqJR{tUpn*h+M0{GvcbyNwFTdW^X|HsdML;h@ElXB~GBRg#jOXzp~$rd*zK}1W$l< ziwxO{Tgim&!pKuI_VPY@}$u|`dxv$e47mcB&P z32PJZUP3DxsD2P1ZrU7cx?uN`3QcL2>(Jc+)rCPrv@)u%yt=4&7iRvG*|6sUezrJu z8>?Kfu5QW7UR|Mi#b#x-8Z~U&U3A$H%OeO{$9t`<`6^-j0{kW#bLnBBBWoLVugFoT zd&5c6Mia}~k-ce#@g%3=jqq@m;WQi#WB~a4vtf|*Dn;}%@`aC!t(^%M0PqwPD#{v4 J*~icM{vAo?*(U%1 literal 0 HcmV?d00001 diff --git a/docs/umlDiagrams/AddExistingItemDiagram.puml b/docs/umlDiagrams/AddExistingItemDiagram.puml new file mode 100644 index 0000000000..2b9f8f4352 --- /dev/null +++ b/docs/umlDiagrams/AddExistingItemDiagram.puml @@ -0,0 +1,35 @@ +@startuml +'https://plantuml.com/sequence-diagram + +autonumber + +@startuml +":BagPacker" -> ":AddCommand": AddCommand.execute() +activate ":BagPacker" +note left +Executing a valid +add command on a +repeated/existing item +end note +activate ":AddCommand" #yellow +":AddCommand" -> ":PackingList": PackingList.itemFinder(itemName) +activate ":PackingList" #orange +":AddCommand" <-- ":PackingList": isItemFound +deactivate ":PackingList" + +Alt #lightblue isItemFound + ":AddCommand" -> ":PackingList": PackingList.AddToItemQty(itemName, addQty) + activate ":PackingList" #orange + ":AddCommand" <-- ":PackingList": + deactivate ":PackingList" + + +else !isItemFound + ":AddCommand" -> ":PackingList": PackingList.AddItem(Item) + activate ":PackingList" #orange + ":AddCommand" <-- ":PackingList": + deactivate ":PackingList" +end +":BagPacker" <-- ":AddCommand" + +@enduml \ No newline at end of file diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index 60493a35e3..b8f2cfdd61 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -21,7 +21,7 @@ public AddCommand(Item item) { @Override public void execute(PackingList packingList) { if(PackingList.itemFinder(item.getItemName())){ - PackingList.addItemQuantity(item.getItemName(), item.getTotalQuantity()); + PackingList.addToItemQuantity(item.getItemName(), item.getTotalQuantity()); Ui.printToUser(String.format(MSG_SUCCESS_ADD_EXISTING, PackingList.getExistingItem(item.getItemName()))); return; } diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index ce7156cb21..dc39c8259c 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -203,16 +203,16 @@ public static String getItemDescrip() { */ public static Command createAddObj() { try { - String[] quantityAndDescription = getAddVariables(); - int itemQuantity = Integer.parseInt(quantityAndDescription[0]); - String itemDescription = quantityAndDescription[1]; - if (itemDescription == null) { + String[] quantityAndName = getAddVariables(); + int itemQuantity = Integer.parseInt(quantityAndName[0]); + String itemName = quantityAndName[1]; + if (itemName == null) { throw new InvalidVariablesException(); } if (itemQuantity < 1) { throw new InvalidIndexException(); } - return new AddCommand(new Item(itemQuantity, itemDescription)); + return new AddCommand(new Item(itemQuantity, itemName)); } catch (InvalidVariablesException | ArrayIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid input format", AddCommand.HELP_MSG); diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index 47616470ae..c093591ca9 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -46,7 +46,7 @@ public static Item getExistingItem(String itemName) { * @param itemName name of the item to add total quantity to be packed * @param addQty the quantity to add to the old total */ - public static void addItemQuantity(String itemName, int addQty) { + public static void addToItemQuantity(String itemName, int addQty) { Item itemToAdd = getExistingItem(itemName); int totalQuantity = itemToAdd.getTotalQuantity(); itemToAdd.setTotalQuantity(totalQuantity + addQty); From e8ebcc479755a5645f5d5f5f57b1b3ba02033b7a Mon Sep 17 00:00:00 2001 From: coregano Date: Tue, 4 Apr 2023 00:30:07 +0800 Subject: [PATCH 092/207] feature - find command added for users to search for items containing the keyword --- .../java/bagpacker/commands/FindCommand.java | 39 +++++++++++++++++ src/main/java/bagpacker/iohandler/Parser.java | 42 ++++++++++++++----- src/main/java/bagpacker/iohandler/Ui.java | 12 ++---- .../bagpacker/packingfunc/PackingList.java | 28 +++++++++++-- 4 files changed, 98 insertions(+), 23 deletions(-) create mode 100644 src/main/java/bagpacker/commands/FindCommand.java diff --git a/src/main/java/bagpacker/commands/FindCommand.java b/src/main/java/bagpacker/commands/FindCommand.java new file mode 100644 index 0000000000..50a022dec5 --- /dev/null +++ b/src/main/java/bagpacker/commands/FindCommand.java @@ -0,0 +1,39 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; + +import java.lang.reflect.Array; +import java.util.ArrayList; + +import static bagpacker.iohandler.Ui.printToUser; + +public class FindCommand extends Command { + public static final String HELP_MSG = + "find: Displays all items in the packingList as a list that contains tha keyword used in the command.\n" + + "Example: find jacket"; + private static final String MSG_FIND_HEADER = "There are %d items(s) in your list containing %s: "; + private static final String MSG_NO_FOUND_ITEM = "An item containing the description %s does not exist. Please try again."; + private static String keyword; + + public FindCommand(String keyword) { + FindCommand.keyword = keyword; + } + @Override + public void execute(PackingList packingList) { + if (PackingList.keywordFinder(keyword)) { + ArrayList foundList = new ArrayList<>(); + for (int i = 0; i < packingList.size(); i++) { + Item item = PackingList.get(i); + if (item.getItemName().contains(keyword)) { + foundList.add((i + 1) + ". " + item); + } + } + + foundList.add(0, String.format(MSG_FIND_HEADER, foundList.size(), keyword)); + printToUser(foundList.toArray(new String[0])); + } else { + printToUser(MSG_NO_FOUND_ITEM); + } + } +} diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index dc39c8259c..e4ec421455 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -1,17 +1,7 @@ package bagpacker.iohandler; -import bagpacker.commands.AddCommand; -import bagpacker.commands.ByeCommand; -import bagpacker.commands.Command; -import bagpacker.commands.DeleteCommand; -import bagpacker.commands.DeleteListCommand; -import bagpacker.commands.HelpCommand; -import bagpacker.commands.IncorrectCommand; -import bagpacker.commands.ListCommand; -import bagpacker.commands.PackCommand; -import bagpacker.commands.UnpackCommand; -import bagpacker.commands.PackAllCommand; +import bagpacker.commands.*; import bagpacker.exception.EmptyInputException; import bagpacker.exception.InvalidIndexException; import bagpacker.exception.InvalidVariablesException; @@ -81,6 +71,8 @@ public static Command parse() { return createDeletelistObj(); case "packall": return createPackAllObj(); + case "find": + return createFindObj(); case "bye": return createByeObj(); default: @@ -173,6 +165,8 @@ public static String getVariable(String command) throws InvalidVariablesExceptio try { if (command.equals("add")) { itemVariable = getItemName(); + } else if (command.equals("find")) { + itemVariable = getKeyword(); } else { itemVariable = getItemIndex(); } @@ -184,6 +178,19 @@ public static String getVariable(String command) throws InvalidVariablesExceptio return itemVariable; } + private static String getKeyword() throws InvalidVariablesException { + String keyword; + if (inputStringArray.size() <= 1) { + throw new InvalidVariablesException(); + } + try { + int itemIndStart = fullInput.indexOf(" ") + 1; + keyword = fullInput.substring(itemIndStart).trim(); + } catch (IndexOutOfBoundsException e) { + throw new InvalidVariablesException(); + } + return keyword; + } /** * Returns the user item description @@ -416,6 +423,19 @@ public static Command createUnpackObj() { } } + /** + * Attempts to create a FindCommand object with the given keyword. + * @return FindCommand + */ + public static Command createFindObj() { + try { + return new FindCommand(getKeyword()); + } catch (InvalidVariablesException e) { + return new IncorrectCommand("Blank keyword", + "Try to input a keyword to be searched in the list"); + } + } + public static Command listCommand() { return new ListCommand(); } diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index a8bd3369c6..cc10169c74 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -1,14 +1,9 @@ package bagpacker.iohandler; -import bagpacker.commands.AddCommand; -import bagpacker.commands.ByeCommand; -import bagpacker.commands.DeleteCommand; -import bagpacker.commands.DeleteListCommand; -import bagpacker.commands.ListCommand; -import bagpacker.commands.PackAllCommand; -import bagpacker.commands.PackCommand; -import bagpacker.commands.UnpackCommand; +import bagpacker.commands.*; + +import java.util.ArrayList; /** * Ui class contains methods to print messages to user interface on Command Line Interface @@ -78,6 +73,7 @@ public static void helpMessage() { System.out.println("5. " + UnpackCommand.HELP_MSG); System.out.println("6. " + DeleteListCommand.HELP_MSG); System.out.println("7. " + PackAllCommand.HELP_MSG); + System.out.println("8. " + FindCommand.HELP_MSG); System.out.println("8. " + ByeCommand.HELP_MSG); printLine(); } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index c093591ca9..dec7dadc90 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -7,7 +7,7 @@ public class PackingList { private static ArrayList itemList = new ArrayList<>(); - /*** + /** * Checks if item of the same name as itemName is found in the current packing list * * @param itemName @@ -22,9 +22,23 @@ public static boolean itemFinder(String itemName) { return false; } - /*** + /** + * Checks if items contain keyword in their names in the current packing list + * @param keyword String of keyword to be searched + * @return true if item name containing keyword is found + */ + public static boolean keywordFinder(String keyword) { + for (Item item : itemList) { + if (item.getItemName().contains(keyword)) { + return true; + } + } + return false; + } + + /** * getExistingItem returns the object of type Item of the same name as input itemName - * + *

    * this should only be called after checking that item does exist in the itemList * * @param itemName @@ -40,7 +54,8 @@ public static Item getExistingItem(String itemName) { assert(existingItem != null); return existingItem; } - /*** + + /** * Adds the added quantity to the current total quantity of an item in the itemList * * @param itemName name of the item to add total quantity to be packed @@ -93,6 +108,11 @@ public void unpackItem(Item toPack, int quantity) { toPack.setUnpacked(quantity); } + /** + * Returns the target item. + * @param targetIndex position of item in packingList + * @return item + */ public static Item get(int targetIndex) { return itemList.get(targetIndex); } From d18bae778a7f3e3c91ec8d734fab3552eaf490bb Mon Sep 17 00:00:00 2001 From: linuspuah Date: Tue, 4 Apr 2023 11:52:14 +0800 Subject: [PATCH 093/207] Add All Command Class J-Unit tests --- docs/DeveloperGuide.md | 2 +- htmlReport/css/coverage.css | 154 ++ htmlReport/css/idea.min.css | 118 ++ htmlReport/img/arrowDown.gif | Bin 0 -> 89 bytes htmlReport/img/arrowUp.gif | Bin 0 -> 91 bytes htmlReport/index.html | 249 +++ htmlReport/index_SORT_BY_BLOCK.html | 249 +++ htmlReport/index_SORT_BY_BLOCK_DESC.html | 249 +++ htmlReport/index_SORT_BY_CLASS.html | 249 +++ htmlReport/index_SORT_BY_CLASS_DESC.html | 249 +++ htmlReport/index_SORT_BY_LINE.html | 249 +++ htmlReport/index_SORT_BY_LINE_DESC.html | 249 +++ htmlReport/index_SORT_BY_METHOD.html | 249 +++ htmlReport/index_SORT_BY_METHOD_DESC.html | 249 +++ htmlReport/index_SORT_BY_NAME_DESC.html | 249 +++ htmlReport/js/highlight.min.js | 1388 +++++++++++++++++ htmlReport/js/highlightjs-line-numbers.min.js | 24 + htmlReport/ns-1/index.html | 142 ++ htmlReport/ns-1/index_SORT_BY_BLOCK.html | 142 ++ htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html | 142 ++ htmlReport/ns-1/index_SORT_BY_CLASS.html | 142 ++ htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html | 142 ++ htmlReport/ns-1/index_SORT_BY_LINE.html | 142 ++ htmlReport/ns-1/index_SORT_BY_LINE_DESC.html | 142 ++ htmlReport/ns-1/index_SORT_BY_METHOD.html | 142 ++ .../ns-1/index_SORT_BY_METHOD_DESC.html | 142 ++ htmlReport/ns-1/index_SORT_BY_NAME_DESC.html | 142 ++ htmlReport/ns-1/sources/source-1.html | 150 ++ htmlReport/ns-2/index.html | 412 +++++ htmlReport/ns-2/index_SORT_BY_BLOCK.html | 412 +++++ htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html | 412 +++++ htmlReport/ns-2/index_SORT_BY_CLASS.html | 412 +++++ htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html | 412 +++++ htmlReport/ns-2/index_SORT_BY_LINE.html | 412 +++++ htmlReport/ns-2/index_SORT_BY_LINE_DESC.html | 412 +++++ htmlReport/ns-2/index_SORT_BY_METHOD.html | 412 +++++ .../ns-2/index_SORT_BY_METHOD_DESC.html | 412 +++++ htmlReport/ns-2/index_SORT_BY_NAME_DESC.html | 412 +++++ htmlReport/ns-2/sources/source-1.html | 135 ++ htmlReport/ns-2/sources/source-2.html | 119 ++ htmlReport/ns-2/sources/source-3.html | 152 ++ htmlReport/ns-2/sources/source-4.html | 131 ++ htmlReport/ns-2/sources/source-5.html | 126 ++ htmlReport/ns-2/sources/source-6.html | 114 ++ htmlReport/ns-2/sources/source-7.html | 122 ++ htmlReport/ns-2/sources/source-8.html | 138 ++ htmlReport/ns-2/sources/source-9.html | 137 ++ htmlReport/ns-2/sources/source-a.html | 134 ++ htmlReport/ns-2/sources/source-b.html | 135 ++ htmlReport/ns-3/index.html | 196 +++ htmlReport/ns-3/index_SORT_BY_BLOCK.html | 196 +++ htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html | 196 +++ htmlReport/ns-3/index_SORT_BY_CLASS.html | 196 +++ htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html | 196 +++ htmlReport/ns-3/index_SORT_BY_LINE.html | 196 +++ htmlReport/ns-3/index_SORT_BY_LINE_DESC.html | 196 +++ htmlReport/ns-3/index_SORT_BY_METHOD.html | 196 +++ .../ns-3/index_SORT_BY_METHOD_DESC.html | 196 +++ htmlReport/ns-3/index_SORT_BY_NAME_DESC.html | 196 +++ htmlReport/ns-3/sources/source-1.html | 107 ++ htmlReport/ns-3/sources/source-2.html | 108 ++ htmlReport/ns-3/sources/source-3.html | 108 ++ htmlReport/ns-4/index.html | 196 +++ htmlReport/ns-4/index_SORT_BY_BLOCK.html | 196 +++ htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html | 196 +++ htmlReport/ns-4/index_SORT_BY_CLASS.html | 196 +++ htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html | 196 +++ htmlReport/ns-4/index_SORT_BY_LINE.html | 196 +++ htmlReport/ns-4/index_SORT_BY_LINE_DESC.html | 196 +++ htmlReport/ns-4/index_SORT_BY_METHOD.html | 196 +++ .../ns-4/index_SORT_BY_METHOD_DESC.html | 196 +++ htmlReport/ns-4/index_SORT_BY_NAME_DESC.html | 196 +++ htmlReport/ns-4/sources/source-1.html | 537 +++++++ htmlReport/ns-4/sources/source-2.html | 175 +++ htmlReport/ns-4/sources/source-3.html | 208 +++ htmlReport/ns-5/index.html | 169 ++ htmlReport/ns-5/index_SORT_BY_BLOCK.html | 169 ++ htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html | 169 ++ htmlReport/ns-5/index_SORT_BY_CLASS.html | 169 ++ htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html | 169 ++ htmlReport/ns-5/index_SORT_BY_LINE.html | 169 ++ htmlReport/ns-5/index_SORT_BY_LINE_DESC.html | 169 ++ htmlReport/ns-5/index_SORT_BY_METHOD.html | 169 ++ .../ns-5/index_SORT_BY_METHOD_DESC.html | 169 ++ htmlReport/ns-5/index_SORT_BY_NAME_DESC.html | 169 ++ htmlReport/ns-5/sources/source-1.html | 170 ++ htmlReport/ns-5/sources/source-2.html | 211 +++ .../bagpacker/commands/AddCommandTest.java | 54 + .../bagpacker/commands/ByeCommandTest.java | 33 + .../bagpacker/commands/DeleteCommandTest.java | 25 + .../commands/DeleteListCommandTest.java | 28 + .../bagpacker/commands/HelpCommandTest.java | 62 + .../commands/IncorrectCommandTest.java | 34 + .../bagpacker/commands/ListCommandTest.java | 53 + .../commands/PackAllCommandTest.java | 27 + .../bagpacker/commands/PackCommandTest.java | 26 + .../bagpacker/commands/UnpackCommandTest.java | 29 + .../packingfunctest/CommandsTest.java | 41 - 98 files changed, 18913 insertions(+), 42 deletions(-) create mode 100644 htmlReport/css/coverage.css create mode 100644 htmlReport/css/idea.min.css create mode 100644 htmlReport/img/arrowDown.gif create mode 100644 htmlReport/img/arrowUp.gif create mode 100644 htmlReport/index.html create mode 100644 htmlReport/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/index_SORT_BY_CLASS.html create mode 100644 htmlReport/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/index_SORT_BY_LINE.html create mode 100644 htmlReport/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/index_SORT_BY_METHOD.html create mode 100644 htmlReport/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/js/highlight.min.js create mode 100644 htmlReport/js/highlightjs-line-numbers.min.js create mode 100644 htmlReport/ns-1/index.html create mode 100644 htmlReport/ns-1/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-1/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-1/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-1/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-1/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-1/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-1/sources/source-1.html create mode 100644 htmlReport/ns-2/index.html create mode 100644 htmlReport/ns-2/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-2/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-2/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-2/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-2/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-2/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-2/sources/source-1.html create mode 100644 htmlReport/ns-2/sources/source-2.html create mode 100644 htmlReport/ns-2/sources/source-3.html create mode 100644 htmlReport/ns-2/sources/source-4.html create mode 100644 htmlReport/ns-2/sources/source-5.html create mode 100644 htmlReport/ns-2/sources/source-6.html create mode 100644 htmlReport/ns-2/sources/source-7.html create mode 100644 htmlReport/ns-2/sources/source-8.html create mode 100644 htmlReport/ns-2/sources/source-9.html create mode 100644 htmlReport/ns-2/sources/source-a.html create mode 100644 htmlReport/ns-2/sources/source-b.html create mode 100644 htmlReport/ns-3/index.html create mode 100644 htmlReport/ns-3/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-3/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-3/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-3/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-3/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-3/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-3/sources/source-1.html create mode 100644 htmlReport/ns-3/sources/source-2.html create mode 100644 htmlReport/ns-3/sources/source-3.html create mode 100644 htmlReport/ns-4/index.html create mode 100644 htmlReport/ns-4/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-4/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-4/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-4/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-4/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-4/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-4/sources/source-1.html create mode 100644 htmlReport/ns-4/sources/source-2.html create mode 100644 htmlReport/ns-4/sources/source-3.html create mode 100644 htmlReport/ns-5/index.html create mode 100644 htmlReport/ns-5/index_SORT_BY_BLOCK.html create mode 100644 htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html create mode 100644 htmlReport/ns-5/index_SORT_BY_CLASS.html create mode 100644 htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html create mode 100644 htmlReport/ns-5/index_SORT_BY_LINE.html create mode 100644 htmlReport/ns-5/index_SORT_BY_LINE_DESC.html create mode 100644 htmlReport/ns-5/index_SORT_BY_METHOD.html create mode 100644 htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html create mode 100644 htmlReport/ns-5/index_SORT_BY_NAME_DESC.html create mode 100644 htmlReport/ns-5/sources/source-1.html create mode 100644 htmlReport/ns-5/sources/source-2.html create mode 100644 src/test/java/bagpacker/commands/AddCommandTest.java create mode 100644 src/test/java/bagpacker/commands/ByeCommandTest.java create mode 100644 src/test/java/bagpacker/commands/DeleteCommandTest.java create mode 100644 src/test/java/bagpacker/commands/DeleteListCommandTest.java create mode 100644 src/test/java/bagpacker/commands/HelpCommandTest.java create mode 100644 src/test/java/bagpacker/commands/IncorrectCommandTest.java create mode 100644 src/test/java/bagpacker/commands/ListCommandTest.java create mode 100644 src/test/java/bagpacker/commands/PackAllCommandTest.java create mode 100644 src/test/java/bagpacker/commands/PackCommandTest.java create mode 100644 src/test/java/bagpacker/commands/UnpackCommandTest.java delete mode 100644 src/test/java/bagpacker/packingfunctest/CommandsTest.java diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index b2d090df5a..b5318102be 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -30,7 +30,7 @@ This is done through the `itemFinder()` method in class `PackingList()`, which i Below is the UML diagram showing what occurs during `add` function when trying to add an item that already exists. -![AddExistingItemDiagram.png](C:\Users\sunil\desktop\NUS\CS2113\Team_Project\docs\umlDiagrams\AddExistingItemDiagram.png) +![AddExistingItemDiagram.png](umlDiagrams%2FAddExistingItemDiagram.png) When `AddCommand.execute()` is called in `BagPacker`, the `PackingList.itemFinder()` method is called. diff --git a/htmlReport/css/coverage.css b/htmlReport/css/coverage.css new file mode 100644 index 0000000000..cef776517f --- /dev/null +++ b/htmlReport/css/coverage.css @@ -0,0 +1,154 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +* { + margin: 0; + padding: 0; +} + +body { + background-color: #fff; + font-family: helvetica neue, tahoma, arial, sans-serif; + font-size: 82%; + color: #151515; +} + +h1 { + margin: 0.5em 0; + color: #010101; + font-weight: normal; + font-size: 18px; +} + +h2 { + margin: 0.5em 0; + color: #010101; + font-weight: normal; + font-size: 16px; +} + +a { + color: #1564C2; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +span.separator { + color: #9BA9BA; + padding-left: 5px; + padding-right: 5px; +} + +div.content { + width: 99%; +} + +table.coverageStats { + width: 100%; + border-collapse: collapse; +} + +table.overallStats { + width: 20%; +} + +table.coverageStats td, table.coverageStats th { + padding: 4px 2px; + border-bottom: 1px solid #ccc; +} + +table.coverageStats th { + background-color: #959BA4; + border: none; + font-weight: bold; + text-align: left; + color: #FFF; +} + +table.coverageStats th.coverageStat { + width: 15%; +} + +table.coverageStats th a { + color: #FFF; +} + +table.coverageStats th a:hover { + text-decoration: none; +} + +table.coverageStats th.sortedDesc a { + background: url(../img/arrowDown.gif) no-repeat 100% 2px; + padding-right: 20px; +} + +table.coverageStats th.sortedAsc a { + background: url(../img/arrowUp.gif) no-repeat 100% 2px; + padding-right: 20px; +} + +div.footer { + margin: 2em .5em; + font-size: 85%; + text-align: left; + line-height: 140%; +} + +code.sourceCode { + width: 100%; + border: 1px solid #ccc; + font: normal 12px 'Menlo', 'Bitstream Vera Sans Mono', 'Courier New', 'Courier', monospace; + white-space: pre; +} + +code.sourceCode b { + font-weight: normal; +} + +code.sourceCode span.number { + color: #151515; +} + +code.sourceCode .fc { + background-color: #cfc; +} + +code.sourceCode .pc { + background-color: #ffc; +} + +code.sourceCode .nc { + background-color: #fcc; +} + +.percent, .absValue { + font-size: 90%; +} + +.percent .green, .absValue .green { + color: #32cc32; +} + +.percent .red, .absValue .red { + color: #f00; +} + +.percent .totalDiff { + color: #3f3f3f; +} diff --git a/htmlReport/css/idea.min.css b/htmlReport/css/idea.min.css new file mode 100644 index 0000000000..a8d5292bd5 --- /dev/null +++ b/htmlReport/css/idea.min.css @@ -0,0 +1,118 @@ +/* + * Copyright 2000-2021 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* +Intellij Idea-like styling (c) Vasily Polovnyov +*/ + +.hljs { + color: #000; + background: #fff; +} + +.hljs-subst, +.hljs-title { + font-weight: normal; + color: #000; +} + +.hljs-comment, +.hljs-quote { + color: #808080; + font-style: italic; +} + +.hljs-meta { + color: #808000; +} + +.hljs-tag { + background: #efefef; +} + +.hljs-section, +.hljs-name, +.hljs-literal, +.hljs-keyword, +.hljs-selector-tag, +.hljs-type, +.hljs-selector-id, +.hljs-selector-class { + font-weight: bold; + color: #000080; +} + +.hljs-attribute, +.hljs-number, +.hljs-regexp, +.hljs-link { + font-weight: bold; + color: #0000ff; +} + +.hljs-number, +.hljs-regexp, +.hljs-link { + font-weight: normal; +} + +.hljs-string { + color: #008000; + font-weight: bold; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-formula { + color: #000; + background: #d0eded; + font-style: italic; +} + +.hljs-doctag { + text-decoration: underline; +} + +.hljs-variable, +.hljs-template-variable { + color: #660e7a; +} + +.hljs-addition { + background: #baeeba; +} + +.hljs-deletion { + background: #ffc8bd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-ln-numbers { + display: block; + float: left; + width: 3em; + border-right: 1px solid #ccc; + font-style: normal; + text-align: right; + background-color: #eee; +} diff --git a/htmlReport/img/arrowDown.gif b/htmlReport/img/arrowDown.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4ac9b4b0f5eee9fc82deb7f03d0cc7f197b01c7 GIT binary patch literal 89 zcmZ?wbhEHbv%yJ&P?))?G g5?!@7agD+*@rGjs@joUks8}}Ha%HfNHz$KN0Orjd82|tP literal 0 HcmV?d00001 diff --git a/htmlReport/img/arrowUp.gif b/htmlReport/img/arrowUp.gif new file mode 100644 index 0000000000000000000000000000000000000000..d488db0089f15409b83a6f39718384cac89ea3c9 GIT binary patch literal 91 zcmZ?wbhEHbv%nBa6?))=2 j#jeJ<$W6!S$=vG=3s*2Wu3C5I!M+a(XH6zEFjxZs9OxeQ literal 0 HcmV?d00001 diff --git a/htmlReport/index.html b/htmlReport/index.html new file mode 100644 index 0000000000..842efe82dd --- /dev/null +++ b/htmlReport/index.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +

    + + +

    Overall Coverage Summary

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    all classes + + 70% + + + (14/20) + + + + 57% + + + (57/100) + + + + 35.8% + + + (123/344) + +
    + +
    +

    Coverage Breakdown

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    +
    + + + + + + + diff --git a/htmlReport/index_SORT_BY_BLOCK.html b/htmlReport/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..582d328031 --- /dev/null +++ b/htmlReport/index_SORT_BY_BLOCK.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
    + + +

    Overall Coverage Summary

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    all classes + + 70% + + + (14/20) + + + + 57% + + + (57/100) + + + + 35.8% + + + (123/344) + +
    + +
    +

    Coverage Breakdown

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    +
    + + + + + + + diff --git a/htmlReport/index_SORT_BY_BLOCK_DESC.html b/htmlReport/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..8477e58cfb --- /dev/null +++ b/htmlReport/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
    + + +

    Overall Coverage Summary

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    all classes + + 70% + + + (14/20) + + + + 57% + + + (57/100) + + + + 35.8% + + + (123/344) + +
    + +
    +

    Coverage Breakdown

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Package + Class, % + + Method, % + + Line, % +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    +
    + + + + + + + diff --git a/htmlReport/index_SORT_BY_CLASS.html b/htmlReport/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..d2ba22e3f6 --- /dev/null +++ b/htmlReport/index_SORT_BY_CLASS.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
    + + +

    Overall Coverage Summary

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    all classes + + 70% + + + (14/20) + + + + 57% + + + (57/100) + + + + 35.8% + + + (123/344) + +
    + +
    +

    Coverage Breakdown

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    +
    + + + + + + + diff --git a/htmlReport/index_SORT_BY_CLASS_DESC.html b/htmlReport/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..d10233f172 --- /dev/null +++ b/htmlReport/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
    + + +

    Overall Coverage Summary

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    all classes + + 70% + + + (14/20) + + + + 57% + + + (57/100) + + + + 35.8% + + + (123/344) + +
    + +
    +

    Coverage Breakdown

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Package + Class, % + + Method, % + + Line, % +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    +
    + + + + + + + diff --git a/htmlReport/index_SORT_BY_LINE.html b/htmlReport/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..bc3ff32915 --- /dev/null +++ b/htmlReport/index_SORT_BY_LINE.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
    + + +

    Overall Coverage Summary

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    all classes + + 70% + + + (14/20) + + + + 57% + + + (57/100) + + + + 35.8% + + + (123/344) + +
    + +
    +

    Coverage Breakdown

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    +
    + + + + + + + diff --git a/htmlReport/index_SORT_BY_LINE_DESC.html b/htmlReport/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..8f099d27fc --- /dev/null +++ b/htmlReport/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
    + + +

    Overall Coverage Summary

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    all classes + + 70% + + + (14/20) + + + + 57% + + + (57/100) + + + + 35.8% + + + (123/344) + +
    + +
    +

    Coverage Breakdown

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Package + Class, % + + Method, % + + Line, % +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    +
    + + + + + + + diff --git a/htmlReport/index_SORT_BY_METHOD.html b/htmlReport/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..8336867732 --- /dev/null +++ b/htmlReport/index_SORT_BY_METHOD.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
    + + +

    Overall Coverage Summary

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    all classes + + 70% + + + (14/20) + + + + 57% + + + (57/100) + + + + 35.8% + + + (123/344) + +
    + +
    +

    Coverage Breakdown

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    +
    + + + + + + + diff --git a/htmlReport/index_SORT_BY_METHOD_DESC.html b/htmlReport/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..cd2896dceb --- /dev/null +++ b/htmlReport/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
    + + +

    Overall Coverage Summary

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    all classes + + 70% + + + (14/20) + + + + 57% + + + (57/100) + + + + 35.8% + + + (123/344) + +
    + +
    +

    Coverage Breakdown

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Package + Class, % + + Method, % + + Line, % +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    +
    + + + + + + + diff --git a/htmlReport/index_SORT_BY_NAME_DESC.html b/htmlReport/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..57fa4b1a2f --- /dev/null +++ b/htmlReport/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,249 @@ + + + + + + Coverage Report > Summary + + + + + + +
    + + +

    Overall Coverage Summary

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    all classes + + 70% + + + (14/20) + + + + 57% + + + (57/100) + + + + 35.8% + + + (123/344) + +
    + +
    +

    Coverage Breakdown

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Package + Class, % + + Method, % + + Line, % +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    +
    + + + + + + + diff --git a/htmlReport/js/highlight.min.js b/htmlReport/js/highlight.min.js new file mode 100644 index 0000000000..e88731520e --- /dev/null +++ b/htmlReport/js/highlight.min.js @@ -0,0 +1,1388 @@ +/* + Highlight.js 10.7.2 (00233d63) + License: BSD-3-Clause + Copyright (c) 2006-2021, Ivan Sagalaev + + BSD 3-Clause License + + Copyright (c) 2006-2021, Ivan Sagalaev. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +var hljs=function(){"use strict";function e(t){ +return t instanceof Map?t.clear=t.delete=t.set=()=>{ +throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{var i=t[n] +;"object"!=typeof i||Object.isFrozen(i)||e(i)})),t}var t=e,n=e;t.default=n +;class i{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function s(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function a(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] +;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const r=e=>!!e.kind +;class l{constructor(e,t){ +this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ +this.buffer+=s(e)}openNode(e){if(!r(e))return;let t=e.kind +;e.sublanguage||(t=`${this.classPrefix}${t}`),this.span(t)}closeNode(e){ +r(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}class o{constructor(){this.rootNode={ +children:[]},this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const t={kind:e,children:[]} +;this.add(t),this.stack.push(t)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ +return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), +t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +o._collapse(e)})))}}class c extends o{constructor(e){super(),this.options=e} +addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} +addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root +;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){ +return new l(this,this.options).value()}finalize(){return!0}}function g(e){ +return e?"string"==typeof e?e:e.source:null} +const u=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,h="[a-zA-Z]\\w*",d="[a-zA-Z_]\\w*",f="\\b\\d+(\\.\\d+)?",p="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",m="\\b(0b[01]+)",b={ +begin:"\\\\[\\s\\S]",relevance:0},E={className:"string",begin:"'",end:"'", +illegal:"\\n",contains:[b]},x={className:"string",begin:'"',end:'"', +illegal:"\\n",contains:[b]},v={ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},w=(e,t,n={})=>{const i=a({className:"comment",begin:e,end:t,contains:[]},n) +;return i.contains.push(v),i.contains.push({className:"doctag", +begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),i +},y=w("//","$"),N=w("/\\*","\\*/"),R=w("#","$");var _=Object.freeze({ +__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:h,UNDERSCORE_IDENT_RE:d, +NUMBER_RE:f,C_NUMBER_RE:p,BINARY_NUMBER_RE:m, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const t=/^#![ ]*\// +;return e.binary&&(e.begin=((...e)=>e.map((e=>g(e))).join(""))(t,/.*\b/,e.binary,/\b.*/)), +a({className:"meta",begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{ +0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:b,APOS_STRING_MODE:E, +QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:v,COMMENT:w,C_LINE_COMMENT_MODE:y, +C_BLOCK_COMMENT_MODE:N,HASH_COMMENT_MODE:R,NUMBER_MODE:{className:"number", +begin:f,relevance:0},C_NUMBER_MODE:{className:"number",begin:p,relevance:0}, +BINARY_NUMBER_MODE:{className:"number",begin:m,relevance:0},CSS_NUMBER_MODE:{ +className:"number", +begin:f+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", +relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp", +begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[b,{begin:/\[/,end:/\]/, +relevance:0,contains:[b]}]}]},TITLE_MODE:{className:"title",begin:h,relevance:0 +},UNDERSCORE_TITLE_MODE:{className:"title",begin:d,relevance:0},METHOD_GUARD:{ +begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ +t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function k(e,t){ +"."===e.input[e.index-1]&&t.ignoreMatch()}function M(e,t){ +t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=k,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function O(e,t){ +Array.isArray(e.illegal)&&(e.illegal=((...e)=>"("+e.map((e=>g(e))).join("|")+")")(...e.illegal)) +}function A(e,t){if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function L(e,t){ +void 0===e.relevance&&(e.relevance=1)} +const I=["of","and","for","in","not","or","if","then","parent","list","value"] +;function j(e,t,n="keyword"){const i={} +;return"string"==typeof e?s(n,e.split(" ")):Array.isArray(e)?s(n,e):Object.keys(e).forEach((n=>{ +Object.assign(i,j(e[n],t,n))})),i;function s(e,n){ +t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") +;i[n[0]]=[e,B(n[0],n[1])]}))}}function B(e,t){ +return t?Number(t):(e=>I.includes(e.toLowerCase()))(e)?0:1} +function T(e,{plugins:t}){function n(t,n){ +return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(n?"g":""))}class i{ +constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,t){ +t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), +this.matchAt+=(e=>RegExp(e.toString()+"|").exec("").length-1)(e)+1}compile(){ +0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(((e,t="|")=>{let n=0 +;return e.map((e=>{n+=1;const t=n;let i=g(e),s="";for(;i.length>0;){ +const e=u.exec(i);if(!e){s+=i;break} +s+=i.substring(0,e.index),i=i.substring(e.index+e[0].length), +"\\"===e[0][0]&&e[1]?s+="\\"+(Number(e[1])+t):(s+=e[0],"("===e[0]&&n++)}return s +})).map((e=>`(${e})`)).join(t)})(e),!0),this.lastIndex=0}exec(e){ +this.matcherRe.lastIndex=this.lastIndex;const t=this.matcherRe.exec(e) +;if(!t)return null +;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] +;return t.splice(0,n),Object.assign(t,i)}}class s{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const t=new i +;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), +t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ +this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ +const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex +;let n=t.exec(e) +;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ +const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} +return n&&(this.regexIndex+=n.position+1, +this.regexIndex===this.count&&this.considerAll()),n}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=a(e.classNameAliases||{}),function t(i,r){const l=i +;if(i.isCompiled)return l +;[A].forEach((e=>e(i,r))),e.compilerExtensions.forEach((e=>e(i,r))), +i.__beforeBegin=null,[M,O,L].forEach((e=>e(i,r))),i.isCompiled=!0;let o=null +;if("object"==typeof i.keywords&&(o=i.keywords.$pattern, +delete i.keywords.$pattern), +i.keywords&&(i.keywords=j(i.keywords,e.case_insensitive)), +i.lexemes&&o)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ") +;return o=o||i.lexemes||/\w+/, +l.keywordPatternRe=n(o,!0),r&&(i.begin||(i.begin=/\B|\b/), +l.beginRe=n(i.begin),i.endSameAsBegin&&(i.end=i.begin), +i.end||i.endsWithParent||(i.end=/\B|\b/), +i.end&&(l.endRe=n(i.end)),l.terminatorEnd=g(i.end)||"", +i.endsWithParent&&r.terminatorEnd&&(l.terminatorEnd+=(i.end?"|":"")+r.terminatorEnd)), +i.illegal&&(l.illegalRe=n(i.illegal)), +i.contains||(i.contains=[]),i.contains=[].concat(...i.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>a(e,{ +variants:null},t)))),e.cachedVariants?e.cachedVariants:S(e)?a(e,{ +starts:e.starts?a(e.starts):null +}):Object.isFrozen(e)?a(e):e))("self"===e?i:e)))),i.contains.forEach((e=>{t(e,l) +})),i.starts&&t(i.starts,r),l.matcher=(e=>{const t=new s +;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(l),l}(e)}function S(e){ +return!!e&&(e.endsWithParent||S(e.starts))}function P(e){const t={ +props:["language","code","autodetect"],data:()=>({detectedLanguage:"", +unknownLanguage:!1}),computed:{className(){ +return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){ +if(!this.autoDetect&&!e.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`), +this.unknownLanguage=!0,s(this.code);let t={} +;return this.autoDetect?(t=e.highlightAuto(this.code), +this.detectedLanguage=t.language):(t=e.highlight(this.language,this.code,this.ignoreIllegals), +this.detectedLanguage=this.language),t.value},autoDetect(){ +return!(this.language&&(e=this.autodetect,!e&&""!==e));var e}, +ignoreIllegals:()=>!0},render(e){return e("pre",{},[e("code",{ +class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{ +Component:t,VuePlugin:{install(e){e.component("highlightjs",t)}}}}const D={ +"after:highlightElement":({el:e,result:t,text:n})=>{const i=H(e) +;if(!i.length)return;const a=document.createElement("div") +;a.innerHTML=t.value,t.value=((e,t,n)=>{let i=0,a="";const r=[];function l(){ +return e.length&&t.length?e[0].offset!==t[0].offset?e[0].offset"}function c(e){ +a+=""}function g(e){("start"===e.event?o:c)(e.node)} +for(;e.length||t.length;){let t=l() +;if(a+=s(n.substring(i,t[0].offset)),i=t[0].offset,t===e){r.reverse().forEach(c) +;do{g(t.splice(0,1)[0]),t=l()}while(t===e&&t.length&&t[0].offset===i) +;r.reverse().forEach(o) +}else"start"===t[0].event?r.push(t[0].node):r.pop(),g(t.splice(0,1)[0])} +return a+s(n.substr(i))})(i,H(a),n)}};function C(e){ +return e.nodeName.toLowerCase()}function H(e){const t=[];return function e(n,i){ +for(let s=n.firstChild;s;s=s.nextSibling)3===s.nodeType?i+=s.nodeValue.length:1===s.nodeType&&(t.push({ +event:"start",offset:i,node:s}),i=e(s,i),C(s).match(/br|hr|img|input/)||t.push({ +event:"stop",offset:i,node:s}));return i}(e,0),t}const $={},U=e=>{ +console.error(e)},z=(e,...t)=>{console.log("WARN: "+e,...t)},K=(e,t)=>{ +$[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),$[`${e}/${t}`]=!0) +},G=s,V=a,W=Symbol("nomatch");return(e=>{ +const n=Object.create(null),s=Object.create(null),a=[];let r=!0 +;const l=/(^(<[^>]+>|\t|)+|\n)/gm,o="Could not find the language '{}', did you forget to load/include a language module?",g={ +disableAutodetect:!0,name:"Plain text",contains:[]};let u={ +noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +tabReplace:null,useBR:!1,languages:null,__emitter:c};function h(e){ +return u.noHighlightRe.test(e)}function d(e,t,n,i){let s="",a="" +;"object"==typeof t?(s=e, +n=t.ignoreIllegals,a=t.language,i=void 0):(K("10.7.0","highlight(lang, code, ...args) has been deprecated."), +K("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +a=e,s=t);const r={code:s,language:a};M("before:highlight",r) +;const l=r.result?r.result:f(r.language,r.code,n,i) +;return l.code=r.code,M("after:highlight",l),l}function f(e,t,s,l){ +function c(e,t){const n=v.case_insensitive?t[0].toLowerCase():t[0] +;return Object.prototype.hasOwnProperty.call(e.keywords,n)&&e.keywords[n]} +function g(){null!=R.subLanguage?(()=>{if(""===M)return;let e=null +;if("string"==typeof R.subLanguage){ +if(!n[R.subLanguage])return void k.addText(M) +;e=f(R.subLanguage,M,!0,_[R.subLanguage]),_[R.subLanguage]=e.top +}else e=p(M,R.subLanguage.length?R.subLanguage:null) +;R.relevance>0&&(O+=e.relevance),k.addSublanguage(e.emitter,e.language) +})():(()=>{if(!R.keywords)return void k.addText(M);let e=0 +;R.keywordPatternRe.lastIndex=0;let t=R.keywordPatternRe.exec(M),n="";for(;t;){ +n+=M.substring(e,t.index);const i=c(R,t);if(i){const[e,s]=i +;if(k.addText(n),n="",O+=s,e.startsWith("_"))n+=t[0];else{ +const n=v.classNameAliases[e]||e;k.addKeyword(t[0],n)}}else n+=t[0] +;e=R.keywordPatternRe.lastIndex,t=R.keywordPatternRe.exec(M)} +n+=M.substr(e),k.addText(n)})(),M=""}function h(e){ +return e.className&&k.openNode(v.classNameAliases[e.className]||e.className), +R=Object.create(e,{parent:{value:R}}),R}function d(e,t,n){let s=((e,t)=>{ +const n=e&&e.exec(t);return n&&0===n.index})(e.endRe,n);if(s){if(e["on:end"]){ +const n=new i(e);e["on:end"](t,n),n.isMatchIgnored&&(s=!1)}if(s){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return d(e.parent,t,n)}function m(e){ +return 0===R.matcher.regexIndex?(M+=e[0],1):(I=!0,0)}function b(e){ +const n=e[0],i=t.substr(e.index),s=d(R,e,i);if(!s)return W;const a=R +;a.skip?M+=n:(a.returnEnd||a.excludeEnd||(M+=n),g(),a.excludeEnd&&(M=n));do{ +R.className&&k.closeNode(),R.skip||R.subLanguage||(O+=R.relevance),R=R.parent +}while(R!==s.parent) +;return s.starts&&(s.endSameAsBegin&&(s.starts.endRe=s.endRe), +h(s.starts)),a.returnEnd?0:n.length}let E={};function x(n,a){const l=a&&a[0] +;if(M+=n,null==l)return g(),0 +;if("begin"===E.type&&"end"===a.type&&E.index===a.index&&""===l){ +if(M+=t.slice(a.index,a.index+1),!r){const t=Error("0 width match regex") +;throw t.languageName=e,t.badRule=E.rule,t}return 1} +if(E=a,"begin"===a.type)return function(e){ +const t=e[0],n=e.rule,s=new i(n),a=[n.__beforeBegin,n["on:begin"]] +;for(const n of a)if(n&&(n(e,s),s.isMatchIgnored))return m(t) +;return n&&n.endSameAsBegin&&(n.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")), +n.skip?M+=t:(n.excludeBegin&&(M+=t), +g(),n.returnBegin||n.excludeBegin||(M=t)),h(n),n.returnBegin?0:t.length}(a) +;if("illegal"===a.type&&!s){ +const e=Error('Illegal lexeme "'+l+'" for mode "'+(R.className||"")+'"') +;throw e.mode=R,e}if("end"===a.type){const e=b(a);if(e!==W)return e} +if("illegal"===a.type&&""===l)return 1 +;if(L>1e5&&L>3*a.index)throw Error("potential infinite loop, way more iterations than matches") +;return M+=l,l.length}const v=N(e) +;if(!v)throw U(o.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const w=T(v,{plugins:a});let y="",R=l||w;const _={},k=new u.__emitter(u);(()=>{ +const e=[];for(let t=R;t!==v;t=t.parent)t.className&&e.unshift(t.className) +;e.forEach((e=>k.openNode(e)))})();let M="",O=0,A=0,L=0,I=!1;try{ +for(R.matcher.considerAll();;){ +L++,I?I=!1:R.matcher.considerAll(),R.matcher.lastIndex=A +;const e=R.matcher.exec(t);if(!e)break;const n=x(t.substring(A,e.index),e) +;A=e.index+n}return x(t.substr(A)),k.closeAllNodes(),k.finalize(),y=k.toHTML(),{ +relevance:Math.floor(O),value:y,language:e,illegal:!1,emitter:k,top:R}}catch(n){ +if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{ +msg:n.message,context:t.slice(A-100,A+100),mode:n.mode},sofar:y,relevance:0, +value:G(t),emitter:k};if(r)return{illegal:!1,relevance:0,value:G(t),emitter:k, +language:e,top:R,errorRaised:n};throw n}}function p(e,t){ +t=t||u.languages||Object.keys(n);const i=(e=>{const t={relevance:0, +emitter:new u.__emitter(u),value:G(e),illegal:!1,top:g} +;return t.emitter.addText(e),t})(e),s=t.filter(N).filter(k).map((t=>f(t,e,!1))) +;s.unshift(i);const a=s.sort(((e,t)=>{ +if(e.relevance!==t.relevance)return t.relevance-e.relevance +;if(e.language&&t.language){if(N(e.language).supersetOf===t.language)return 1 +;if(N(t.language).supersetOf===e.language)return-1}return 0})),[r,l]=a,o=r +;return o.second_best=l,o}const m={"before:highlightElement":({el:e})=>{ +u.useBR&&(e.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")) +},"after:highlightElement":({result:e})=>{ +u.useBR&&(e.value=e.value.replace(/\n/g,"
    "))}},b=/^(<[^>]+>|\t)+/gm,E={ +"after:highlightElement":({result:e})=>{ +u.tabReplace&&(e.value=e.value.replace(b,(e=>e.replace(/\t/g,u.tabReplace))))}} +;function x(e){let t=null;const n=(e=>{let t=e.className+" " +;t+=e.parentNode?e.parentNode.className:"";const n=u.languageDetectRe.exec(t) +;if(n){const t=N(n[1]) +;return t||(z(o.replace("{}",n[1])),z("Falling back to no-highlight mode for this block.",e)), +t?n[1]:"no-highlight"}return t.split(/\s+/).find((e=>h(e)||N(e)))})(e) +;if(h(n))return;M("before:highlightElement",{el:e,language:n}),t=e +;const i=t.textContent,a=n?d(i,{language:n,ignoreIllegals:!0}):p(i) +;M("after:highlightElement",{el:e,result:a,text:i +}),e.innerHTML=a.value,((e,t,n)=>{const i=t?s[t]:n +;e.classList.add("hljs"),i&&e.classList.add(i)})(e,n,a.language),e.result={ +language:a.language,re:a.relevance,relavance:a.relevance +},a.second_best&&(e.second_best={language:a.second_best.language, +re:a.second_best.relevance,relavance:a.second_best.relevance})}const v=()=>{ +v.called||(v.called=!0, +K("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead."), +document.querySelectorAll("pre code").forEach(x))};let w=!1;function y(){ +"loading"!==document.readyState?document.querySelectorAll("pre code").forEach(x):w=!0 +}function N(e){return e=(e||"").toLowerCase(),n[e]||n[s[e]]} +function R(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +s[e.toLowerCase()]=t}))}function k(e){const t=N(e) +;return t&&!t.disableAutodetect}function M(e,t){const n=e;a.forEach((e=>{ +e[n]&&e[n](t)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +w&&y()}),!1),Object.assign(e,{highlight:d,highlightAuto:p,highlightAll:y, +fixMarkup:e=>{ +return K("10.2.0","fixMarkup will be removed entirely in v11.0"),K("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"), +t=e, +u.tabReplace||u.useBR?t.replace(l,(e=>"\n"===e?u.useBR?"
    ":e:u.tabReplace?e.replace(/\t/g,u.tabReplace):e)):t +;var t},highlightElement:x, +highlightBlock:e=>(K("10.7.0","highlightBlock will be removed entirely in v12.0"), +K("10.7.0","Please use highlightElement now."),x(e)),configure:e=>{ +e.useBR&&(K("10.3.0","'useBR' will be removed entirely in v11.0"), +K("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")), +u=V(u,e)},initHighlighting:v,initHighlightingOnLoad:()=>{ +K("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."), +w=!0},registerLanguage:(t,i)=>{let s=null;try{s=i(e)}catch(e){ +if(U("Language definition for '{}' could not be registered.".replace("{}",t)), +!r)throw e;U(e),s=g} +s.name||(s.name=t),n[t]=s,s.rawDefinition=i.bind(null,e),s.aliases&&R(s.aliases,{ +languageName:t})},unregisterLanguage:e=>{delete n[e] +;for(const t of Object.keys(s))s[t]===e&&delete s[t]}, +listLanguages:()=>Object.keys(n),getLanguage:N,registerAliases:R, +requireLanguage:e=>{ +K("10.4.0","requireLanguage will be removed entirely in v11."), +K("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844") +;const t=N(e);if(t)return t +;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))}, +autoDetection:k,inherit:V,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ +e["before:highlightBlock"](Object.assign({block:t.el},t)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ +e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),a.push(e)}, +vuePlugin:P(e).VuePlugin}),e.debugMode=()=>{r=!1},e.safeMode=()=>{r=!0 +},e.versionString="10.7.2";for(const e in _)"object"==typeof _[e]&&t(_[e]) +;return Object.assign(e,_),e.addPlugin(m),e.addPlugin(D),e.addPlugin(E),e})({}) +}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); +hljs.registerLanguage("apache",(()=>{"use strict";return e=>{const n={ +className:"number",begin:/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?/} +;return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0, +contains:[e.HASH_COMMENT_MODE,{className:"section",begin:/<\/?/,end:/>/, +contains:[n,{className:"number",begin:/:\d{1,5}/ +},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute", +begin:/\w+/,relevance:0,keywords:{ +nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername" +},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"}, +contains:[{className:"meta",begin:/\s\[/,end:/\]$/},{className:"variable", +begin:/[\$%]\{/,end:/\}/,contains:["self",{className:"number",begin:/[$%]\d+/}] +},n,{className:"number",begin:/\d+/},e.QUOTE_STRING_MODE]}}],illegal:/\S/}} +})()); +hljs.registerLanguage("bash",(()=>{"use strict";function e(...e){ +return e.map((e=>{return(s=e)?"string"==typeof s?s:s.source:null;var s +})).join("")}return s=>{const n={},t={begin:/\$\{/,end:/\}/,contains:["self",{ +begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{ +begin:e(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},t]});const a={ +className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},i={ +begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/, +end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/, +contains:[s.BACKSLASH_ESCAPE,n,a]};a.contains.push(c);const o={begin:/\$\(\(/, +end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,n] +},r=s.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 +}),l={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, +contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ +name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/, +keyword:"if then else elif fi for while in do done case esac function", +literal:"true false", +built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp" +},contains:[r,s.SHEBANG(),l,o,s.HASH_COMMENT_MODE,i,c,{className:"",begin:/\\"/ +},{className:"string",begin:/'/,end:/'/},n]}}})()); +hljs.registerLanguage("c",(()=>{"use strict";function e(e){ +return((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(",e,")?") +}return t=>{const n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),r="[a-zA-Z_]\\w*::",a="(decltype\\(auto\\)|"+e(r)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",i={ +className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string", +variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", +contains:[t.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},t.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},t.inherit(s,{className:"meta-string"}),{ +className:"meta-string",begin:/<.*?>/},n,t.C_BLOCK_COMMENT_MODE]},l={ +className:"title",begin:e(r)+t.IDENT_RE,relevance:0 +},d=e(r)+t.IDENT_RE+"\\s*\\(",u={ +keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", +built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary", +literal:"true false nullptr NULL"},m=[c,i,n,t.C_BLOCK_COMMENT_MODE,o,s],p={ +variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ +beginKeywords:"new throw return else",end:/;/}],keywords:u,contains:m.concat([{ +begin:/\(/,end:/\)/,keywords:u,contains:m.concat(["self"]),relevance:0}]), +relevance:0},_={className:"function",begin:"("+a+"[\\*&\\s]+)+"+d, +returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:u,illegal:/[^\w\s\*&:<>.]/, +contains:[{begin:"decltype\\(auto\\)",keywords:u,relevance:0},{begin:d, +returnBegin:!0,contains:[l],relevance:0},{className:"params",begin:/\(/, +end:/\)/,keywords:u,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,s,o,i,{ +begin:/\(/,end:/\)/,keywords:u,relevance:0, +contains:["self",n,t.C_BLOCK_COMMENT_MODE,s,o,i]}] +},i,n,t.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, +disableAutodetect:!0,illegal:"",keywords:u,contains:["self",i]},{begin:t.IDENT_RE+"::",keywords:u},{ +className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, +contains:[{beginKeywords:"final class struct"},t.TITLE_MODE]}]),exports:{ +preprocessor:c,strings:s,keywords:u}}}})()); +hljs.registerLanguage("coffeescript",(()=>{"use strict" +;const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) +;return r=>{const t={ +keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((i=["var","const","let","function","static"], +e=>!i.includes(e))),literal:n.concat(["yes","no","on","off"]), +built_in:a.concat(["npm","print"])};var i;const s="[A-Za-z$_][0-9A-Za-z$_]*",o={ +className:"subst",begin:/#\{/,end:/\}/,keywords:t +},c=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?", +relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/, +contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE] +},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,o]},{begin:/"/,end:/"/, +contains:[r.BACKSLASH_ESCAPE,o]}]},{className:"regexp",variants:[{begin:"///", +end:"///",contains:[o,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)", +relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+s +},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{ +begin:"```",end:"```"},{begin:"`",end:"`"}]}];o.contains=c +;const l=r.inherit(r.TITLE_MODE,{begin:s}),d="(\\(.*\\)\\s*)?\\B[-=]>",g={ +className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/, +end:/\)/,keywords:t,contains:["self"].concat(c)}]};return{name:"CoffeeScript", +aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/, +contains:c.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{ +className:"function",begin:"^\\s*"+s+"\\s*=\\s*"+d,end:"[-=]>",returnBegin:!0, +contains:[l,g]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function", +begin:d,end:"[-=]>",returnBegin:!0,contains:[g]}]},{className:"class", +beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{ +beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[l]},l] +},{begin:s+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}})()); +hljs.registerLanguage("cpp",(()=>{"use strict";function e(e){ +return t("(",e,")?")}function t(...e){return e.map((e=>{ +return(t=e)?"string"==typeof t?t:t.source:null;var t})).join("")}return n=>{ +const r=n.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),a="[a-zA-Z_]\\w*::",i="(decltype\\(auto\\)|"+e(a)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",s={ +className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string", +variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", +contains:[n.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},n.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},n.inherit(c,{className:"meta-string"}),{ +className:"meta-string",begin:/<.*?>/},r,n.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:e(a)+n.IDENT_RE,relevance:0 +},u=e(a)+n.IDENT_RE+"\\s*\\(",m={ +keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", +built_in:"_Bool _Complex _Imaginary", +_relevance_hints:["asin","atan2","atan","calloc","ceil","cosh","cos","exit","exp","fabs","floor","fmod","fprintf","fputs","free","frexp","auto_ptr","deque","list","queue","stack","vector","map","set","pair","bitset","multiset","multimap","unordered_set","fscanf","future","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","tolower","toupper","labs","ldexp","log10","log","malloc","realloc","memchr","memcmp","memcpy","memset","modf","pow","printf","putchar","puts","scanf","sinh","sin","snprintf","sprintf","sqrt","sscanf","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","tanh","tan","unordered_map","unordered_multiset","unordered_multimap","priority_queue","make_pair","array","shared_ptr","abort","terminate","abs","acos","vfprintf","vprintf","vsprintf","endl","initializer_list","unique_ptr","complex","imaginary","std","string","wstring","cin","cout","cerr","clog","stdin","stdout","stderr","stringstream","istringstream","ostringstream"], +literal:"true false nullptr NULL"},p={className:"function.dispatch",relevance:0, +keywords:m, +begin:t(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!while)/,n.IDENT_RE,(_=/\s*\(/, +t("(?=",_,")")))};var _;const g=[p,l,s,r,n.C_BLOCK_COMMENT_MODE,o,c],b={ +variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ +beginKeywords:"new throw return else",end:/;/}],keywords:m,contains:g.concat([{ +begin:/\(/,end:/\)/,keywords:m,contains:g.concat(["self"]),relevance:0}]), +relevance:0},f={className:"function",begin:"("+i+"[\\*&\\s]+)+"+u, +returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:m,illegal:/[^\w\s\*&:<>.]/, +contains:[{begin:"decltype\\(auto\\)",keywords:m,relevance:0},{begin:u, +returnBegin:!0,contains:[d],relevance:0},{begin:/::/,relevance:0},{begin:/:/, +endsWithParent:!0,contains:[c,o]},{className:"params",begin:/\(/,end:/\)/, +keywords:m,relevance:0,contains:[r,n.C_BLOCK_COMMENT_MODE,c,o,s,{begin:/\(/, +end:/\)/,keywords:m,relevance:0,contains:["self",r,n.C_BLOCK_COMMENT_MODE,c,o,s] +}]},s,r,n.C_BLOCK_COMMENT_MODE,l]};return{name:"C++", +aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:m,illegal:"",keywords:m,contains:["self",s]},{begin:n.IDENT_RE+"::",keywords:m},{ +className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, +contains:[{beginKeywords:"final class struct"},n.TITLE_MODE]}]),exports:{ +preprocessor:l,strings:c,keywords:m}}}})()); +hljs.registerLanguage("csharp",(()=>{"use strict";return e=>{const n={ +keyword:["abstract","as","base","break","case","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), +built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], +literal:["default","false","null","true"]},a=e.inherit(e.TITLE_MODE,{ +begin:"[a-zA-Z](\\.?\\w)*"}),i={className:"number",variants:[{ +begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] +},t=e.inherit(s,{illegal:/\n/}),r={className:"subst",begin:/\{/,end:/\}/, +keywords:n},l=e.inherit(r,{illegal:/\n/}),c={className:"string",begin:/\$"/, +end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ +},e.BACKSLASH_ESCAPE,l]},o={className:"string",begin:/\$@"/,end:'"',contains:[{ +begin:/\{\{/},{begin:/\}\}/},{begin:'""'},r]},d=e.inherit(o,{illegal:/\n/, +contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},l]}) +;r.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.C_BLOCK_COMMENT_MODE], +l.contains=[d,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.inherit(e.C_BLOCK_COMMENT_MODE,{ +illegal:/\n/})];const g={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},a] +},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={ +begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], +keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, +contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ +begin:"\x3c!--|--\x3e"},{begin:""}]}] +}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", +end:"$",keywords:{ +"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum" +}},g,i,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, +illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" +},a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", +relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[a,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", +begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ +className:"meta-string",begin:/"/,end:/"/}]},{ +beginKeywords:"new return throw await else",relevance:0},{className:"function", +begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(<.+>\\s*)?\\(",returnBegin:!0, +end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", +relevance:0},{begin:e.IDENT_RE+"\\s*(<.+>\\s*)?\\(",returnBegin:!0, +contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/, +excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, +contains:[g,i,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}})()); +hljs.registerLanguage("css",(()=>{"use strict" +;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],r=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() +;return n=>{const a=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, +HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, +ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, +illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} +}))(n),l=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS", +case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"}, +classNameAliases:{keyframePosition:"selector-tag"}, +contains:[n.C_BLOCK_COMMENT_MODE,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ +},n.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 +},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 +},a.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ +begin:":("+i.join("|")+")"},{begin:"::("+o.join("|")+")"}]},{ +className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{begin:":",end:"[;}]", +contains:[a.HEXCOLOR,a.IMPORTANT,n.CSS_NUMBER_MODE,...l,{ +begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" +},contains:[{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}] +},{className:"built_in",begin:/[\w-]+(?=\()/}]},{ +begin:(s=/@/,((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(?=",s,")")), +end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword", +begin:/@-?\w[\w]*(-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0, +relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only", +attribute:t.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute" +},...l,n.CSS_NUMBER_MODE]}]},{className:"selector-tag", +begin:"\\b("+e.join("|")+")\\b"}]};var s}})()); +hljs.registerLanguage("diff",(()=>{"use strict";return e=>({name:"Diff", +aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{ +begin:/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{ +begin:/^--- +\d+,\d+ +----$/}]},{className:"comment",variants:[{begin:/Index: /, +end:/$/},{begin:/^index/,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^-{3}/,end:/$/ +},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/},{ +begin:/^diff --git/,end:/$/}]},{className:"addition",begin:/^\+/,end:/$/},{ +className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, +end:/$/}]})})()); +hljs.registerLanguage("go",(()=>{"use strict";return e=>{const n={ +keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune", +literal:"true false iota nil", +built_in:"append cap close complex copy imag len make new panic print println real recover delete" +};return{name:"Go",aliases:["golang"],keywords:n,illegal:"{"use strict";function e(...e){ +return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n +})).join("")}return n=>{const a="HTTP/(2|1\\.[01])",s={className:"attribute", +begin:e("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{ +className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]} +},t=[s,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{ +name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+a+" \\d{3})", +end:/$/,contains:[{className:"meta",begin:a},{className:"number", +begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:t}},{ +begin:"(?=^[A-Z]+ (.*?) "+a+"$)",end:/$/,contains:[{className:"string", +begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:a},{ +className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:t} +},n.inherit(s,{relevance:0})]}}})()); +hljs.registerLanguage("ini",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(...n){ +return n.map((n=>e(n))).join("")}return s=>{const a={className:"number", +relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{begin:s.NUMBER_RE}] +},i=s.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];const t={ +className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)\}/ +}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={ +className:"string",contains:[s.BACKSLASH_ESCAPE],variants:[{begin:"'''", +end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"' +},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,a,"self"], +relevance:0 +},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map((n=>e(n))).join("|")+")" +;return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, +contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{ +begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr", +starts:{end:/$/,contains:[i,c,r,t,l,a]}}]}}})()); +hljs.registerLanguage("java",(()=>{"use strict" +;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ +className:"number",variants:[{ +begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ +begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};return e=>{ +var n="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s={ +className:"meta",begin:"@[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*", +contains:[{begin:/\(/,end:/\)/,contains:["self"]}]};const r=a;return{ +name:"Java",aliases:["jsp"],keywords:n,illegal:/<\/|#/, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, +relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ +begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ +className:"class",beginKeywords:"class interface enum",end:/[{;=]/, +excludeEnd:!0,relevance:1,keywords:"class interface enum",illegal:/[:"\[\]]/, +contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"new throw return else",relevance:0},{className:"class", +begin:"record\\s+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,excludeEnd:!0, +end:/[{;=]/,keywords:n,contains:[{beginKeywords:"record"},{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, +keywords:n,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"function", +begin:"([\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(<[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(\\s*,\\s*[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(", +returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, +keywords:n,relevance:0, +contains:[s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,r,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},r,s]}}})()); +hljs.registerLanguage("javascript",(()=>{"use strict" +;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) +;function r(e){return t("(?=",e,")")}function t(...e){return e.map((e=>{ +return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return i=>{ +const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/, +isTrulyOpeningTag:(e,n)=>{const a=e[0].length+e.index,s=e.input[a] +;"<"!==s?">"===s&&(((e,{after:n})=>{const a="", +returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{ +begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0 +},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:f}]}] +},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{ +variants:[{begin:"<>",end:""},{begin:o.begin,"on:begin":o.isTrulyOpeningTag, +end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0, +contains:["self"]}]}],relevance:0},{className:"function", +beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l, +contains:["self",i.inherit(i.TITLE_MODE,{begin:c}),p],illegal:/%/},{ +beginKeywords:"while if switch catch for"},{className:"function", +begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,contains:[p,i.inherit(i.TITLE_MODE,{begin:c})]},{variants:[{ +begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class", +beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{ +beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/, +end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:c}),"self",p] +},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set", +contains:[i.inherit(i.TITLE_MODE,{begin:c}),{begin:/\(\)/},p]},{begin:/\$[(.]/}] +}}})()); +hljs.registerLanguage("json",(()=>{"use strict";return n=>{const e={ +literal:"true false null" +},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],a=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],l={ +end:",",endsWithParent:!0,excludeEnd:!0,contains:a,keywords:e},t={begin:/\{/, +end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/, +contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(l,{begin:/:/ +})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(l)], +illegal:"\\S"};return a.push(t,s),i.forEach((n=>{a.push(n)})),{name:"JSON", +contains:a,keywords:e,illegal:"\\S"}}})()); +hljs.registerLanguage("kotlin",(()=>{"use strict" +;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ +className:"number",variants:[{ +begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ +begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};return e=>{const n={ +keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", +built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", +literal:"true false null"},i={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" +},s={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},t={ +className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", +variants:[{begin:'"""',end:'"""(?=[^"])',contains:[t,s]},{begin:"'",end:"'", +illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, +contains:[e.BACKSLASH_ESCAPE,t,s]}]};s.contains.push(r);const l={ +className:"meta", +begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" +},c={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, +end:/\)/,contains:[e.inherit(r,{className:"meta-string"})]}] +},o=a,b=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),E={ +variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, +contains:[]}]},d=E;return d.variants[1].contains=[E],E.variants[1].contains=[d], +{name:"Kotlin",aliases:["kt","kts"],keywords:n, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", +begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,b,{className:"keyword", +begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", +begin:/@\w+/}]}},i,l,c,{className:"function",beginKeywords:"fun",end:"[(]|$", +returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, +keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, +endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, +endsWithParent:!0,contains:[E,e.C_LINE_COMMENT_MODE,b],relevance:0 +},e.C_LINE_COMMENT_MODE,b,l,c,r,e.C_NUMBER_MODE]},b]},{className:"class", +beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, +illegal:"extends implements",contains:[{ +beginKeywords:"public protected internal private constructor" +},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, +excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/, +excludeBegin:!0,returnEnd:!0},l,c]},r,{className:"meta",begin:"^#!/usr/bin/env", +end:"$",illegal:"\n"},o]}}})()); +hljs.registerLanguage("less",(()=>{"use strict" +;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],n=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse(),r=i.concat(o) +;return a=>{const s=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, +HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, +ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, +illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} +}))(a),l=r,d="([\\w-]+|@\\{[\\w-]+\\})",c=[],g=[],b=e=>({className:"string", +begin:"~?"+e+".*?"+e}),m=(e,t,i)=>({className:e,begin:t,relevance:i}),u={ +$pattern:/[a-z-]+/,keyword:"and or not only",attribute:t.join(" ")},p={ +begin:"\\(",end:"\\)",contains:g,keywords:u,relevance:0} +;g.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,b("'"),b('"'),a.CSS_NUMBER_MODE,{ +begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", +excludeEnd:!0} +},s.HEXCOLOR,p,m("variable","@@?[\\w-]+",10),m("variable","@\\{[\\w-]+\\}"),m("built_in","~?`[^`]*?`"),{ +className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0 +},s.IMPORTANT);const f=g.concat({begin:/\{/,end:/\}/,contains:c}),h={ +beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not" +}].concat(g)},w={begin:d+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0, +contains:[{begin:/-(webkit|moz|ms|o)-/},{className:"attribute", +begin:"\\b("+n.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0, +illegal:"[<=$]",relevance:0,contains:g}}]},v={className:"keyword", +begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", +starts:{end:"[;{}]",keywords:u,returnEnd:!0,contains:g,relevance:0}},y={ +className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{ +begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:f}},k={variants:[{ +begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:d,end:/\{/}],returnBegin:!0, +returnEnd:!0,illegal:"[<='$\"]",relevance:0, +contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,h,m("keyword","all\\b"),m("variable","@\\{[\\w-]+\\}"),{ +begin:"\\b("+e.join("|")+")\\b",className:"selector-tag" +},m("selector-tag",d+"%?",0),m("selector-id","#"+d),m("selector-class","\\."+d,0),m("selector-tag","&",0),s.ATTRIBUTE_SELECTOR_MODE,{ +className:"selector-pseudo",begin:":("+i.join("|")+")"},{ +className:"selector-pseudo",begin:"::("+o.join("|")+")"},{begin:"\\(",end:"\\)", +contains:f},{begin:"!important"}]},E={begin:`[\\w-]+:(:)?(${l.join("|")})`, +returnBegin:!0,contains:[k]} +;return c.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,v,y,E,w,k),{ +name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:c}}})()); +hljs.registerLanguage("lua",(()=>{"use strict";return e=>{ +const t="\\[=*\\[",a="\\]=*\\]",n={begin:t,end:a,contains:["self"] +},o=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[",a,{contains:[n], +relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, +literal:"true false nil", +keyword:"and break do else elseif end for goto if in local not or repeat return then until while", +built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" +},contains:o.concat([{className:"function",beginKeywords:"function",end:"\\)", +contains:[e.inherit(e.TITLE_MODE,{ +begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", +begin:"\\(",endsWithParent:!0,contains:o}].concat(o) +},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", +begin:t,end:a,contains:[n],relevance:5}])}}})()); +hljs.registerLanguage("makefile",(()=>{"use strict";return e=>{const i={ +className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} +function a(...n){return n.map((n=>e(n))).join("")}function s(...n){ +return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ +const t=a(/[A-Z_]/,a("(",/[A-Z0-9_.-]*:/,")?"),/[A-Z0-9_.-]*/),i={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},r={begin:/\s/, +contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},c=e.inherit(r,{begin:/\(/,end:/\)/}),l=e.inherit(e.APOS_STRING_MODE,{ +className:"meta-string"}),g=e.inherit(e.QUOTE_STRING_MODE,{ +className:"meta-string"}),m={endsWithParent:!0,illegal:/`]+/}]}] +}]};return{name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,contains:[{className:"meta",begin://, +relevance:10,contains:[r,g,l,c,{begin:/\[/,end:/\]/,contains:[{className:"meta", +begin://,contains:[r,c,g,l]}]}]},e.COMMENT(//,{ +relevance:10}),{begin://,relevance:10},i,{ +className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[m],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[m],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:a(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name", +begin:t,relevance:0,starts:m}]},{className:"tag",begin:a(/<\//,n(a(t,/>/))), +contains:[{className:"name",begin:t,relevance:0},{begin:/>/,relevance:0, +endsParent:!0}]}]}}})()); +hljs.registerLanguage("markdown",(()=>{"use strict";function n(...n){ +return n.map((n=>{return(e=n)?"string"==typeof e?e:e.source:null;var e +})).join("")}return e=>{const a={begin:/<\/?[A-Za-z_]/,end:">", +subLanguage:"xml",relevance:0},i={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0 +},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{begin:n(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.+?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{ +className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},s={className:"strong",contains:[], +variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},c={ +className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{ +begin:/_(?!_)/,end:/_/,relevance:0}]};s.contains.push(c),c.contains.push(s) +;let t=[a,i] +;return s.contains=s.contains.concat(t),c.contains=c.contains.concat(t), +t=t.concat(s,c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:t},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:t}]}]},a,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},s,c,{className:"quote",begin:"^>\\s+",contains:t, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},i,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})()); +hljs.registerLanguage("nginx",(()=>{"use strict";return e=>{const n={ +className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/\}/},{ +begin:/[$@]/+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{ +$pattern:"[a-z/_]+", +literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll" +},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string", +contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/ +}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n] +},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^", +end:"\\s|\\{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|\\{|;",returnEnd:!0},{ +begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number", +begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{ +className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{ +name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{ +begin:e.UNDERSCORE_IDENT_RE+"\\s+\\{",returnBegin:!0,end:/\{/,contains:[{ +className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{ +begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|\\{",returnBegin:!0,contains:[{ +className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}], +illegal:"[^\\s\\}]"}}})()); +hljs.registerLanguage("objectivec",(()=>{"use strict";return e=>{ +const n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n, +keyword:"@interface @class @protocol @implementation"};return{ +name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], +keywords:{$pattern:n, +keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN", +literal:"false true FALSE TRUE nil YES NO NULL", +built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once" +},illegal:"/,end:/$/, +illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:/(\{|$)/, +excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{ +begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}})()); +hljs.registerLanguage("perl",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(...n){ +return n.map((n=>e(n))).join("")}function t(...n){ +return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ +const r=/[dualxmsipngr]{0,12}/,s={$pattern:/[\w.]+/, +keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" +},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:s},a={begin:/->\{/, +end:/\}/},o={variants:[{begin:/\$\d/},{ +begin:n(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])") +},{begin:/[$%@][^\s\w{]/,relevance:0}] +},c=[e.BACKSLASH_ESCAPE,i,o],g=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],l=(e,t,s="\\1")=>{ +const i="\\1"===s?s:n(s,t) +;return n(n("(?:",e,")"),t,/(?:\\.|[^\\\/])*?/,i,/(?:\\.|[^\\\/])*?/,s,r) +},d=(e,t,s)=>n(n("(?:",e,")"),t,/(?:\\.|[^\\\/])*?/,s,r),p=[o,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{ +endsWithParent:!0}),a,{className:"string",contains:c,variants:[{ +begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[", +end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{ +begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">", +relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'", +contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{ +begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number", +begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b", +relevance:0},{ +begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*", +keywords:"split return print reverse grep",relevance:0, +contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{ +begin:l("s|tr|y",t(...g))},{begin:l("s|tr|y","\\(","\\)")},{ +begin:l("s|tr|y","\\[","\\]")},{begin:l("s|tr|y","\\{","\\}")}],relevance:2},{ +className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{ +begin:d("(?:m|qr)?",/\//,/\//)},{begin:d("m|qr",t(...g),/\1/)},{ +begin:d("m|qr",/\(/,/\)/)},{begin:d("m|qr",/\[/,/\]/)},{ +begin:d("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub", +end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{ +begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$", +subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}] +}];return i.contains=p,a.contains=p,{name:"Perl",aliases:["pl","pm"],keywords:s, +contains:p}}})()); +hljs.registerLanguage("php",(()=>{"use strict";return e=>{const r={ +className:"variable", +begin:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?![A-Za-z0-9])(?![$])"},t={ +className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{ +begin:/\?>/}]},a={className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/, +end:/\}/}]},n=e.inherit(e.APOS_STRING_MODE,{illegal:null +}),i=e.inherit(e.QUOTE_STRING_MODE,{illegal:null, +contains:e.QUOTE_STRING_MODE.contains.concat(a)}),o=e.END_SAME_AS_BEGIN({ +begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/, +contains:e.QUOTE_STRING_MODE.contains.concat(a)}),l={className:"string", +contains:[e.BACKSLASH_ESCAPE,t],variants:[e.inherit(n,{begin:"b'",end:"'" +}),e.inherit(i,{begin:'b"',end:'"'}),i,n,o]},s={className:"number",variants:[{ +begin:"\\b0b[01]+(?:_[01]+)*\\b"},{begin:"\\b0o[0-7]+(?:_[0-7]+)*\\b"},{ +begin:"\\b0x[\\da-f]+(?:_[\\da-f]+)*\\b"},{ +begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:e[+-]?\\d+)?" +}],relevance:0},c={ +keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile enum eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list match|0 mixed new object or private protected public real return string switch throw trait try unset use var void while xor yield", +literal:"false null true", +built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException UnhandledMatchError ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Stringable Throwable Traversable WeakReference WeakMap Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass" +};return{aliases:["php3","php4","php5","php6","php7","php8"], +case_insensitive:!0,keywords:c, +contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t] +}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}] +}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0, +keywords:"__halt_compiler"}),t,{className:"keyword",begin:/\$this\b/},r,{ +begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function", +relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0, +illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{ +begin:"=>",endsParent:!0},{className:"params",begin:"\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0,keywords:c, +contains:["self",r,e.C_BLOCK_COMMENT_MODE,l,s]}]},{className:"class",variants:[{ +beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", +illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ +beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, +contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",relevance:0,end:";", +contains:[e.UNDERSCORE_TITLE_MODE]},l,s]}}})()); +hljs.registerLanguage("php-template",(()=>{"use strict";return n=>({ +name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/, +subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"', +end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{ +illegal:null,className:null,contains:null,skip:!0 +}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null, +skip:!0})]}]})})()); +hljs.registerLanguage("plaintext",(()=>{"use strict";return t=>({ +name:"Plain text",aliases:["text","txt"],disableAutodetect:!0})})()); +hljs.registerLanguage("properties",(()=>{"use strict";return e=>{ +var n="[ \\t\\f]*",a=n+"[:=]"+n,t="("+a+"|[ \\t\\f]+)",r="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",s="([^\\\\:= \\t\\f\\n]|\\\\.)+",i={ +end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{ +begin:"\\\\\\\\"},{begin:"\\\\\\n"}]}};return{name:".properties", +case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{ +returnBegin:!0,variants:[{begin:r+a,relevance:1},{begin:r+"[ \\t\\f]+", +relevance:0}],contains:[{className:"attr",begin:r,endsParent:!0,relevance:0}], +starts:i},{begin:s+t,returnBegin:!0,relevance:0,contains:[{className:"meta", +begin:s,endsParent:!0,relevance:0}],starts:i},{className:"attr",relevance:0, +begin:s+n+"$"}]}}})()); +hljs.registerLanguage("python",(()=>{"use strict";return e=>{const n={ +$pattern:/[A-Za-z]\w+|__\w+__/, +keyword:["and","as","assert","async","await","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"], +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/, +end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},t={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},r="[0-9](_?[0-9])*",l=`(\\b(${r}))?\\.(${r})|\\b(${r})\\.`,b={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${r})|(${l}))[eE][+-]?(${r})[jJ]?\\b`},{begin:`(${l})[jJ]?`},{ +begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?\\b"},{ +begin:"\\b0[bB](_?[01])+[lL]?\\b"},{begin:"\\b0[oO](_?[0-7])+[lL]?\\b"},{ +begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?\\b"},{begin:`\\b(${r})[jJ]\\b`}]},o={ +className:"comment", +begin:(d=/# type:/,((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(?=",d,")")), +end:/$/,keywords:n,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/, +endsWithParent:!0}]},c={className:"params",variants:[{className:"", +begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0, +keywords:n,contains:["self",a,b,t,e.HASH_COMMENT_MODE]}]};var d +;return i.contains=[t,b,a],{name:"Python",aliases:["py","gyp","ipython"], +keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,b,{begin:/\bself\b/},{ +beginKeywords:"if",relevance:0},t,o,e.HASH_COMMENT_MODE,{variants:[{ +className:"function",beginKeywords:"def"},{className:"class", +beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/, +contains:[e.UNDERSCORE_TITLE_MODE,c,{begin:/->/,endsWithParent:!0,keywords:n}] +},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[b,c,t]}]}}})()); +hljs.registerLanguage("python-repl",(()=>{"use strict";return s=>({ +aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$", +subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{ +begin:/^\.\.\.(?=[ ]|$)/}]}]})})()); +hljs.registerLanguage("r",(()=>{"use strict";function e(...e){return e.map((e=>{ +return(a=e)?"string"==typeof a?a:a.source:null;var a})).join("")}return a=>{ +const n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/;return{name:"R", +illegal:/->/,keywords:{$pattern:n, +keyword:"function if in break next repeat else for while", +literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", +built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" +},compilerExtensions:[(a,n)=>{if(!a.beforeMatch)return +;if(a.starts)throw Error("beforeMatch cannot be used with starts") +;const i=Object.assign({},a);Object.keys(a).forEach((e=>{delete a[e] +})),a.begin=e(i.beforeMatch,e("(?=",i.begin,")")),a.starts={relevance:0, +contains:[Object.assign(i,{endsParent:!0})]},a.relevance=0,delete i.beforeMatch +}],contains:[a.COMMENT(/#'/,/$/,{contains:[{className:"doctag", +begin:"@examples",starts:{contains:[{begin:/\n/},{begin:/#'\s*(?=@[a-zA-Z]+)/, +endsParent:!0},{begin:/#'/,end:/$/,excludeBegin:!0}]}},{className:"doctag", +begin:"@param",end:/$/,contains:[{className:"variable",variants:[{begin:n},{ +begin:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{className:"doctag", +begin:/@[a-zA-Z]+/},{className:"meta-keyword",begin:/\\[a-zA-Z]+/}] +}),a.HASH_COMMENT_MODE,{className:"string",contains:[a.BACKSLASH_ESCAPE], +variants:[a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ +}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', +relevance:0},{begin:"'",end:"'",relevance:0}]},{className:"number",relevance:0, +beforeMatch:/([^a-zA-Z0-9._])/,variants:[{ +match:/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/},{ +match:/0[xX][0-9a-fA-F]+([pP][+-]?\d+)?[Li]?/},{ +match:/(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?[Li]?/}]},{begin:"%",end:"%"},{ +begin:e(/[a-zA-Z][a-zA-Z_0-9]*/,"\\s+<-\\s+")},{begin:"`",end:"`",contains:[{ +begin:/\\./}]}]}}})()); +hljs.registerLanguage("ruby",(()=>{"use strict";function e(...e){ +return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n +})).join("")}return n=>{ +const a="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",i={ +keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor __FILE__", +built_in:"proc lambda",literal:"true false nil"},s={className:"doctag", +begin:"@[A-Za-z]+"},r={begin:"#<",end:">"},b=[n.COMMENT("#","$",{contains:[s] +}),n.COMMENT("^=begin","^=end",{contains:[s],relevance:10 +}),n.COMMENT("^__END__","\\n$")],c={className:"subst",begin:/#\{/,end:/\}/, +keywords:i},t={className:"string",contains:[n.BACKSLASH_ESCAPE,c],variants:[{ +begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/, +end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{ +begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/, +end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{ +begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{ +begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ +begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ +begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ +begin:/<<[-~]?'?(\w+)\n(?:[^\n]*\n)*?\s*\1\b/,returnBegin:!0,contains:[{ +begin:/<<[-~]?'?/},n.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, +contains:[n.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",d={className:"number", +relevance:0,variants:[{ +begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ +begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" +},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ +begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ +begin:"\\b0(_?[0-7])+r?i?\\b"}]},l={className:"params",begin:"\\(",end:"\\)", +endsParent:!0,keywords:i},o=[t,{className:"class",beginKeywords:"class module", +end:"$|;",illegal:/=/,contains:[n.inherit(n.TITLE_MODE,{ +begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|!)?"}),{begin:"<\\s*",contains:[{ +begin:"("+n.IDENT_RE+"::)?"+n.IDENT_RE,relevance:0}]}].concat(b)},{ +className:"function",begin:e(/def\s+/,(_=a+"\\s*(\\(|;|$)",e("(?=",_,")"))), +relevance:0,keywords:"def",end:"$|;",contains:[n.inherit(n.TITLE_MODE,{begin:a +}),l].concat(b)},{begin:n.IDENT_RE+"::"},{className:"symbol", +begin:n.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", +begin:":(?!\\s)",contains:[t,{begin:a}],relevance:0},d,{className:"variable", +begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ +className:"params",begin:/\|/,end:/\|/,relevance:0,keywords:i},{ +begin:"("+n.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{ +className:"regexp",contains:[n.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{ +begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(", +end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}] +}].concat(r,b),relevance:0}].concat(r,b);var _;c.contains=o,l.contains=o +;const E=[{begin:/^\s*=>/,starts:{end:"$",contains:o}},{className:"meta", +begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", +starts:{end:"$",contains:o}}];return b.unshift(r),{name:"Ruby", +aliases:["rb","gemspec","podspec","thor","irb"],keywords:i,illegal:/\/\*/, +contains:[n.SHEBANG({binary:"ruby"})].concat(E).concat(b).concat(o)}}})()); +hljs.registerLanguage("rust",(()=>{"use strict";return e=>{ +const n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!" +;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?", +keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield", +literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}})()); +hljs.registerLanguage("scss",(()=>{"use strict" +;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],r=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() +;return a=>{const n=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, +HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, +ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, +illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} +}))(a),l=o,s=i,d="@[a-z-]+",c={className:"variable", +begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"};return{name:"SCSS",case_insensitive:!0, +illegal:"[=/|']",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{ +className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ +className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 +},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", +begin:"\\b("+e.join("|")+")\\b",relevance:0},{className:"selector-pseudo", +begin:":("+s.join("|")+")"},{className:"selector-pseudo", +begin:"::("+l.join("|")+")"},c,{begin:/\(/,end:/\)/,contains:[a.CSS_NUMBER_MODE] +},{className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{ +begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" +},{begin:":",end:";", +contains:[c,n.HEXCOLOR,a.CSS_NUMBER_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,n.IMPORTANT] +},{begin:"@(page|font-face)",lexemes:d,keywords:"@page @font-face"},{begin:"@", +end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, +keyword:"and or not only",attribute:t.join(" ")},contains:[{begin:d, +className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" +},c,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,n.HEXCOLOR,a.CSS_NUMBER_MODE]}]}} +})()); +hljs.registerLanguage("shell",(()=>{"use strict";return s=>({ +name:"Shell Session",aliases:["console"],contains:[{className:"meta", +begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#]/,starts:{end:/[^\\](?=\s*$)/, +subLanguage:"bash"}}]})})()); +hljs.registerLanguage("sql",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function r(...r){ +return r.map((r=>e(r))).join("")}function t(...r){ +return"("+r.map((r=>e(r))).join("|")+")"}return e=>{ +const n=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],s=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],o=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],c=s,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update ","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!s.includes(e))),u={ +begin:r(/\b/,t(...c),/\s*\(/),keywords:{built_in:c}};return{name:"SQL", +case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/, +keyword:((e,{exceptions:r,when:t}={})=>{const n=t +;return r=r||[],e.map((e=>e.match(/\|\d+$/)||r.includes(e)?e:n(e)?e+"|0":e)) +})(l,{when:e=>e.length<3}),literal:a,type:i, +built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] +},contains:[{begin:t(...o),keywords:{$pattern:/[\w\.]+/,keyword:l.concat(o), +literal:a,type:i}},{className:"type", +begin:t("double precision","large object","with timezone","without timezone") +},u,{className:"variable",begin:/@[a-z0-9]+/},{className:"string",variants:[{ +begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/,contains:[{ +begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,n,{className:"operator", +begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}})()); +hljs.registerLanguage("swift",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} +function a(...n){return n.map((n=>e(n))).join("")}function t(...n){ +return"("+n.map((n=>e(n))).join("|")+")"} +const i=e=>a(/\b/,e,/\w$/.test(e)?/\b/:/\B/),s=["Protocol","Type"].map(i),u=["init","self"].map(i),c=["Any","Self"],r=["associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],o=["false","nil","true"],l=["assignment","associativity","higherThan","left","lowerThan","none","right"],m=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],d=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],p=t(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),F=t(p,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),b=a(p,F,"*"),h=t(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),f=t(h,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),w=a(h,f,"*"),y=a(/[A-Z]/,f,"*"),g=["autoclosure",a(/convention\(/,t("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",a(/objc\(/,w,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","testable","UIApplicationMain","unknown","usableFromInline"],E=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] +;return e=>{const p={match:/\s+/,relevance:0},h=e.COMMENT("/\\*","\\*/",{ +contains:["self"]}),v=[e.C_LINE_COMMENT_MODE,h],N={className:"keyword", +begin:a(/\./,n(t(...s,...u))),end:t(...s,...u),excludeBegin:!0},A={ +match:a(/\./,t(...r)),relevance:0 +},C=r.filter((e=>"string"==typeof e)).concat(["_|0"]),_={variants:[{ +className:"keyword", +match:t(...r.filter((e=>"string"!=typeof e)).concat(c).map(i),...u)}]},D={ +$pattern:t(/\b\w+/,/#\w+/),keyword:C.concat(m),literal:o},B=[N,A,_],k=[{ +match:a(/\./,t(...d)),relevance:0},{className:"built_in", +match:a(/\b/,t(...d),/(?=\()/)}],M={match:/->/,relevance:0},S=[M,{ +className:"operator",relevance:0,variants:[{match:b},{match:`\\.(\\.|${F})+`}] +}],x="([0-9a-fA-F]_*)+",I={className:"number",relevance:0,variants:[{ +match:"\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b"},{ +match:`\\b0x(${x})(\\.(${x}))?([pP][+-]?(([0-9]_*)+))?\\b`},{ +match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},O=(e="")=>({ +className:"subst",variants:[{match:a(/\\/,e,/[0\\tnr"']/)},{ +match:a(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}]}),T=(e="")=>({className:"subst", +match:a(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),L=(e="")=>({className:"subst", +label:"interpol",begin:a(/\\/,e,/\(/),end:/\)/}),P=(e="")=>({begin:a(e,/"""/), +end:a(/"""/,e),contains:[O(e),T(e),L(e)]}),$=(e="")=>({begin:a(e,/"/), +end:a(/"/,e),contains:[O(e),L(e)]}),K={className:"string", +variants:[P(),P("#"),P("##"),P("###"),$(),$("#"),$("##"),$("###")]},j={ +match:a(/`/,w,/`/)},z=[j,{className:"variable",match:/\$\d+/},{ +className:"variable",match:`\\$${f}+`}],q=[{match:/(@|#)available/, +className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:E, +contains:[...S,I,K]}]}},{className:"keyword",match:a(/@/,t(...g))},{ +className:"meta",match:a(/@/,w)}],U={match:n(/\b[A-Z]/),relevance:0,contains:[{ +className:"type", +match:a(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,f,"+") +},{className:"type",match:y,relevance:0},{match:/[?!]+/,relevance:0},{ +match:/\.\.\./,relevance:0},{match:a(/\s+&\s+/,n(y)),relevance:0}]},Z={ +begin://,keywords:D,contains:[...v,...B,...q,M,U]};U.contains.push(Z) +;const G={begin:/\(/,end:/\)/,relevance:0,keywords:D,contains:["self",{ +match:a(w,/\s*:/),keywords:"_|0",relevance:0 +},...v,...B,...k,...S,I,K,...z,...q,U]},H={beginKeywords:"func",contains:[{ +className:"title",match:t(j.match,w,b),endsParent:!0,relevance:0},p]},R={ +begin://,contains:[...v,U]},V={begin:/\(/,end:/\)/,keywords:D, +contains:[{begin:t(n(a(w,/\s*:/)),n(a(w,/\s+/,w,/\s*:/))),end:/:/,relevance:0, +contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:w}] +},...v,...B,...S,I,K,...q,U,G],endsParent:!0,illegal:/["']/},W={ +className:"function",match:n(/\bfunc\b/),contains:[H,R,V,p],illegal:[/\[/,/%/] +},X={className:"function",match:/\b(subscript|init[?!]?)\s*(?=[<(])/,keywords:{ +keyword:"subscript init init? init!",$pattern:/\w+[?!]?/},contains:[R,V,p], +illegal:/\[|%/},J={beginKeywords:"operator",end:e.MATCH_NOTHING_RE,contains:[{ +className:"title",match:b,endsParent:!0,relevance:0}]},Q={ +beginKeywords:"precedencegroup",end:e.MATCH_NOTHING_RE,contains:[{ +className:"title",match:y,relevance:0},{begin:/{/,end:/}/,relevance:0, +endsParent:!0,keywords:[...l,...o],contains:[U]}]};for(const e of K.variants){ +const n=e.contains.find((e=>"interpol"===e.label));n.keywords=D +;const a=[...B,...k,...S,I,K,...z];n.contains=[...a,{begin:/\(/,end:/\)/, +contains:["self",...a]}]}return{name:"Swift",keywords:D,contains:[...v,W,X,{ +className:"class",beginKeywords:"struct protocol class extension enum", +end:"\\{",excludeEnd:!0,keywords:D,contains:[e.inherit(e.TITLE_MODE,{ +begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...B]},J,Q,{ +beginKeywords:"import",end:/$/,contains:[...v],relevance:0 +},...B,...k,...S,I,K,...z,...q,U,G]}}})()); +hljs.registerLanguage("typescript",(()=>{"use strict" +;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) +;function t(e){return r("(?=",e,")")}function r(...e){return e.map((e=>{ +return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return i=>{ +const c={$pattern:e, +keyword:n.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]), +literal:a, +built_in:s.concat(["any","void","number","boolean","string","object","never","enum"]) +},o={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},l=(e,n,a)=>{ +const s=e.contains.findIndex((e=>e.label===n)) +;if(-1===s)throw Error("can not find mode to replace");e.contains.splice(s,1,a) +},b=(i=>{const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/, +end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ +const a=e[0].length+e.index,s=e.input[a];"<"!==s?">"===s&&(((e,{after:n})=>{ +const a="", +returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{ +begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0 +},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:f}]}] +},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{ +variants:[{begin:"<>",end:""},{begin:o.begin,"on:begin":o.isTrulyOpeningTag, +end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0, +contains:["self"]}]}],relevance:0},{className:"function", +beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l, +contains:["self",i.inherit(i.TITLE_MODE,{begin:c}),A],illegal:/%/},{ +beginKeywords:"while if switch catch for"},{className:"function", +begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,contains:[A,i.inherit(i.TITLE_MODE,{begin:c})]},{variants:[{ +begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class", +beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{ +beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/, +end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:c}),"self",A] +},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set", +contains:[i.inherit(i.TITLE_MODE,{begin:c}),{begin:/\(\)/},A]},{begin:/\$[(.]/}] +}})(i) +;return Object.assign(b.keywords,c),b.exports.PARAMS_CONTAINS.push(o),b.contains=b.contains.concat([o,{ +beginKeywords:"namespace",end:/\{/,excludeEnd:!0},{beginKeywords:"interface", +end:/\{/,excludeEnd:!0,keywords:"interface extends" +}]),l(b,"shebang",i.SHEBANG()),l(b,"use_strict",{className:"meta",relevance:10, +begin:/^\s*['"]use strict['"]/ +}),b.contains.find((e=>"function"===e.className)).relevance=0,Object.assign(b,{ +name:"TypeScript",aliases:["ts","tsx"]}),b}})()); +hljs.registerLanguage("vbnet",(()=>{"use strict";function e(e){ +return e?"string"==typeof e?e:e.source:null}function n(...n){ +return n.map((n=>e(n))).join("")}function t(...n){ +return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ +const a=/\d{1,2}\/\d{1,2}\/\d{4}/,i=/\d{4}-\d{1,2}-\d{1,2}/,s=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,o={ +className:"literal",variants:[{begin:n(/# */,t(i,a),/ *#/)},{ +begin:n(/# */,r,/ *#/)},{begin:n(/# */,s,/ *#/)},{ +begin:n(/# */,t(i,a),/ +/,t(s,r),/ *#/)}]},l=e.COMMENT(/'''/,/$/,{contains:[{ +className:"doctag",begin:/<\/?/,end:/>/}]}),c=e.COMMENT(null,/$/,{variants:[{ +begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]});return{name:"Visual Basic .NET", +aliases:["vb"],case_insensitive:!0,classNameAliases:{label:"symbol"},keywords:{ +keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", +built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", +type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", +literal:"true false nothing"}, +illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{ +className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/, +end:/"/,illegal:/\n/,contains:[{begin:/""/}]},o,{className:"number",relevance:0, +variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ +},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{ +begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{ +className:"label",begin:/^\w+:/},l,c,{className:"meta", +begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, +end:/$/,keywords:{ +"meta-keyword":"const disable else elseif enable end externalsource if region then" +},contains:[c]}]}}})()); +hljs.registerLanguage("yaml",(()=>{"use strict";return e=>{ +var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*'()[\\]]+",s={ +className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ +},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", +variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(s,{ +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={ +end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},t={begin:/\{/, +end:/\}/,contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]", +contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{ +begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ +begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", +relevance:10},{className:"string", +begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ +begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, +relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type", +begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a +},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", +begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", +relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ +className:"number", +begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" +},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},t,g,s],r=[...b] +;return r.pop(),r.push(i),l.contains=r,{name:"YAML",case_insensitive:!0, +aliases:["yml"],contains:b}}})()); \ No newline at end of file diff --git a/htmlReport/js/highlightjs-line-numbers.min.js b/htmlReport/js/highlightjs-line-numbers.min.js new file mode 100644 index 0000000000..8548576704 --- /dev/null +++ b/htmlReport/js/highlightjs-line-numbers.min.js @@ -0,0 +1,24 @@ +/* +The MIT License (MIT) + +Copyright (c) 2017 Yauheni Pakala + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +!function(r,o){"use strict";var e,i="hljs-ln",l="hljs-ln-line",h="hljs-ln-code",s="hljs-ln-numbers",c="hljs-ln-n",m="data-line-number",a=/\r\n|\r|\n/g;function u(e){for(var n=e.toString(),t=e.anchorNode;"TD"!==t.nodeName;)t=t.parentNode;for(var r=e.focusNode;"TD"!==r.nodeName;)r=r.parentNode;var o=parseInt(t.dataset.lineNumber),a=parseInt(r.dataset.lineNumber);if(o==a)return n;var i,l=t.textContent,s=r.textContent;for(a
    {6}',[l,s,c,m,h,o+n.startFrom,0{1}',[i,r])}return e}(e.innerHTML,o)}function v(e){var n=e.className;if(/hljs-/.test(n)){for(var t=g(e.innerHTML),r=0,o="";r{1}
    \n',[n,0 + + + Coverage Report > bagpacker + + + + + + +
    + + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_BLOCK.html b/htmlReport/ns-1/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..37d37ba903 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_BLOCK.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    +
    + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..f71e0a68a4 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    +
    + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_CLASS.html b/htmlReport/ns-1/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..69d025ba89 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_CLASS.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    +
    + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..5dce98cf7f --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    +
    + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_LINE.html b/htmlReport/ns-1/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..8fcc2c0ab4 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_LINE.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    +
    + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..2590d16f48 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    +
    + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_METHOD.html b/htmlReport/ns-1/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..81073be476 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_METHOD.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    +
    + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..05509590a8 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    +
    + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..288d78acd5 --- /dev/null +++ b/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,142 @@ + + + + + Coverage Report > bagpacker + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    +
    + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-1/sources/source-1.html b/htmlReport/ns-1/sources/source-1.html new file mode 100644 index 0000000000..0e2063de4f --- /dev/null +++ b/htmlReport/ns-1/sources/source-1.html @@ -0,0 +1,150 @@ + + + + + + + Coverage Report > BagPacker + + + + + + +
    + + +

    Coverage Summary for Class: BagPacker (bagpacker)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    +
    + + +
    + package bagpacker;
    + 
    + import bagpacker.commands.ByeCommand;
    + import bagpacker.commands.Command;
    + import bagpacker.iohandler.Storage;
    + import bagpacker.iohandler.Ui;
    + import bagpacker.iohandler.Parser;
    + import bagpacker.packingfunc.PackingList;
    + 
    + import java.io.FileNotFoundException;
    + 
    + public class BagPacker {
    +     private static PackingList packingList;
    + 
    +     /**
    +      * Main entry-point for the java.BagPacker application.
    +      */
    +     public static void main(String[] args) {
    +         // Initialise variables
    +         BagPacker.packingList = new PackingList();
    +         Ui.initialMessage();
    + 
    +         // load save file if possible
    +         try {
    +             Storage.load();
    +             Ui.showUserReturn();
    +         } catch (FileNotFoundException | RuntimeException e) {
    +             Ui.showNewUser();
    +         }
    + 
    +         // run main program
    +         runBagPacker();
    + 
    +         // save packingList
    +         Storage.save(packingList);
    + 
    +         // Close program
    +         Ui.goodbyeMessage();
    +     }
    + 
    +     public static void runBagPacker() {
    +         while (ByeCommand.isBagPackerRunning) {
    +             Command c = Parser.parse();
    +             c.execute(packingList);
    +         }
    +     }
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-2/index.html b/htmlReport/ns-2/index.html new file mode 100644 index 0000000000..78fc33a710 --- /dev/null +++ b/htmlReport/ns-2/index.html @@ -0,0 +1,412 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.commands

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (8/8) + +
    ByeCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (3/3) + +
    Command + + 100% + + + (1/1) + + + + 83.3% + + + (5/6) + + + + 87.5% + + + (7/8) + +
    DeleteCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
    DeleteListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    HelpCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (2/2) + +
    IncorrectCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    ListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 72.7% + + + (8/11) + +
    PackAllCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    UnpackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_BLOCK.html b/htmlReport/ns-2/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..b8e83aa195 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_BLOCK.html @@ -0,0 +1,412 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.commands

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (8/8) + +
    ByeCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (3/3) + +
    Command + + 100% + + + (1/1) + + + + 83.3% + + + (5/6) + + + + 87.5% + + + (7/8) + +
    DeleteCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
    DeleteListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    HelpCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (2/2) + +
    IncorrectCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    ListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 72.7% + + + (8/11) + +
    PackAllCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    UnpackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..9a3aff2f1f --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,412 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.commands

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    UnpackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackAllCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    ListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 72.7% + + + (8/11) + +
    IncorrectCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    HelpCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (2/2) + +
    DeleteListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    DeleteCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
    Command + + 100% + + + (1/1) + + + + 83.3% + + + (5/6) + + + + 87.5% + + + (7/8) + +
    ByeCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (3/3) + +
    AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (8/8) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_CLASS.html b/htmlReport/ns-2/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..93dcbfd28f --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_CLASS.html @@ -0,0 +1,412 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.commands

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (8/8) + +
    ByeCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (3/3) + +
    Command + + 100% + + + (1/1) + + + + 83.3% + + + (5/6) + + + + 87.5% + + + (7/8) + +
    DeleteCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
    DeleteListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    HelpCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (2/2) + +
    IncorrectCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    ListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 72.7% + + + (8/11) + +
    PackAllCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    UnpackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..8c46d75e51 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,412 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.commands

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    UnpackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackAllCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    ListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 72.7% + + + (8/11) + +
    IncorrectCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    HelpCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (2/2) + +
    DeleteListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    DeleteCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
    Command + + 100% + + + (1/1) + + + + 83.3% + + + (5/6) + + + + 87.5% + + + (7/8) + +
    ByeCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (3/3) + +
    AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (8/8) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_LINE.html b/htmlReport/ns-2/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..3606814e33 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_LINE.html @@ -0,0 +1,412 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.commands

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    ListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 72.7% + + + (8/11) + +
    Command + + 100% + + + (1/1) + + + + 83.3% + + + (5/6) + + + + 87.5% + + + (7/8) + +
    AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (8/8) + +
    ByeCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (3/3) + +
    DeleteCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
    DeleteListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    HelpCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (2/2) + +
    IncorrectCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    PackAllCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    UnpackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..92f941632a --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,412 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.commands

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    UnpackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackAllCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    IncorrectCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    HelpCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (2/2) + +
    DeleteListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    DeleteCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
    ByeCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (3/3) + +
    AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (8/8) + +
    Command + + 100% + + + (1/1) + + + + 83.3% + + + (5/6) + + + + 87.5% + + + (7/8) + +
    ListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 72.7% + + + (8/11) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_METHOD.html b/htmlReport/ns-2/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..601ae686d8 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_METHOD.html @@ -0,0 +1,412 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.commands

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Command + + 100% + + + (1/1) + + + + 83.3% + + + (5/6) + + + + 87.5% + + + (7/8) + +
    AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (8/8) + +
    ByeCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (3/3) + +
    DeleteCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
    DeleteListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    HelpCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (2/2) + +
    IncorrectCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    ListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 72.7% + + + (8/11) + +
    PackAllCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    UnpackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..c51bd074ca --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,412 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.commands

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    UnpackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackAllCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    ListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 72.7% + + + (8/11) + +
    IncorrectCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    HelpCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (2/2) + +
    DeleteListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    DeleteCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
    ByeCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (3/3) + +
    AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (8/8) + +
    Command + + 100% + + + (1/1) + + + + 83.3% + + + (5/6) + + + + 87.5% + + + (7/8) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..9c756c9395 --- /dev/null +++ b/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,412 @@ + + + + + Coverage Report > bagpacker.commands + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.commands

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.commands + + 100% + + + (11/11) + + + + 96.7% + + + (29/30) + + + + 94.2% + + + (65/69) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    UnpackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    PackAllCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    ListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 72.7% + + + (8/11) + +
    IncorrectCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    HelpCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (2/2) + +
    DeleteListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    DeleteCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
    Command + + 100% + + + (1/1) + + + + 83.3% + + + (5/6) + + + + 87.5% + + + (7/8) + +
    ByeCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (3/3) + +
    AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (8/8) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-2/sources/source-1.html b/htmlReport/ns-2/sources/source-1.html new file mode 100644 index 0000000000..ded1f7dd10 --- /dev/null +++ b/htmlReport/ns-2/sources/source-1.html @@ -0,0 +1,135 @@ + + + + + + + Coverage Report > AddCommand + + + + + + +
    + + +

    Coverage Summary for Class: AddCommand (bagpacker.commands)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    AddCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (8/8) + +
    + +
    +
    + + +
    + package bagpacker.commands;
    + 
    + import bagpacker.iohandler.Ui;
    + import bagpacker.packingfunc.Item;
    + import bagpacker.packingfunc.PackingList;
    + 
    + public class AddCommand extends Command {
    +     public static final String MSG_SUCCESS_ADD = "New item added: %s";
    +     public static final String MSG_SUCCESS_ADD_EXISTING = "Add to quantity of existing item: %s";
    + 
    +     public static final String HELP_MSG = "add : Adds quantity and name of item to the packing list.\n" +
    +             "\tExample: add 3 /of toothbrush\n" +
    +             "\tMeaning: add quantity of 3 toothbrushes to the packing list";
    + 
    +     private final Item item;
    + 
    +     public AddCommand(Item item) {
    +         this.item = item;
    +     }
    + 
    +     @Override
    +     public void execute(PackingList packingList) {
    +         if(PackingList.itemFinder(item.getItemName())){
    +             PackingList.addToItemQuantity(item.getItemName(), item.getTotalQuantity());
    +             Ui.printToUser(String.format(MSG_SUCCESS_ADD_EXISTING, PackingList.getExistingItem(item.getItemName())));
    +             return;
    +         }
    +         this.packingList = packingList;
    +         packingList.addItem(item);
    +         Ui.printToUser(String.format(MSG_SUCCESS_ADD, item));
    +     }
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-2/sources/source-2.html b/htmlReport/ns-2/sources/source-2.html new file mode 100644 index 0000000000..31152099ee --- /dev/null +++ b/htmlReport/ns-2/sources/source-2.html @@ -0,0 +1,119 @@ + + + + + + + Coverage Report > ByeCommand + + + + + + +
    + + +

    Coverage Summary for Class: ByeCommand (bagpacker.commands)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    ByeCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (3/3) + +
    + +
    +
    + + +
    + package bagpacker.commands;
    + 
    + import bagpacker.packingfunc.PackingList;
    + 
    + /**
    +  * ByeCommand class stops the BagPacker application by changing the run status
    +  */
    + public class ByeCommand extends Command {
    +     public static boolean isBagPackerRunning = true;
    +     public static final String HELP_MSG = "bye : Stops the BagPacker Application\n" +
    +             "\tExample: bye";
    + 
    +     public void execute(PackingList packingList) {
    +         this.isBagPackerRunning = false;
    +     }
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-2/sources/source-3.html b/htmlReport/ns-2/sources/source-3.html new file mode 100644 index 0000000000..28a7f284d6 --- /dev/null +++ b/htmlReport/ns-2/sources/source-3.html @@ -0,0 +1,152 @@ + + + + + + + Coverage Report > Command + + + + + + +
    + + +

    Coverage Summary for Class: Command (bagpacker.commands)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    Command + + 100% + + + (1/1) + + + + 83.3% + + + (5/6) + + + + 87.5% + + + (7/8) + +
    + +
    +
    + + +
    + package bagpacker.commands;
    + 
    + import bagpacker.packingfunc.Item;
    + import bagpacker.packingfunc.PackingList;
    + 
    + /**
    +  * Commands class used to execute given commands from user
    +  */
    + public abstract class Command {
    +     protected PackingList packingList;
    +     private int targetIndex = -1;
    + 
    +     /**
    +      * @param targetIndex listing index of the target item
    +      */
    +     public Command(int targetIndex) {
    +         this.setTargetIndex(targetIndex);
    +     }
    + 
    +     protected Command() {
    +     }
    + 
    +     public void setTargetIndex(int targetIndex) {
    +         this.targetIndex = targetIndex;
    +     }
    + 
    +     public int getTargetIndex() {
    +         return targetIndex;
    +     }
    + 
    +     /**
    +      * Extracts the target item in the list.
    +      *
    +      * @throws IndexOutOfBoundsException if the target index is out of bounds
    +      */
    +     protected Item getTargetItem() throws IndexOutOfBoundsException {
    +         return packingList.get(getTargetIndex() - 1);
    +     }
    + 
    + 
    +     /**
    +      * Executes the command which requires a packingList
    +      *
    +      * @param packingList used to execute the command
    +      */
    +     public void execute(PackingList packingList) {
    +     }
    + 
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-2/sources/source-4.html b/htmlReport/ns-2/sources/source-4.html new file mode 100644 index 0000000000..30f325b460 --- /dev/null +++ b/htmlReport/ns-2/sources/source-4.html @@ -0,0 +1,131 @@ + + + + + + + Coverage Report > DeleteCommand + + + + + + +
    + + +

    Coverage Summary for Class: DeleteCommand (bagpacker.commands)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    DeleteCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (5/5) + +
    + +
    +
    + + +
    + package bagpacker.commands;
    + 
    + import bagpacker.packingfunc.Item;
    + import bagpacker.packingfunc.PackingList;
    + 
    + import bagpacker.iohandler.Ui;
    + 
    + public class DeleteCommand extends Command {
    + 
    +     public static final String MSG_SUCCESS_DELETE = "%s removed from the list";
    + 
    +     public static final String HELP_MSG = "delete : Deletes an item from the packing list.\n" +
    +             "\tExample: delete 1\n" +
    +             "\tMeaning: removes the first item in the packing list";
    + 
    + 
    +     public DeleteCommand(int targetIndex) {
    +         super(targetIndex);
    +     }
    + 
    +     @Override
    +     public void execute(PackingList packingList) {
    +         Item item = getTargetItem();
    +         this.packingList = packingList;
    +         packingList.deleteItem(item);
    +         Ui.printToUser(String.format(MSG_SUCCESS_DELETE, item));
    +     }
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-2/sources/source-5.html b/htmlReport/ns-2/sources/source-5.html new file mode 100644 index 0000000000..ef9cf2bacf --- /dev/null +++ b/htmlReport/ns-2/sources/source-5.html @@ -0,0 +1,126 @@ + + + + + + + Coverage Report > DeleteListCommand + + + + + + +
    + + +

    Coverage Summary for Class: DeleteListCommand (bagpacker.commands)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    DeleteListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    + +
    +
    + + +
    + package bagpacker.commands;
    + 
    + import bagpacker.iohandler.Ui;
    + import bagpacker.packingfunc.Item;
    + import bagpacker.packingfunc.PackingList;
    + 
    + import java.util.ArrayList;
    + 
    + public class DeleteListCommand extends Command {
    +     public static final String MSG_SUCCESS_DELETE_LIST = "Packing list deleted";
    + 
    +     public static final String HELP_MSG =
    +             "deletelist : Deletes all items in the packing list.\n" +
    +                     "\tExample: deletelist";
    + 
    +     @Override
    +     public void execute(PackingList packingList) {
    +         ArrayList<Item> emptyList = new ArrayList<>();
    +         PackingList.setItemList(emptyList);
    +         Ui.printToUser(String.format(MSG_SUCCESS_DELETE_LIST));
    +     }
    + 
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-2/sources/source-6.html b/htmlReport/ns-2/sources/source-6.html new file mode 100644 index 0000000000..aacf3e1986 --- /dev/null +++ b/htmlReport/ns-2/sources/source-6.html @@ -0,0 +1,114 @@ + + + + + + + Coverage Report > HelpCommand + + + + + + +
    + + +

    Coverage Summary for Class: HelpCommand (bagpacker.commands)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    HelpCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (2/2) + +
    + +
    +
    + + +
    + package bagpacker.commands;
    + 
    + import bagpacker.iohandler.Ui;
    + import bagpacker.packingfunc.PackingList;
    + 
    + public class HelpCommand extends Command {
    +     @Override
    +     public void execute(PackingList packingList) {
    +         Ui.helpMessage();
    +     }
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-2/sources/source-7.html b/htmlReport/ns-2/sources/source-7.html new file mode 100644 index 0000000000..9da708b346 --- /dev/null +++ b/htmlReport/ns-2/sources/source-7.html @@ -0,0 +1,122 @@ + + + + + + + Coverage Report > IncorrectCommand + + + + + + +
    + + +

    Coverage Summary for Class: IncorrectCommand (bagpacker.commands)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    IncorrectCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 100% + + + (4/4) + +
    + +
    +
    + + +
    + package bagpacker.commands;
    + 
    + import bagpacker.iohandler.Ui;
    + import bagpacker.packingfunc.PackingList;
    + 
    + public class IncorrectCommand extends Command {
    +     private final String errorType;
    +     private final String helpMessage;
    + 
    +     public IncorrectCommand(String errorType, String helpMessage) {
    +         this.helpMessage = helpMessage;
    +         this.errorType = errorType;
    +     }
    + 
    +     @Override
    +     public void execute(PackingList packingList) {
    +         Ui.errorMessage(errorType, helpMessage);
    +     }
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-2/sources/source-8.html b/htmlReport/ns-2/sources/source-8.html new file mode 100644 index 0000000000..b36a9e5f18 --- /dev/null +++ b/htmlReport/ns-2/sources/source-8.html @@ -0,0 +1,138 @@ + + + + + + + Coverage Report > ListCommand + + + + + + +
    + + +

    Coverage Summary for Class: ListCommand (bagpacker.commands)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    ListCommand + + 100% + + + (1/1) + + + + 100% + + + (2/2) + + + + 72.7% + + + (8/11) + +
    + +
    +
    + + +
    + package bagpacker.commands;
    + 
    + import bagpacker.packingfunc.PackingList;
    + 
    + public class ListCommand extends Command {
    +     public static final String HELP_MSG = "list : List all items and their total quantities packed in packing list.\n" +
    +             "\tExample: list";
    + 
    +     @Override
    +     public void execute(PackingList packingList) {
    + 
    +         if (packingList.size() == 0) {
    +             System.out.println("____________________________________________________________");
    +             System.out.println("There are no items in your list. What would you like to add?");
    +             System.out.println("____________________________________________________________");
    +             return;
    +         }
    + 
    +         System.out.println("____________________________________________________________");
    +         System.out.println("Here are the items in your list");
    +         for (int i = 0; i < packingList.size(); i++) {
    +             //            String isItemPacked;
    +             //            if (packingList.get(i).getIsPacked()) {
    +             //                isItemPacked = "X";
    +             //            } else {
    +             //                isItemPacked = " ";
    +             //            }
    +             //            String itemName = packingList.get(i).getItemName();
    +             //            System.out.println((i + 1) + ". [" + isItemPacked + "] " + itemName);
    +             System.out.print((i + 1) + ". ");
    +             System.out.println(PackingList.get(i));
    +         }
    +         System.out.println("____________________________________________________________");
    +     }
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-2/sources/source-9.html b/htmlReport/ns-2/sources/source-9.html new file mode 100644 index 0000000000..239a22f567 --- /dev/null +++ b/htmlReport/ns-2/sources/source-9.html @@ -0,0 +1,137 @@ + + + + + + + Coverage Report > PackAllCommand + + + + + + +
    + + +

    Coverage Summary for Class: PackAllCommand (bagpacker.commands)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    PackAllCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    + +
    +
    + + +
    + package bagpacker.commands;
    + 
    + import bagpacker.iohandler.Ui;
    + import bagpacker.packingfunc.Item;
    + import bagpacker.packingfunc.PackingList;
    + 
    + public class PackAllCommand extends Command {
    + 
    +     public static final String MSG_SUCCESS_PACK = "Item packed: %s";
    + 
    +     public static final String HELP_MSG = "packall : Marks all quantity of the specified item as packed in the " +
    +             "packing list.\n" +
    +             "\tExample: packall /of 3\n" +
    +             "\tMeaning: packs all of the quantities of the third item in the packing list";
    + 
    +     private static int packQuantity;
    + 
    +     public PackAllCommand(int targetIndex) {
    +         super(targetIndex);
    + 
    +         assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) :
    +                 "PackAll Command Target index is out of bounds";
    +     }
    + 
    +     @Override
    +     public void execute(PackingList packingList) {
    +         this.packingList = packingList;
    +         final Item item = getTargetItem();
    +         packQuantity = item.getUnpackedQuantity();
    +         packingList.packItem(item, packQuantity);
    +         Ui.printToUser(String.format(MSG_SUCCESS_PACK, item));
    +     }
    + 
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-2/sources/source-a.html b/htmlReport/ns-2/sources/source-a.html new file mode 100644 index 0000000000..f5536813a0 --- /dev/null +++ b/htmlReport/ns-2/sources/source-a.html @@ -0,0 +1,134 @@ + + + + + + + Coverage Report > PackCommand + + + + + + +
    + + +

    Coverage Summary for Class: PackCommand (bagpacker.commands)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    PackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    + +
    +
    + + +
    + package bagpacker.commands;
    + 
    + import bagpacker.iohandler.Ui;
    + import bagpacker.packingfunc.Item;
    + import bagpacker.packingfunc.PackingList;
    + 
    + public class PackCommand extends Command {
    + 
    +     public static final String MSG_SUCCESS_PACK = "Item packed: %s";
    +     public static final String HELP_MSG = "pack : Adds to the current quantity of items packed in the packing list.\n" +
    +             "\tExample: pack 2 /of 3\n" +
    +             "\tMeaning: packs 2 more quantities of the third item in the packing list";
    + 
    +     private static int packQuantity;
    + 
    +     public PackCommand(int quantity, int targetIndex) {
    +         super(targetIndex);
    +         packQuantity = quantity;
    +         assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) :
    +                 "Pack Command Target index is out of bounds";
    +     }
    + 
    +     @Override
    +     public void execute(PackingList packingList) {
    +         this.packingList = packingList;
    +         final Item item = getTargetItem();
    +         packingList.packItem(item, packQuantity);
    +         Ui.printToUser(String.format(MSG_SUCCESS_PACK, item));
    +     }
    + 
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-2/sources/source-b.html b/htmlReport/ns-2/sources/source-b.html new file mode 100644 index 0000000000..fdef7a1b84 --- /dev/null +++ b/htmlReport/ns-2/sources/source-b.html @@ -0,0 +1,135 @@ + + + + + + + Coverage Report > UnpackCommand + + + + + + +
    + + +

    Coverage Summary for Class: UnpackCommand (bagpacker.commands)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    UnpackCommand + + 100% + + + (1/1) + + + + 100% + + + (3/3) + + + + 100% + + + (8/8) + +
    + +
    +
    + + +
    + package bagpacker.commands;
    + 
    + import bagpacker.iohandler.Ui;
    + import bagpacker.packingfunc.Item;
    + import bagpacker.packingfunc.PackingList;
    + 
    + public class UnpackCommand extends Command {
    + 
    +     public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s";
    + 
    +     public static final String HELP_MSG = "unpack : Deducts from the current quantity of items packed in the packing " +
    +             "list.\n" +
    +             "\tExample: unpack 1 /of 2\n" +
    +             "\tMeaning: unpacks 1 quantity of the second item in the packing list";
    +     private static int unpackQuantity;
    + 
    +     public UnpackCommand(int quantity, int targetIndex) {
    +         super(targetIndex);
    +         unpackQuantity = quantity;
    +         assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) :
    +                 "Unpack Command Target index is out of bounds";
    +     }
    + 
    +     @Override
    +     public void execute(PackingList packingList) {
    +         this.packingList = packingList;
    +         final Item item = getTargetItem();
    +         packingList.unpackItem(item, unpackQuantity);
    +         Ui.printToUser(String.format(MSG_SUCCESS_UNPACK, item));
    +     }
    + 
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-3/index.html b/htmlReport/ns-3/index.html new file mode 100644 index 0000000000..732440749d --- /dev/null +++ b/htmlReport/ns-3/index.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.exception

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    EmptyInputException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_BLOCK.html b/htmlReport/ns-3/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..aa7ae187a2 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_BLOCK.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.exception

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    EmptyInputException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..578199d1a4 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.exception

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    EmptyInputException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_CLASS.html b/htmlReport/ns-3/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..cdcb70427d --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_CLASS.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.exception

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    EmptyInputException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..21951f7557 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.exception

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    EmptyInputException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_LINE.html b/htmlReport/ns-3/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..69daea784a --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_LINE.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.exception

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    EmptyInputException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..1cfe6e6704 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.exception

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    EmptyInputException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_METHOD.html b/htmlReport/ns-3/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..8ef006e257 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_METHOD.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.exception

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    EmptyInputException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..7d2e0e71b7 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.exception

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    EmptyInputException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..856f16fff2 --- /dev/null +++ b/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.exception + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.exception

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.exception + + 0% + + + (0/3) + + + + 0% + + + (0/3) + + + + 0% + + + (0/3) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    EmptyInputException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-3/sources/source-1.html b/htmlReport/ns-3/sources/source-1.html new file mode 100644 index 0000000000..95176c5017 --- /dev/null +++ b/htmlReport/ns-3/sources/source-1.html @@ -0,0 +1,107 @@ + + + + + + + Coverage Report > EmptyInputException + + + + + + +
    + + +

    Coverage Summary for Class: EmptyInputException (bagpacker.exception)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    EmptyInputException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    + +
    +
    + + +
    + package bagpacker.exception;
    + 
    + public class EmptyInputException extends Exception {
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-3/sources/source-2.html b/htmlReport/ns-3/sources/source-2.html new file mode 100644 index 0000000000..d128f323c6 --- /dev/null +++ b/htmlReport/ns-3/sources/source-2.html @@ -0,0 +1,108 @@ + + + + + + + Coverage Report > InvalidIndexException + + + + + + +
    + + +

    Coverage Summary for Class: InvalidIndexException (bagpacker.exception)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    InvalidIndexException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    + +
    +
    + + +
    + package bagpacker.exception;
    + 
    + 
    + public class InvalidIndexException extends Exception {
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-3/sources/source-3.html b/htmlReport/ns-3/sources/source-3.html new file mode 100644 index 0000000000..3fc863cc44 --- /dev/null +++ b/htmlReport/ns-3/sources/source-3.html @@ -0,0 +1,108 @@ + + + + + + + Coverage Report > InvalidVariablesException + + + + + + +
    + + +

    Coverage Summary for Class: InvalidVariablesException (bagpacker.exception)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    InvalidVariablesException + + 0% + + + (0/1) + + + + 0% + + + (0/1) + + + + 0% + + + (0/1) + +
    + +
    +
    + + +
    + package bagpacker.exception;
    + 
    + 
    + public class InvalidVariablesException extends Exception {
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-4/index.html b/htmlReport/ns-4/index.html new file mode 100644 index 0000000000..e84547a900 --- /dev/null +++ b/htmlReport/ns-4/index.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.iohandler

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Parser + + 0% + + + (0/1) + + + + 0% + + + (0/25) + + + + 0% + + + (0/165) + +
    Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/20) + +
    Ui + + 100% + + + (1/1) + + + + 54.5% + + + (6/11) + + + + 68.8% + + + (22/32) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_BLOCK.html b/htmlReport/ns-4/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..83e4dfc6ca --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_BLOCK.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.iohandler

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Parser + + 0% + + + (0/1) + + + + 0% + + + (0/25) + + + + 0% + + + (0/165) + +
    Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/20) + +
    Ui + + 100% + + + (1/1) + + + + 54.5% + + + (6/11) + + + + 68.8% + + + (22/32) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..26405e2e00 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.iohandler

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Ui + + 100% + + + (1/1) + + + + 54.5% + + + (6/11) + + + + 68.8% + + + (22/32) + +
    Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/20) + +
    Parser + + 0% + + + (0/1) + + + + 0% + + + (0/25) + + + + 0% + + + (0/165) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_CLASS.html b/htmlReport/ns-4/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..e919e74aa9 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_CLASS.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.iohandler

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Parser + + 0% + + + (0/1) + + + + 0% + + + (0/25) + + + + 0% + + + (0/165) + +
    Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/20) + +
    Ui + + 100% + + + (1/1) + + + + 54.5% + + + (6/11) + + + + 68.8% + + + (22/32) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..9b147bd5f7 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.iohandler

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Ui + + 100% + + + (1/1) + + + + 54.5% + + + (6/11) + + + + 68.8% + + + (22/32) + +
    Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/20) + +
    Parser + + 0% + + + (0/1) + + + + 0% + + + (0/25) + + + + 0% + + + (0/165) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_LINE.html b/htmlReport/ns-4/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..1a258d565b --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_LINE.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.iohandler

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Parser + + 0% + + + (0/1) + + + + 0% + + + (0/25) + + + + 0% + + + (0/165) + +
    Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/20) + +
    Ui + + 100% + + + (1/1) + + + + 54.5% + + + (6/11) + + + + 68.8% + + + (22/32) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..0fb214e0bc --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.iohandler

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Ui + + 100% + + + (1/1) + + + + 54.5% + + + (6/11) + + + + 68.8% + + + (22/32) + +
    Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/20) + +
    Parser + + 0% + + + (0/1) + + + + 0% + + + (0/25) + + + + 0% + + + (0/165) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_METHOD.html b/htmlReport/ns-4/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..ed0737e2b4 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_METHOD.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.iohandler

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Parser + + 0% + + + (0/1) + + + + 0% + + + (0/25) + + + + 0% + + + (0/165) + +
    Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/20) + +
    Ui + + 100% + + + (1/1) + + + + 54.5% + + + (6/11) + + + + 68.8% + + + (22/32) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..6754eda50a --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.iohandler

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Ui + + 100% + + + (1/1) + + + + 54.5% + + + (6/11) + + + + 68.8% + + + (22/32) + +
    Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/20) + +
    Parser + + 0% + + + (0/1) + + + + 0% + + + (0/25) + + + + 0% + + + (0/165) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..6a66508296 --- /dev/null +++ b/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,196 @@ + + + + + Coverage Report > bagpacker.iohandler + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.iohandler

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.iohandler + + 33.3% + + + (1/3) + + + + 14.6% + + + (6/41) + + + + 10.1% + + + (22/217) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Ui + + 100% + + + (1/1) + + + + 54.5% + + + (6/11) + + + + 68.8% + + + (22/32) + +
    Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/20) + +
    Parser + + 0% + + + (0/1) + + + + 0% + + + (0/25) + + + + 0% + + + (0/165) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-4/sources/source-1.html b/htmlReport/ns-4/sources/source-1.html new file mode 100644 index 0000000000..f7a83f182d --- /dev/null +++ b/htmlReport/ns-4/sources/source-1.html @@ -0,0 +1,537 @@ + + + + + + + Coverage Report > Parser + + + + + + +
    + + +

    Coverage Summary for Class: Parser (bagpacker.iohandler)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    Parser + + 0% + + + (0/1) + + + + 0% + + + (0/25) + + + + 0% + + + (0/165) + +
    + +
    +
    + + +
    + package bagpacker.iohandler;
    + 
    + 
    + import bagpacker.commands.AddCommand;
    + import bagpacker.commands.ByeCommand;
    + import bagpacker.commands.Command;
    + import bagpacker.commands.DeleteCommand;
    + import bagpacker.commands.DeleteListCommand;
    + import bagpacker.commands.HelpCommand;
    + import bagpacker.commands.IncorrectCommand;
    + import bagpacker.commands.ListCommand;
    + import bagpacker.commands.PackCommand;
    + import bagpacker.commands.UnpackCommand;
    + import bagpacker.commands.PackAllCommand;
    + import bagpacker.exception.EmptyInputException;
    + import bagpacker.exception.InvalidIndexException;
    + import bagpacker.exception.InvalidVariablesException;
    + import bagpacker.packingfunc.Item;
    + import bagpacker.packingfunc.PackingList;
    + 
    + import java.util.ArrayList;
    + import java.util.Arrays;
    + import java.util.Scanner;
    + 
    + /**
    +  * Parser class contains methods to manipulate user input
    +  */
    + public class Parser {
    +     private static ArrayList<String> inputStringArray;
    +     private static String fullInput;
    + 
    +     public static void setFullInput(String fullInput) {
    +         Parser.fullInput = fullInput;
    +     }
    + 
    +     /**
    +      * Returns the user input as in array format
    +      */
    +     public static ArrayList<String> getInputStringArray() {
    +         return inputStringArray;
    +     }
    + 
    +     public static void setInputStringArray(String[] inputStringArray) {
    +         Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray));
    +     }
    + 
    +     /**
    +      * Returns the user input in String format
    +      */
    +     public static String getFullInput() {
    +         return fullInput;
    +     }
    + 
    +     public static Command parse() {
    +         String inputLine = "";
    +         while (inputLine.isEmpty()) {
    +             try {
    +                 inputLine = readLine();
    +             } catch (EmptyInputException e) {
    +                 Ui.errorMessage("Empty input received",
    +                         "try to input a command, to view all commands input 'help'");
    +             }
    +         }
    +         setFullInput(inputLine);
    +         String[] inputStringList = inputLine.trim().split("\\s+");
    +         setInputStringArray(inputStringList);
    +         switch (getCommand()) {
    +         case "add":
    +             return createAddObj();
    +         case "delete":
    +             return createDeleteObj();
    +         case "pack":
    +             return createPackObj();
    +         case "unpack":
    +             return createUnpackObj();
    +         case "list":
    +             return listCommand();
    +         case "help":
    +             return createHelpObj();
    +         case "deletelist":
    +             return createDeletelistObj();
    +         case "packall":
    +             return createPackAllObj();
    +         case "bye":
    +             return createByeObj();
    +         default:
    +             return new IncorrectCommand("'" + Parser.getCommand() + "' is an invalid User Command",
    +                     "input 'help' to receive all valid commands");
    +         }
    +     }
    + 
    +     /**
    +      * Reads and returns the full user input from the command line interface
    +      * - trims the leading and trailing white spaces
    +      *
    +      * @return inputLine the String input of the user
    +      * @throws EmptyInputException when user input empty line
    +      */
    +     public static String readLine() throws EmptyInputException {
    +         String inputLine;
    +         Scanner in = new Scanner(System.in);
    +         inputLine = in.nextLine().trim();
    +         if (inputLine.isEmpty()) {
    +             throw new EmptyInputException();
    +         }
    +         return inputLine;
    +     }
    + 
    +     /**
    +      * Returns the user command in lower case
    +      *
    +      * @return command from user
    +      */
    +     public static String getCommand() {
    +         return getInputStringArray().get(0).toLowerCase();
    +     }
    + 
    +     /**
    +      * Returns a string which represents the name of the item from the user input
    +      *
    +      * @return inputVariables which is the name of the item
    +      * @throws InvalidVariablesException when the item name cannot be found
    +      */
    +     public static String getItemName() throws InvalidVariablesException {
    +         String itemName;
    +         if (inputStringArray.size() <= 1) {
    +             throw new InvalidVariablesException();
    +         }
    +         try {
    +             int itemIndStart = fullInput.indexOf(" ") + 1;
    +             itemName = fullInput.substring(itemIndStart).trim();
    +         } catch (IndexOutOfBoundsException e) {
    +             throw new InvalidVariablesException();
    +         }
    +         return itemName;
    +     }
    + 
    +     /**
    +      * Returns a string which represents the index of the item from the user input
    +      *
    +      * @return inputIndex which is the item index of the item in packing list
    +      * @throws InvalidIndexException when the item index is not valid
    +      */
    +     public static String getItemIndex() throws InvalidIndexException {
    +         String inputIndex;
    +         int itemIndex;
    +         if (inputStringArray.size() != 2) {
    +             throw new InvalidIndexException();
    +         }
    +         try {
    +             inputIndex = inputStringArray.get(1);
    +             itemIndex = Integer.parseInt(inputIndex);
    +             if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) {
    +                 throw new InvalidIndexException();
    +             }
    +         } catch (IndexOutOfBoundsException | NumberFormatException e) {
    +             throw new InvalidIndexException();
    +         }
    +         return inputIndex;
    +     }
    + 
    +     /**
    +      * Returns a string which represents the relevant variable depending on the command
    +      * - "add" will return the item name
    +      * - "delete", "pack", "unpack" will return item index
    +      *
    +      * @param command used to determine the type of variable to return
    +      * @return itemVariable which is the index OR name of the item in packing list
    +      * @throws InvalidIndexException when the item index is not valid
    +      */
    +     public static String getVariable(String command) throws InvalidVariablesException, InvalidIndexException {
    +         String itemVariable;
    +         try {
    +             if (command.equals("add")) {
    +                 itemVariable = getItemName();
    +             } else {
    +                 itemVariable = getItemIndex();
    +             }
    +         } catch (InvalidVariablesException e) {
    +             throw new InvalidVariablesException();
    +         } catch (InvalidIndexException e) {
    +             throw new InvalidIndexException();
    +         }
    +         return itemVariable;
    +     }
    + 
    + 
    +     /**
    +      * Returns the user item description
    +      */
    +     public static String getItemDescrip() {
    +         //String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length);
    +         int indexItemName = getFullInput().indexOf("i/") + 2;
    +         return getFullInput().substring(indexItemName).trim();
    +     }
    + 
    + 
    +     /**
    +      * Attempts to create AddCommand object to be executed where it is called from
    +      *
    +      * @return AddCommand the command to be executed to add an item to the packing list, else
    +      *              an IncorrectCommand is created to be executed
    +      */
    +     public static Command createAddObj() {
    +         try {
    +             String[] quantityAndName = getAddVariables();
    +             int itemQuantity = Integer.parseInt(quantityAndName[0]);
    +             String itemName = quantityAndName[1];
    +             if (itemName == null) {
    +                 throw new InvalidVariablesException();
    +             }
    +             if (itemQuantity < 1) {
    +                 throw new InvalidIndexException();
    +             }
    +             return new AddCommand(new Item(itemQuantity, itemName));
    +         } catch (InvalidVariablesException | ArrayIndexOutOfBoundsException e) {
    +             return new IncorrectCommand("Invalid input format",
    +                     AddCommand.HELP_MSG);
    +         } catch (NumberFormatException | InvalidIndexException e) {
    +             return new IncorrectCommand("Invalid Item Quantity",
    +                     "For item quantity, try to input a positive integer number between 1 and 1000000");
    +         }
    +     }
    + 
    +     public static String[] getAddVariables() throws InvalidVariablesException {
    +         String[] inputStringList = fullInput.trim().split(" ", 2);
    +         String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+");
    +         if (inputVariables.length != 2) {
    +             throw new InvalidVariablesException();
    +         }
    +         return inputVariables;
    +     }
    + 
    +     /**
    +      * Attempts to create DeleteCommand object to be executed where it is called from
    +      *
    +      * @return DeleteCommand the command to be executed to delete an item to the packing list, else
    +      *              an IncorrectCommand is created to be executed
    +      */
    +     public static Command createDeleteObj() {
    +         try {
    +             String itemIndex = getVariable("delete");
    +             return new DeleteCommand(Integer.parseInt(itemIndex));
    +         } catch (InvalidVariablesException e) {
    +             return new IncorrectCommand("Invalid Item Name",
    +                     "Try to input a name (word(s)) to be added into the list");
    +         } catch (InvalidIndexException e) {
    +             if (PackingList.getItemList().size() == 0) {
    +                 return new IncorrectCommand("Invalid Item Index",
    +                         "Your packing list is empty, there is nothing to delete");
    +             } else {
    +                 return new IncorrectCommand("Invalid Item Index",
    +                         "Try to input a positive integer number that is at most " +
    +                                 PackingList.getItemList().size());
    +             }
    +         }
    +     }
    + 
    +     public static int[] getQuantityAndIndex() throws InvalidVariablesException, InvalidIndexException {
    +         int[] itemQuantityAndIndex = new int[2];
    +         try {
    +             itemQuantityAndIndex[0] = Integer.parseInt(inputStringArray.get(1).trim());
    +             itemQuantityAndIndex[1] = Integer.parseInt(inputStringArray.get(3).trim());
    +         } catch (IndexOutOfBoundsException e) {
    +             throw new InvalidVariablesException();
    +         } catch (NumberFormatException e) {
    +             throw new InvalidIndexException();
    +         }
    +         return itemQuantityAndIndex;
    +     }
    + 
    +     /**
    +      * Attempts to create PackCommand object to be executed where it is called from
    +      *
    +      * @return PackCommand the command to be executed to Pack an item in the packing list, else
    +      *              an IncorrectCommand is created to be executed
    +      */
    +     public static Command createPackObj() {
    +         int quantityNotPacked = 0;
    +         try {
    +             String[] quantityAndIndex = getPackVariables();
    +             int itemQuantity = Integer.parseInt(quantityAndIndex[0]);
    +             int itemIndex = Integer.parseInt(quantityAndIndex[1]);
    +             quantityNotPacked = PackingList.get(itemIndex - 1).getUnpackedQuantity();
    +             if (itemQuantity < 1 | itemQuantity > quantityNotPacked) {
    +                 throw new InvalidVariablesException();
    +             }
    +             return new PackCommand(itemQuantity, itemIndex);
    +         } catch (NumberFormatException | InvalidIndexException e) {
    +             if (PackingList.getItemList().size() == 0) {
    +                 return new IncorrectCommand("Invalid Item Index",
    +                         "Your packing list is empty, there is nothing to pack");
    +             } else {
    +                 return new IncorrectCommand("Invalid Item Index",
    +                         "Try to input a positive integer number that is at most " +
    +                                 PackingList.getItemList().size());
    +             }
    +         } catch (ArrayIndexOutOfBoundsException e) {
    +             return new IncorrectCommand("Invalid Input Variables",
    +                     PackCommand.HELP_MSG);
    +         } catch (InvalidVariablesException e) {
    +             if (quantityNotPacked == 0) {
    +                 return new IncorrectCommand("Invalid Pack Usage",
    +                         "This item is fully packed");
    +             }
    +             return new IncorrectCommand("Invalid Input Quantity",
    +                     "Try to input a positive quantity that is at most "
    +                             + quantityNotPacked + " to be packed");
    +         }
    +     }
    + 
    +     /**
    +      * Attempts to create PackCommand object to be executed where it is called from
    +      *
    +      * @return PackCommand the command to be executed to Pack an item in the packing list, else
    +      *              an IncorrectCommand is created to be executed
    +      */
    + 
    +     public static String[] getPackVariables() throws InvalidIndexException {
    +         String[] inputStringList = fullInput.trim().split(" ", 2);
    +         String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+");
    +         if (Integer.parseInt(inputVariables[1]) < 1 | Integer.parseInt(inputVariables[1])
    +                 > PackingList.getItemList().size()) {
    +             throw new InvalidIndexException();
    +         }
    +         return inputVariables;
    +     }
    + 
    +     public static int getPackAllIndex() throws InvalidIndexException {
    +         String[] inputStringList = fullInput.trim().split("/", 2);
    +         inputStringList = inputStringList[1].split(" ", 2);
    +         int itemIndex = Integer.parseInt(inputStringList[1]);
    + 
    +         if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) {
    +             throw new InvalidIndexException();
    +         }
    + 
    +         return itemIndex;
    +     }
    + 
    +     public static Command createPackAllObj() {
    +         int quantityNotPacked = 0;
    + 
    +         try {
    +             int itemIndex = getPackAllIndex();
    + 
    +             quantityNotPacked = PackingList.get(itemIndex - 1).getUnpackedQuantity();
    + 
    +             return new PackAllCommand(itemIndex);
    +         } catch (NumberFormatException | InvalidIndexException e) {
    +             if (PackingList.getItemList().size() == 0) {
    +                 return new IncorrectCommand("Invalid Item Index",
    +                         "Your packing list is empty, there is nothing to pack");
    +             } else {
    +                 return new IncorrectCommand("Invalid Item Index",
    +                         "Try to input a positive integer number that is at most " +
    +                                 PackingList.getItemList().size());
    +             }
    +         } catch (ArrayIndexOutOfBoundsException e) {
    +             return new IncorrectCommand("Invalid Input Variables",
    +                     PackCommand.HELP_MSG);
    +         }
    +     }
    + 
    + 
    +     /**
    +      * Attempts to create UnpackCommand object to be executed where it is called from
    +      *
    +      * @return UnpackCommand the command to be executed to unpack an item in the packing list, else
    +      *              an IncorrectCommand is created to be executed
    +      */
    +     public static Command createUnpackObj() {
    +         int quantityPacked = 0;
    +         try {
    +             String[] quantityAndIndex = getPackVariables();
    +             int itemQuantity = Integer.parseInt(quantityAndIndex[0]);
    +             if (itemQuantity <= 0) {
    +                 return new IncorrectCommand("Invalid Item Quantity", "Your item quantity should " +
    +                         "be greater than 0");
    +             }
    + 
    +             int itemIndex = Integer.parseInt(quantityAndIndex[1]);
    + 
    +             if (itemIndex > PackingList.getItemList().size()) {
    +                 return new IncorrectCommand("Invalid Item Index",
    +                         "Try to input a positive integer number that does not exceed " +
    +                                 PackingList.getItemList().size());
    +             }
    + 
    + 
    +             quantityPacked = PackingList.get(itemIndex - 1).getPackedQuantity();
    +             if (itemQuantity < 1 | itemQuantity > quantityPacked) {
    +                 throw new InvalidVariablesException();
    +             }
    + 
    +             return new UnpackCommand(itemQuantity, itemIndex);
    +         } catch (NumberFormatException | InvalidIndexException e) {
    +             if (PackingList.getItemList().size() == 0) {
    +                 return new IncorrectCommand("Invalid Item Index",
    +                         "Your packing list is empty, there is nothing to unpack");
    +             } else {
    +                 return new IncorrectCommand("Invalid Item Index",
    +                         "Try to input a positive item index number that is at most " +
    +                                 PackingList.getItemList().size());
    +             }
    +         } catch (ArrayIndexOutOfBoundsException e) {
    +             return new IncorrectCommand("Invalid Input Variables",
    +                     UnpackCommand.HELP_MSG);
    +         } catch (InvalidVariablesException e) {
    +             if (quantityPacked == 0) {
    +                 return new IncorrectCommand("Invalid Unpack Usage",
    +                         "This item is not even packed yet");
    +             }
    +             return new IncorrectCommand("Invalid Input Quantity",
    +                     "Try to input a positive quantity that does not exceed " + quantityPacked);
    +         }
    +     }
    + 
    +     public static Command listCommand() {
    +         return new ListCommand();
    +     }
    + 
    +     public static Command createDeletelistObj() {
    +         return new DeleteListCommand();
    +     }
    + 
    +     private static Command createHelpObj() {
    +         return new HelpCommand();
    +     }
    + 
    +     private static Command createByeObj() {
    +         return new ByeCommand();
    +     }
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-4/sources/source-2.html b/htmlReport/ns-4/sources/source-2.html new file mode 100644 index 0000000000..ba02e887a5 --- /dev/null +++ b/htmlReport/ns-4/sources/source-2.html @@ -0,0 +1,175 @@ + + + + + + + Coverage Report > Storage + + + + + + +
    + + +

    Coverage Summary for Class: Storage (bagpacker.iohandler)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    Storage + + 0% + + + (0/1) + + + + 0% + + + (0/5) + + + + 0% + + + (0/20) + +
    + +
    +
    + + +
    + package bagpacker.iohandler;
    + 
    + import bagpacker.packingfunc.Item;
    + import bagpacker.packingfunc.PackingList;
    + 
    + import java.io.File;
    + import java.io.FileNotFoundException;
    + import java.io.FileWriter;
    + import java.io.IOException;
    + import java.util.Scanner;
    + 
    + /**
    +  * Storage class contains methods to save and retrieve saved packing list in txt file
    +  */
    + public class Storage {
    + 
    +     private static final String FILE_PATH = "packing_list.txt";
    + 
    +     /**
    +      * Loads packingList with items saved in save file
    +      * @throws FileNotFoundException when no save file in directory FILE_PATH is found
    +      */
    +     public static void load() throws FileNotFoundException {
    +         Scanner reader = new Scanner(new File(FILE_PATH));
    +         String line;
    +         while (reader.hasNext()) {
    +             line = reader.nextLine();
    +             PackingList.getItemList().add(readItem(line));
    +         }
    +     }
    + 
    +     /**
    +      * Returns an item with details saved in save file
    +      * @param line line from save file
    +      * @return item containing relevant packedQuantity, totalQuantity and item description
    +      */
    +     private static Item readItem(String line) {
    +         int openBracketIndex = line.indexOf('[');
    +         int forwardSlashIndex = line.indexOf('/');
    +         int closeBracketIndex = line.indexOf(']');
    + 
    +         // packedQuantity of an item is integer form of number after '[' and before '/'
    +         int packedQuantity = Integer.parseInt(line.substring(openBracketIndex + 1, forwardSlashIndex));
    + 
    +         // totalQuantity of an item is integer form of number after '/' and before ']'
    +         int totalQuantity = Integer.parseInt(line.substring(forwardSlashIndex + 1, closeBracketIndex));
    + 
    +         // itemDesc will be after '] '
    +         String itemDesc = line.substring(line.indexOf(']') + 2);
    +         return new Item(totalQuantity, packedQuantity, itemDesc);
    +     }
    + 
    +     /**
    +      * saves current list of items onto file directory FILE_PATH
    +      * @param packingList list of items used by user
    +      */
    +     public static void save(PackingList packingList) {
    +         try {
    +             writeToFile(packingList);
    +         } catch (IOException e) {
    +             System.out.println("Something went wrong: " + e.getMessage());
    +         }
    +     }
    + 
    +     public static void writeToFile(PackingList packingList) throws IOException {
    +         FileWriter fw = new FileWriter(FILE_PATH);
    +         for (int i = 0; i < packingList.size(); i++) {
    +             fw.write(PackingList.get(i).toString() + "\n");
    +         }
    +         fw.close();
    +     }
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-4/sources/source-3.html b/htmlReport/ns-4/sources/source-3.html new file mode 100644 index 0000000000..0bc0fbc18e --- /dev/null +++ b/htmlReport/ns-4/sources/source-3.html @@ -0,0 +1,208 @@ + + + + + + + Coverage Report > Ui + + + + + + +
    + + +

    Coverage Summary for Class: Ui (bagpacker.iohandler)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    Ui + + 100% + + + (1/1) + + + + 54.5% + + + (6/11) + + + + 68.8% + + + (22/32) + +
    + +
    +
    + + +
    + package bagpacker.iohandler;
    + 
    + 
    + import bagpacker.commands.AddCommand;
    + import bagpacker.commands.ByeCommand;
    + import bagpacker.commands.DeleteCommand;
    + import bagpacker.commands.DeleteListCommand;
    + import bagpacker.commands.ListCommand;
    + import bagpacker.commands.PackAllCommand;
    + import bagpacker.commands.PackCommand;
    + import bagpacker.commands.UnpackCommand;
    + 
    + /**
    +  * Ui class contains methods to print messages to user interface on Command Line Interface
    +  */
    + public class Ui {
    +     public static String logo = " ____              _____           _\n"
    +             + "|  _ \\            |  __ \\         | |\n"
    +             + "| |_) | __ _  __ _| |__) |_ _  ___| | _____ _ __\n"
    +             + "|  _ < / _` |/ _` |  ___/ _` |/ __| |/ / _ \\ '__|\n"
    +             + "| |_) | (_| | (_| | |  | (_| | (__|   <  __/ |\n"
    +             + "|____/ \\__,_|\\__, |_|   \\__,_|\\___|_|\\_\\___|_|\n"
    +             + "              __/ |\n"
    +             + "             |___/\n";
    +     private static final String RETURN_USER_GREET = "Welcome back, User!";
    +     private static final String NEW_USER_GREET = "No save files detected. Hello new user!";
    + 
    +     public static void printErrorLine() {
    +         System.out.println("/////////////////////////////////////////////////////////////");
    +     }
    + 
    +     public static void printLine() {
    +         System.out.println("____________________________________________________________");
    +     }
    + 
    +     /**
    +      * Prints initialising Message
    +      */
    +     public static void initialMessage() {
    +         printLine();
    +         System.out.println("Hi this is,\n" + logo);
    +         System.out.println("Enter \"help\" to find out how to use BagPacker");
    +         printLine();
    +     }
    + 
    +     /**
    +      * Prints goodbye Message
    +      */
    +     public static void goodbyeMessage() {
    +         printLine();
    +         System.out.println("Bye thanks for using,\n" + logo);
    +         printLine();
    +     }
    + 
    +     /**
    +      * Prints Error Message with the type of error and a helping message
    +      *
    +      * @param errorType   the type of error (e.g. invalid integer input)
    +      * @param helpMessage a message to help the user (e.g. try to input a whole number digit)
    +      */
    +     public static void errorMessage(String errorType, String helpMessage) {
    +         printErrorLine();
    +         System.out.print("Error " + errorType);
    +         System.out.println(":\n" + helpMessage);
    +         printErrorLine();
    +     }
    + 
    +     /**
    +      * Prints help message
    +      */
    +     public static void helpMessage() {
    +         printLine();
    +         System.out.println("All Commands:");
    +         System.out.println("1. " + AddCommand.HELP_MSG);
    +         System.out.println("2. " + DeleteCommand.HELP_MSG);
    +         System.out.println("3. " + ListCommand.HELP_MSG);
    +         System.out.println("4. " + PackCommand.HELP_MSG);
    +         System.out.println("5. " + UnpackCommand.HELP_MSG);
    +         System.out.println("6. " + DeleteListCommand.HELP_MSG);
    +         System.out.println("7. " + PackAllCommand.HELP_MSG);
    +         System.out.println("8. " + ByeCommand.HELP_MSG);
    +         printLine();
    +     }
    + 
    +     /**
    +      * Prints messages(s) to the user
    +      *
    +      * @param message Message to be shown to the user
    +      */
    +     public static void printToUser(String... message) {
    +         printLine();
    +         for (String m : message) {
    +             System.out.println(m);
    +         }
    +         printLine();
    +     }
    + 
    +     public static void showUserReturn() {
    +         printToUser(RETURN_USER_GREET);
    +     }
    + 
    +     public static void showNewUser() {
    +         printToUser(NEW_USER_GREET);
    +     }
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-5/index.html b/htmlReport/ns-5/index.html new file mode 100644 index 0000000000..307369d9af --- /dev/null +++ b/htmlReport/ns-5/index.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.packingfunc

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Item + + 100% + + + (1/1) + + + + 90% + + + (9/10) + + + + 75% + + + (12/16) + +
    PackingList + + 100% + + + (1/1) + + + + 100% + + + (13/13) + + + + 100% + + + (24/24) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_BLOCK.html b/htmlReport/ns-5/index_SORT_BY_BLOCK.html new file mode 100644 index 0000000000..a1f65fc0c9 --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_BLOCK.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.packingfunc

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Item + + 100% + + + (1/1) + + + + 90% + + + (9/10) + + + + 75% + + + (12/16) + +
    PackingList + + 100% + + + (1/1) + + + + 100% + + + (13/13) + + + + 100% + + + (24/24) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html new file mode 100644 index 0000000000..7916507655 --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.packingfunc

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    PackingList + + 100% + + + (1/1) + + + + 100% + + + (13/13) + + + + 100% + + + (24/24) + +
    Item + + 100% + + + (1/1) + + + + 90% + + + (9/10) + + + + 75% + + + (12/16) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_CLASS.html b/htmlReport/ns-5/index_SORT_BY_CLASS.html new file mode 100644 index 0000000000..40f40f3307 --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_CLASS.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.packingfunc

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Item + + 100% + + + (1/1) + + + + 90% + + + (9/10) + + + + 75% + + + (12/16) + +
    PackingList + + 100% + + + (1/1) + + + + 100% + + + (13/13) + + + + 100% + + + (24/24) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html new file mode 100644 index 0000000000..bc7e7d5afd --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.packingfunc

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    PackingList + + 100% + + + (1/1) + + + + 100% + + + (13/13) + + + + 100% + + + (24/24) + +
    Item + + 100% + + + (1/1) + + + + 90% + + + (9/10) + + + + 75% + + + (12/16) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_LINE.html b/htmlReport/ns-5/index_SORT_BY_LINE.html new file mode 100644 index 0000000000..401905c10e --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_LINE.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.packingfunc

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Item + + 100% + + + (1/1) + + + + 90% + + + (9/10) + + + + 75% + + + (12/16) + +
    PackingList + + 100% + + + (1/1) + + + + 100% + + + (13/13) + + + + 100% + + + (24/24) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html new file mode 100644 index 0000000000..04d3dc29a7 --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.packingfunc

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    PackingList + + 100% + + + (1/1) + + + + 100% + + + (13/13) + + + + 100% + + + (24/24) + +
    Item + + 100% + + + (1/1) + + + + 90% + + + (9/10) + + + + 75% + + + (12/16) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_METHOD.html b/htmlReport/ns-5/index_SORT_BY_METHOD.html new file mode 100644 index 0000000000..4e35e93cfa --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_METHOD.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.packingfunc

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    Item + + 100% + + + (1/1) + + + + 90% + + + (9/10) + + + + 75% + + + (12/16) + +
    PackingList + + 100% + + + (1/1) + + + + 100% + + + (13/13) + + + + 100% + + + (24/24) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html new file mode 100644 index 0000000000..d60fe517ef --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.packingfunc

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    PackingList + + 100% + + + (1/1) + + + + 100% + + + (13/13) + + + + 100% + + + (24/24) + +
    Item + + 100% + + + (1/1) + + + + 90% + + + (9/10) + + + + 75% + + + (12/16) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html new file mode 100644 index 0000000000..e6fbefa869 --- /dev/null +++ b/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html @@ -0,0 +1,169 @@ + + + + + Coverage Report > bagpacker.packingfunc + + + + + + +
    + + + +

    Coverage Summary for Package: bagpacker.packingfunc

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker.packingfunc + + 100% + + + (2/2) + + + + 95.7% + + + (22/23) + + + + 90% + + + (36/40) + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    PackingList + + 100% + + + (1/1) + + + + 100% + + + (13/13) + + + + 100% + + + (24/24) + +
    Item + + 100% + + + (1/1) + + + + 90% + + + (9/10) + + + + 75% + + + (12/16) + +
    + +
    + + + + + + diff --git a/htmlReport/ns-5/sources/source-1.html b/htmlReport/ns-5/sources/source-1.html new file mode 100644 index 0000000000..8b8ee4c3d2 --- /dev/null +++ b/htmlReport/ns-5/sources/source-1.html @@ -0,0 +1,170 @@ + + + + + + + Coverage Report > Item + + + + + + +
    + + +

    Coverage Summary for Class: Item (bagpacker.packingfunc)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    Item + + 100% + + + (1/1) + + + + 90% + + + (9/10) + + + + 75% + + + (12/16) + +
    + +
    +
    + + +
    + package bagpacker.packingfunc;
    + 
    + /**
    +  * Item class used to store information about item
    +  * Items to be packed can be saved in PackingList class
    +  */
    + public class Item {
    +     private final String itemName;
    + 
    +     private int packedQuantity;
    + 
    +     private int totalQuantity;
    + 
    +     /**
    +      * Constructor of an Item class used in @AddCommand
    +      * @param quantity no. of items user wants to pack
    +      * @param description name of the item
    +      */
    +     public Item(int quantity, String description) {
    +         this.itemName = description;
    +         packedQuantity = 0;
    +         this.totalQuantity = quantity;
    +     }
    + 
    +     /**
    +      * Constructor of an Item class used in @Storage
    +      * @param totalQuantity total no. of items needed to pack shown in save file
    +      * @param packedQuantity no. of items currently packed shown in the save file
    +      * @param description name of item to be packed shown in save file
    +      */
    +     public Item(int totalQuantity, int packedQuantity, String description) {
    +         itemName = description;
    +         this.packedQuantity = packedQuantity;
    +         this.totalQuantity = totalQuantity;
    +     }
    + 
    +     public int getTotalQuantity() {
    +         return totalQuantity;
    +     }
    + 
    +     public int getPackedQuantity() {
    +         return packedQuantity;
    +     }
    +     public void setTotalQuantity(int totalQuantity) {
    +         this.totalQuantity = totalQuantity;
    +     }
    + 
    +     public int getUnpackedQuantity() {
    +         return totalQuantity - packedQuantity;
    +     }
    + 
    +     public String getItemName() {
    +         return itemName;
    +     }
    + 
    +     public void setPacked(int quantity) {
    +         this.packedQuantity += quantity;
    +     }
    + 
    +     public void setUnpacked(int quantity) {
    +         this.packedQuantity -= quantity;
    +     }
    + 
    +     public String toString() {
    +         return "[" + packedQuantity + "/" + totalQuantity + "] " + this.getItemName();
    +     }
    + }
    +
    +
    +
    + + + + + + diff --git a/htmlReport/ns-5/sources/source-2.html b/htmlReport/ns-5/sources/source-2.html new file mode 100644 index 0000000000..6455be56af --- /dev/null +++ b/htmlReport/ns-5/sources/source-2.html @@ -0,0 +1,211 @@ + + + + + + + Coverage Report > PackingList + + + + + + +
    + + +

    Coverage Summary for Class: PackingList (bagpacker.packingfunc)

    + + + + + + + + + + + + + + + +
    Class + Class, % + + Method, % + + Line, % +
    PackingList + + 100% + + + (1/1) + + + + 100% + + + (13/13) + + + + 100% + + + (24/24) + +
    + +
    +
    + + +
    + package bagpacker.packingfunc;
    + import java.util.ArrayList;
    + 
    + /**
    +  * PackingList class contains methods to manipulate the users packing list
    +  */
    + public class PackingList {
    +     private static ArrayList<Item> itemList = new ArrayList<>();
    + 
    +     /***
    +      * Checks if item of the same name as itemName is found in the current packing list
    +      *
    +      * @param itemName
    +      * @return true if item of same name as itemName is found else false
    +      */
    +     public static boolean itemFinder(String itemName) {
    +         for (Item item : itemList) {
    +             if (itemName.equals(item.getItemName())) {
    +                 return true;
    +             }
    +         }
    +         return false;
    +     }
    + 
    +     /***
    +      * getExistingItem returns the object of type Item of the same name as input itemName
    +      *
    +      * this should only be called after checking that item does exist in the itemList
    +      *
    +      * @param itemName
    +      * @return item of the name itemName
    +      */
    +     public static Item getExistingItem(String itemName) {
    +         Item existingItem = null;
    +         for (int i = 0; i < itemList.size(); i++) {
    +             if (itemName.equals(itemList.get(i).getItemName())) {
    +                 existingItem = itemList.get(i);
    +             }
    +         }
    +         assert(existingItem != null);
    +         return existingItem;
    +     }
    +     /***
    +      * Adds the added quantity to the current total quantity of an item in the itemList
    +      *
    +      * @param itemName name of the item to add total quantity to be packed
    +      * @param addQty the quantity to add to the old total
    +      */
    +     public static void addToItemQuantity(String itemName, int addQty) {
    +         Item itemToAdd = getExistingItem(itemName);
    +         int totalQuantity = itemToAdd.getTotalQuantity();
    +         itemToAdd.setTotalQuantity(totalQuantity + addQty);
    +     }
    + 
    +     public static void setItemList(ArrayList<Item> itemList) {
    +         PackingList.itemList = itemList;
    +     }
    + 
    +     /**
    +      * Getter for itemList
    +      *
    +      * @return list of items
    +      */
    +     public static ArrayList<Item> getItemList() {
    +         return itemList;
    +     }
    + 
    +     /**
    +      * Adds an item to the list.
    +      */
    +     public void addItem(Item toAdd) {
    +         itemList.add(toAdd);
    +     }
    + 
    +     /**
    +      * Removes an item from the list.
    +      */
    +     public void deleteItem(Item toDelete) {
    +         itemList.remove(toDelete);
    +     }
    + 
    +     /**
    +      * Marks an item as packed in the list.
    +      */
    +     public void packItem(Item toPack, int quantity) {
    +         toPack.setPacked(quantity);
    +     }
    + 
    +     /**
    +      * Marks an item as unpacked in the list.
    +      */
    +     public void unpackItem(Item toPack, int quantity) {
    +         toPack.setUnpacked(quantity);
    +     }
    + 
    +     public static Item get(int targetIndex) {
    +         return itemList.get(targetIndex);
    +     }
    + 
    +     /**
    +      * Returns size of packing list
    +      */
    +     public int size() {
    +         return itemList.size();
    +     }
    + 
    + 
    + }
    +
    +
    +
    + + + + + + diff --git a/src/test/java/bagpacker/commands/AddCommandTest.java b/src/test/java/bagpacker/commands/AddCommandTest.java new file mode 100644 index 0000000000..bdc9164c13 --- /dev/null +++ b/src/test/java/bagpacker/commands/AddCommandTest.java @@ -0,0 +1,54 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * CommandsTest to test methods in Commands class + */ +public class AddCommandTest { + + @Test + public void testAddCommand() { + PackingList packingList = new PackingList(); + Item item = new Item(1, "toothbrush"); + Command addCommand = new AddCommand(item); + addCommand.execute(packingList); + + // Expect a Packinglist with a toothbrush item in first index + assertEquals("toothbrush", PackingList.get(0).getItemName()); + Assertions.assertNotEquals("tooth", PackingList.get(0).getItemName()); + + // Expect second index item in the packing list to be toothpaste + Item itemTwo = new Item(1, "toothpaste"); + addCommand = new AddCommand(itemTwo); + addCommand.execute(packingList); + + assertEquals("toothpaste", PackingList.get(1).getItemName()); + Assertions.assertNotEquals("toothbrush", PackingList.get(1).getItemName()); + + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(packingList); + } + @Test + public void testAddCommand_existingItem() { + PackingList packingList = new PackingList(); + Item item = new Item(1, "toothbrush"); + Command addCommand = new AddCommand(item); + addCommand.execute(packingList); + + Item itemTwo = new Item(2, "toothbrush"); + addCommand = new AddCommand(itemTwo); + addCommand.execute(packingList); + + assert(packingList.size() == 1); + assertEquals(PackingList.get(0).getTotalQuantity(), 3); + + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(packingList); + } +} diff --git a/src/test/java/bagpacker/commands/ByeCommandTest.java b/src/test/java/bagpacker/commands/ByeCommandTest.java new file mode 100644 index 0000000000..46ddc046ff --- /dev/null +++ b/src/test/java/bagpacker/commands/ByeCommandTest.java @@ -0,0 +1,33 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + + +/** + * CommandsTest to test methods in Commands class + */ +public class ByeCommandTest { + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + public void tearDown() { + System.setOut(standardOut); + } + + @Test + public void testByeCommand() { + PackingList dummyPackingList = new PackingList(); + setUp(); + ByeCommand byeCmd = new ByeCommand(); + byeCmd.execute(dummyPackingList); + assert(!ByeCommand.isBagPackerRunning); + tearDown(); + } +} diff --git a/src/test/java/bagpacker/commands/DeleteCommandTest.java b/src/test/java/bagpacker/commands/DeleteCommandTest.java new file mode 100644 index 0000000000..6b25c8faf0 --- /dev/null +++ b/src/test/java/bagpacker/commands/DeleteCommandTest.java @@ -0,0 +1,25 @@ +package bagpacker.commands; +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * CommandsTest to test methods in Commands class + */ +public class DeleteCommandTest { + + @Test + public void testDeleteCommand() { + DeleteCommand deleteCmd = new DeleteCommand(1); + PackingList dummyPackingList = new PackingList(); + Item firstItem = new Item(4, "pairs of socks"); + dummyPackingList.addItem(firstItem); + deleteCmd.execute(dummyPackingList); + assertEquals(0, dummyPackingList.size()); + + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } +} diff --git a/src/test/java/bagpacker/commands/DeleteListCommandTest.java b/src/test/java/bagpacker/commands/DeleteListCommandTest.java new file mode 100644 index 0000000000..c567970ae3 --- /dev/null +++ b/src/test/java/bagpacker/commands/DeleteListCommandTest.java @@ -0,0 +1,28 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * CommandsTest to test methods in Commands class + */ +public class DeleteListCommandTest { + + @Test + public void testDeleteListCommand() { + DeleteListCommand deleteListCmd = new DeleteListCommand(); + PackingList dummyPackingList = new PackingList(); + Item firstItem = new Item(4, "pairs of socks"); + Item secondItem = new Item(10, "underwear"); + dummyPackingList.addItem(firstItem); + dummyPackingList.addItem(secondItem); + deleteListCmd.execute(dummyPackingList); + assertEquals(0, dummyPackingList.size()); + + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } +} diff --git a/src/test/java/bagpacker/commands/HelpCommandTest.java b/src/test/java/bagpacker/commands/HelpCommandTest.java new file mode 100644 index 0000000000..ab672533e5 --- /dev/null +++ b/src/test/java/bagpacker/commands/HelpCommandTest.java @@ -0,0 +1,62 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * HelpCommandTest to test HelpCommand class + */ +public class HelpCommandTest { + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + public void tearDown() { + System.setOut(standardOut); + } + @Test + public void testHelpCommand() { + setUp(); + String userInput = " help"; + HelpCommand testHelpCmd = new HelpCommand(); + InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inStream); + testHelpCmd.execute(new PackingList()); + String helpMessage = "____________________________________________________________\r\n" + + "All Commands:\r\n" + + "1. add : Adds quantity and name of item to the packing list.\r\n" + + "\tExample: add 3 /of toothbrush\r\n" + + "\tMeaning: add quantity of 3 toothbrushes to the packing list\r\n" + + "2. delete : Deletes an item from the packing list.\r\n" + + "\tExample: delete 1\r\n" + + "\tMeaning: removes the first item in the packing list\r\n" + + "3. list : List all items and their total quantities packed in packing list.\r\n" + + "\tExample: list\r\n" + + "4. pack : Adds to the current quantity of items packed in the packing list.\r\n" + + "\tExample: pack 2 /of 3\r\n" + + "\tMeaning: packs 2 more quantities of the third item in the packing list\r\n" + + "5. unpack : Deducts from the current quantity of items packed in the packing list.\r\n" + + "\tExample: unpack 1 /of 2\r\n" + + "\tMeaning: unpacks 1 quantity of the second item in the packing list\r\n" + + "6. deletelist : Deletes all items in the packing list.\r\n" + + "\tExample: deletelist\r\n" + + "7. packall : Marks all quantity of the specified item as packed in the packing list.\r\n" + + "\tExample: packall /of 3\r\n" + + "\tMeaning: packs all of the quantities of the third item in the packing list\r\n" + + "8. bye : Stops the BagPacker Application\r\n" + + "\tExample: bye\r\n" + + "____________________________________________________________"; + assertNotNull(outputStreamCaptor.toString() + .trim()); + tearDown(); + } +} diff --git a/src/test/java/bagpacker/commands/IncorrectCommandTest.java b/src/test/java/bagpacker/commands/IncorrectCommandTest.java new file mode 100644 index 0000000000..400bc333ac --- /dev/null +++ b/src/test/java/bagpacker/commands/IncorrectCommandTest.java @@ -0,0 +1,34 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + + +/** + * IncorrectCommandTest to test HelpCommand class + */ +public class IncorrectCommandTest { + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + public void tearDown() { + System.setOut(standardOut); + } + @Test + public void testIncorrectCommand() { + setUp(); + IncorrectCommand incorrectCmd = new IncorrectCommand("errorType", "helpMessage"); + incorrectCmd.execute(new PackingList()); + String incorrectCmdMessage1 = "/////////////////////////////////////////////////////////////"; + String incorrectCmdMessage2 = "Error errorType:"; + assert(outputStreamCaptor.toString().trim().contains(incorrectCmdMessage1) + & outputStreamCaptor.toString().trim().contains(incorrectCmdMessage2)); + tearDown(); + } +} diff --git a/src/test/java/bagpacker/commands/ListCommandTest.java b/src/test/java/bagpacker/commands/ListCommandTest.java new file mode 100644 index 0000000000..3d9b29baaf --- /dev/null +++ b/src/test/java/bagpacker/commands/ListCommandTest.java @@ -0,0 +1,53 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + + +/** + * IncorrectCommandTest to test HelpCommand class + */ +public class ListCommandTest { + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + public void tearDown() { + System.setOut(standardOut); + } + @Test + public void testListCommand() { + PackingList dummyPackingList = new PackingList(); + Item item = new Item(1, "toothbrush"); + Command addCommand = new AddCommand(item); + addCommand.execute(dummyPackingList); + setUp(); + ListCommand listCmd = new ListCommand(); + listCmd.execute(dummyPackingList); + String listCmdMessage1 = "Here are the items in your list"; + String listCmdMessage2 = "[0/1] toothbrush"; + assert(outputStreamCaptor.toString().trim().contains(listCmdMessage1) + & outputStreamCaptor.toString().trim().contains(listCmdMessage2)); + tearDown(); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } + @Test + public void testListCommand_emptyList() { + PackingList dummyPackingList = new PackingList(); + setUp(); + ListCommand listCmd = new ListCommand(); + listCmd.execute(dummyPackingList); + String listCmdMessage1 = "There are no items in your list. What would you like to add?"; + String listCmdMessage2 = "____________________________________________________________"; + assert(outputStreamCaptor.toString().trim().contains(listCmdMessage1) + & outputStreamCaptor.toString().trim().contains(listCmdMessage2)); + tearDown(); + } +} diff --git a/src/test/java/bagpacker/commands/PackAllCommandTest.java b/src/test/java/bagpacker/commands/PackAllCommandTest.java new file mode 100644 index 0000000000..cfcf3ecc97 --- /dev/null +++ b/src/test/java/bagpacker/commands/PackAllCommandTest.java @@ -0,0 +1,27 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Test; + + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * PackAll CommandTest to test HelpCommand class + */ +public class PackAllCommandTest { + @Test + public void testListCommand() { + PackingList dummyPackingList = new PackingList(); + Item firstItem = new Item(30, "pairs of socks"); + dummyPackingList.addItem(firstItem); + PackAllCommand packAllCmd = new PackAllCommand(1); + packAllCmd.execute(dummyPackingList); + firstItem = PackingList.getItemList().get(0); + assertEquals(firstItem.getPackedQuantity(), firstItem.getTotalQuantity()); + + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } +} diff --git a/src/test/java/bagpacker/commands/PackCommandTest.java b/src/test/java/bagpacker/commands/PackCommandTest.java new file mode 100644 index 0000000000..fd024ed84f --- /dev/null +++ b/src/test/java/bagpacker/commands/PackCommandTest.java @@ -0,0 +1,26 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * PackAll CommandTest to test HelpCommand class + */ +public class PackCommandTest { + @Test + public void testPackCommand() { + PackingList dummyPackingList = new PackingList(); + Item firstItem = new Item(30, "pairs of socks"); + dummyPackingList.addItem(firstItem); + PackCommand packCmd = new PackCommand(20, 1); + packCmd.execute(dummyPackingList); + firstItem = PackingList.getItemList().get(0); + assertEquals(20, firstItem.getTotalQuantity() - firstItem.getUnpackedQuantity()); + + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } +} diff --git a/src/test/java/bagpacker/commands/UnpackCommandTest.java b/src/test/java/bagpacker/commands/UnpackCommandTest.java new file mode 100644 index 0000000000..40c1c7a71a --- /dev/null +++ b/src/test/java/bagpacker/commands/UnpackCommandTest.java @@ -0,0 +1,29 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Unpack Command Test to test HelpCommand class + */ +public class UnpackCommandTest { + @Test + public void testUnpackCommand() { + PackingList dummyPackingList = new PackingList(); + Item firstItem = new Item(30, "pairs of socks"); + dummyPackingList.addItem(firstItem); + PackCommand packCmd = new PackCommand(20, 1); + packCmd.execute(dummyPackingList); + int initialPackedQty = firstItem.getPackedQuantity(); + UnpackCommand unpackCmd = new UnpackCommand(10, 1); + unpackCmd.execute(dummyPackingList); + int newPackedQty = firstItem.getPackedQuantity(); + assertEquals(initialPackedQty - newPackedQty, 10); + + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } +} diff --git a/src/test/java/bagpacker/packingfunctest/CommandsTest.java b/src/test/java/bagpacker/packingfunctest/CommandsTest.java deleted file mode 100644 index d29454980d..0000000000 --- a/src/test/java/bagpacker/packingfunctest/CommandsTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package bagpacker.packingfunctest; - -import bagpacker.commands.AddCommand; -import bagpacker.commands.Command; -import bagpacker.packingfunc.Item; -import bagpacker.packingfunc.PackingList; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * CommandsTest to test methods in Commands class - */ -public class CommandsTest { - @Test - public void sampleTest() { - assertTrue(true); - } - - @Test - public void testAddCommand() { - PackingList packingList = new PackingList(); - Item item = new Item(1, "toothbrush"); - Command addCommand = new AddCommand(item); - addCommand.execute(packingList); - - // Expect a Packinglist with a toothbrush item in first index - Assertions.assertEquals("toothbrush",packingList.get(0).getItemName()); - Assertions.assertNotEquals("tooth", packingList.get(0).getItemName()); - - // Expect second index item in the packing list to be toothpaste - Item itemTwo = new Item(1, "toothpaste"); - addCommand = new AddCommand(itemTwo); - addCommand.execute(packingList); - - Assertions.assertEquals("toothpaste",packingList.get(1).getItemName()); - Assertions.assertNotEquals("toothbrush", packingList.get(1).getItemName()); - - } - -} From 8bbc64adb776eea9eb82e76dba27a194b3b75cb3 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Tue, 4 Apr 2023 11:55:04 +0800 Subject: [PATCH 094/207] Delete HTML reports --- htmlReport/css/coverage.css | 154 -- htmlReport/css/idea.min.css | 118 -- htmlReport/img/arrowDown.gif | Bin 89 -> 0 bytes htmlReport/img/arrowUp.gif | Bin 91 -> 0 bytes htmlReport/index.html | 249 --- htmlReport/index_SORT_BY_BLOCK.html | 249 --- htmlReport/index_SORT_BY_BLOCK_DESC.html | 249 --- htmlReport/index_SORT_BY_CLASS.html | 249 --- htmlReport/index_SORT_BY_CLASS_DESC.html | 249 --- htmlReport/index_SORT_BY_LINE.html | 249 --- htmlReport/index_SORT_BY_LINE_DESC.html | 249 --- htmlReport/index_SORT_BY_METHOD.html | 249 --- htmlReport/index_SORT_BY_METHOD_DESC.html | 249 --- htmlReport/index_SORT_BY_NAME_DESC.html | 249 --- htmlReport/js/highlight.min.js | 1388 ----------------- htmlReport/js/highlightjs-line-numbers.min.js | 24 - htmlReport/ns-1/index.html | 142 -- htmlReport/ns-1/index_SORT_BY_BLOCK.html | 142 -- htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html | 142 -- htmlReport/ns-1/index_SORT_BY_CLASS.html | 142 -- htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html | 142 -- htmlReport/ns-1/index_SORT_BY_LINE.html | 142 -- htmlReport/ns-1/index_SORT_BY_LINE_DESC.html | 142 -- htmlReport/ns-1/index_SORT_BY_METHOD.html | 142 -- .../ns-1/index_SORT_BY_METHOD_DESC.html | 142 -- htmlReport/ns-1/index_SORT_BY_NAME_DESC.html | 142 -- htmlReport/ns-1/sources/source-1.html | 150 -- htmlReport/ns-2/index.html | 412 ----- htmlReport/ns-2/index_SORT_BY_BLOCK.html | 412 ----- htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html | 412 ----- htmlReport/ns-2/index_SORT_BY_CLASS.html | 412 ----- htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html | 412 ----- htmlReport/ns-2/index_SORT_BY_LINE.html | 412 ----- htmlReport/ns-2/index_SORT_BY_LINE_DESC.html | 412 ----- htmlReport/ns-2/index_SORT_BY_METHOD.html | 412 ----- .../ns-2/index_SORT_BY_METHOD_DESC.html | 412 ----- htmlReport/ns-2/index_SORT_BY_NAME_DESC.html | 412 ----- htmlReport/ns-2/sources/source-1.html | 135 -- htmlReport/ns-2/sources/source-2.html | 119 -- htmlReport/ns-2/sources/source-3.html | 152 -- htmlReport/ns-2/sources/source-4.html | 131 -- htmlReport/ns-2/sources/source-5.html | 126 -- htmlReport/ns-2/sources/source-6.html | 114 -- htmlReport/ns-2/sources/source-7.html | 122 -- htmlReport/ns-2/sources/source-8.html | 138 -- htmlReport/ns-2/sources/source-9.html | 137 -- htmlReport/ns-2/sources/source-a.html | 134 -- htmlReport/ns-2/sources/source-b.html | 135 -- htmlReport/ns-3/index.html | 196 --- htmlReport/ns-3/index_SORT_BY_BLOCK.html | 196 --- htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html | 196 --- htmlReport/ns-3/index_SORT_BY_CLASS.html | 196 --- htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html | 196 --- htmlReport/ns-3/index_SORT_BY_LINE.html | 196 --- htmlReport/ns-3/index_SORT_BY_LINE_DESC.html | 196 --- htmlReport/ns-3/index_SORT_BY_METHOD.html | 196 --- .../ns-3/index_SORT_BY_METHOD_DESC.html | 196 --- htmlReport/ns-3/index_SORT_BY_NAME_DESC.html | 196 --- htmlReport/ns-3/sources/source-1.html | 107 -- htmlReport/ns-3/sources/source-2.html | 108 -- htmlReport/ns-3/sources/source-3.html | 108 -- htmlReport/ns-4/index.html | 196 --- htmlReport/ns-4/index_SORT_BY_BLOCK.html | 196 --- htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html | 196 --- htmlReport/ns-4/index_SORT_BY_CLASS.html | 196 --- htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html | 196 --- htmlReport/ns-4/index_SORT_BY_LINE.html | 196 --- htmlReport/ns-4/index_SORT_BY_LINE_DESC.html | 196 --- htmlReport/ns-4/index_SORT_BY_METHOD.html | 196 --- .../ns-4/index_SORT_BY_METHOD_DESC.html | 196 --- htmlReport/ns-4/index_SORT_BY_NAME_DESC.html | 196 --- htmlReport/ns-4/sources/source-1.html | 537 ------- htmlReport/ns-4/sources/source-2.html | 175 --- htmlReport/ns-4/sources/source-3.html | 208 --- htmlReport/ns-5/index.html | 169 -- htmlReport/ns-5/index_SORT_BY_BLOCK.html | 169 -- htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html | 169 -- htmlReport/ns-5/index_SORT_BY_CLASS.html | 169 -- htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html | 169 -- htmlReport/ns-5/index_SORT_BY_LINE.html | 169 -- htmlReport/ns-5/index_SORT_BY_LINE_DESC.html | 169 -- htmlReport/ns-5/index_SORT_BY_METHOD.html | 169 -- .../ns-5/index_SORT_BY_METHOD_DESC.html | 169 -- htmlReport/ns-5/index_SORT_BY_NAME_DESC.html | 169 -- htmlReport/ns-5/sources/source-1.html | 170 -- htmlReport/ns-5/sources/source-2.html | 211 --- 86 files changed, 18541 deletions(-) delete mode 100644 htmlReport/css/coverage.css delete mode 100644 htmlReport/css/idea.min.css delete mode 100644 htmlReport/img/arrowDown.gif delete mode 100644 htmlReport/img/arrowUp.gif delete mode 100644 htmlReport/index.html delete mode 100644 htmlReport/index_SORT_BY_BLOCK.html delete mode 100644 htmlReport/index_SORT_BY_BLOCK_DESC.html delete mode 100644 htmlReport/index_SORT_BY_CLASS.html delete mode 100644 htmlReport/index_SORT_BY_CLASS_DESC.html delete mode 100644 htmlReport/index_SORT_BY_LINE.html delete mode 100644 htmlReport/index_SORT_BY_LINE_DESC.html delete mode 100644 htmlReport/index_SORT_BY_METHOD.html delete mode 100644 htmlReport/index_SORT_BY_METHOD_DESC.html delete mode 100644 htmlReport/index_SORT_BY_NAME_DESC.html delete mode 100644 htmlReport/js/highlight.min.js delete mode 100644 htmlReport/js/highlightjs-line-numbers.min.js delete mode 100644 htmlReport/ns-1/index.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_BLOCK.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_CLASS.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_LINE.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_LINE_DESC.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_METHOD.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html delete mode 100644 htmlReport/ns-1/index_SORT_BY_NAME_DESC.html delete mode 100644 htmlReport/ns-1/sources/source-1.html delete mode 100644 htmlReport/ns-2/index.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_BLOCK.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_CLASS.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_LINE.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_LINE_DESC.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_METHOD.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html delete mode 100644 htmlReport/ns-2/index_SORT_BY_NAME_DESC.html delete mode 100644 htmlReport/ns-2/sources/source-1.html delete mode 100644 htmlReport/ns-2/sources/source-2.html delete mode 100644 htmlReport/ns-2/sources/source-3.html delete mode 100644 htmlReport/ns-2/sources/source-4.html delete mode 100644 htmlReport/ns-2/sources/source-5.html delete mode 100644 htmlReport/ns-2/sources/source-6.html delete mode 100644 htmlReport/ns-2/sources/source-7.html delete mode 100644 htmlReport/ns-2/sources/source-8.html delete mode 100644 htmlReport/ns-2/sources/source-9.html delete mode 100644 htmlReport/ns-2/sources/source-a.html delete mode 100644 htmlReport/ns-2/sources/source-b.html delete mode 100644 htmlReport/ns-3/index.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_BLOCK.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_CLASS.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_LINE.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_LINE_DESC.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_METHOD.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html delete mode 100644 htmlReport/ns-3/index_SORT_BY_NAME_DESC.html delete mode 100644 htmlReport/ns-3/sources/source-1.html delete mode 100644 htmlReport/ns-3/sources/source-2.html delete mode 100644 htmlReport/ns-3/sources/source-3.html delete mode 100644 htmlReport/ns-4/index.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_BLOCK.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_CLASS.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_LINE.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_LINE_DESC.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_METHOD.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html delete mode 100644 htmlReport/ns-4/index_SORT_BY_NAME_DESC.html delete mode 100644 htmlReport/ns-4/sources/source-1.html delete mode 100644 htmlReport/ns-4/sources/source-2.html delete mode 100644 htmlReport/ns-4/sources/source-3.html delete mode 100644 htmlReport/ns-5/index.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_BLOCK.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_CLASS.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_LINE.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_LINE_DESC.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_METHOD.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html delete mode 100644 htmlReport/ns-5/index_SORT_BY_NAME_DESC.html delete mode 100644 htmlReport/ns-5/sources/source-1.html delete mode 100644 htmlReport/ns-5/sources/source-2.html diff --git a/htmlReport/css/coverage.css b/htmlReport/css/coverage.css deleted file mode 100644 index cef776517f..0000000000 --- a/htmlReport/css/coverage.css +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright 2000-2021 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -* { - margin: 0; - padding: 0; -} - -body { - background-color: #fff; - font-family: helvetica neue, tahoma, arial, sans-serif; - font-size: 82%; - color: #151515; -} - -h1 { - margin: 0.5em 0; - color: #010101; - font-weight: normal; - font-size: 18px; -} - -h2 { - margin: 0.5em 0; - color: #010101; - font-weight: normal; - font-size: 16px; -} - -a { - color: #1564C2; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -span.separator { - color: #9BA9BA; - padding-left: 5px; - padding-right: 5px; -} - -div.content { - width: 99%; -} - -table.coverageStats { - width: 100%; - border-collapse: collapse; -} - -table.overallStats { - width: 20%; -} - -table.coverageStats td, table.coverageStats th { - padding: 4px 2px; - border-bottom: 1px solid #ccc; -} - -table.coverageStats th { - background-color: #959BA4; - border: none; - font-weight: bold; - text-align: left; - color: #FFF; -} - -table.coverageStats th.coverageStat { - width: 15%; -} - -table.coverageStats th a { - color: #FFF; -} - -table.coverageStats th a:hover { - text-decoration: none; -} - -table.coverageStats th.sortedDesc a { - background: url(../img/arrowDown.gif) no-repeat 100% 2px; - padding-right: 20px; -} - -table.coverageStats th.sortedAsc a { - background: url(../img/arrowUp.gif) no-repeat 100% 2px; - padding-right: 20px; -} - -div.footer { - margin: 2em .5em; - font-size: 85%; - text-align: left; - line-height: 140%; -} - -code.sourceCode { - width: 100%; - border: 1px solid #ccc; - font: normal 12px 'Menlo', 'Bitstream Vera Sans Mono', 'Courier New', 'Courier', monospace; - white-space: pre; -} - -code.sourceCode b { - font-weight: normal; -} - -code.sourceCode span.number { - color: #151515; -} - -code.sourceCode .fc { - background-color: #cfc; -} - -code.sourceCode .pc { - background-color: #ffc; -} - -code.sourceCode .nc { - background-color: #fcc; -} - -.percent, .absValue { - font-size: 90%; -} - -.percent .green, .absValue .green { - color: #32cc32; -} - -.percent .red, .absValue .red { - color: #f00; -} - -.percent .totalDiff { - color: #3f3f3f; -} diff --git a/htmlReport/css/idea.min.css b/htmlReport/css/idea.min.css deleted file mode 100644 index a8d5292bd5..0000000000 --- a/htmlReport/css/idea.min.css +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2000-2021 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* -Intellij Idea-like styling (c) Vasily Polovnyov -*/ - -.hljs { - color: #000; - background: #fff; -} - -.hljs-subst, -.hljs-title { - font-weight: normal; - color: #000; -} - -.hljs-comment, -.hljs-quote { - color: #808080; - font-style: italic; -} - -.hljs-meta { - color: #808000; -} - -.hljs-tag { - background: #efefef; -} - -.hljs-section, -.hljs-name, -.hljs-literal, -.hljs-keyword, -.hljs-selector-tag, -.hljs-type, -.hljs-selector-id, -.hljs-selector-class { - font-weight: bold; - color: #000080; -} - -.hljs-attribute, -.hljs-number, -.hljs-regexp, -.hljs-link { - font-weight: bold; - color: #0000ff; -} - -.hljs-number, -.hljs-regexp, -.hljs-link { - font-weight: normal; -} - -.hljs-string { - color: #008000; - font-weight: bold; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-formula { - color: #000; - background: #d0eded; - font-style: italic; -} - -.hljs-doctag { - text-decoration: underline; -} - -.hljs-variable, -.hljs-template-variable { - color: #660e7a; -} - -.hljs-addition { - background: #baeeba; -} - -.hljs-deletion { - background: #ffc8bd; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-ln-numbers { - display: block; - float: left; - width: 3em; - border-right: 1px solid #ccc; - font-style: normal; - text-align: right; - background-color: #eee; -} diff --git a/htmlReport/img/arrowDown.gif b/htmlReport/img/arrowDown.gif deleted file mode 100644 index a4ac9b4b0f5eee9fc82deb7f03d0cc7f197b01c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmZ?wbhEHbv%yJ&P?))?G g5?!@7agD+*@rGjs@joUks8}}Ha%HfNHz$KN0Orjd82|tP diff --git a/htmlReport/img/arrowUp.gif b/htmlReport/img/arrowUp.gif deleted file mode 100644 index d488db0089f15409b83a6f39718384cac89ea3c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91 zcmZ?wbhEHbv%nBa6?))=2 j#jeJ<$W6!S$=vG=3s*2Wu3C5I!M+a(XH6zEFjxZs9OxeQ diff --git a/htmlReport/index.html b/htmlReport/index.html deleted file mode 100644 index 842efe82dd..0000000000 --- a/htmlReport/index.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
    - - -

    Overall Coverage Summary

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    all classes - - 70% - - - (14/20) - - - - 57% - - - (57/100) - - - - 35.8% - - - (123/344) - -
    - -
    -

    Coverage Breakdown

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    -
    - - - - - - - diff --git a/htmlReport/index_SORT_BY_BLOCK.html b/htmlReport/index_SORT_BY_BLOCK.html deleted file mode 100644 index 582d328031..0000000000 --- a/htmlReport/index_SORT_BY_BLOCK.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
    - - -

    Overall Coverage Summary

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    all classes - - 70% - - - (14/20) - - - - 57% - - - (57/100) - - - - 35.8% - - - (123/344) - -
    - -
    -

    Coverage Breakdown

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    -
    - - - - - - - diff --git a/htmlReport/index_SORT_BY_BLOCK_DESC.html b/htmlReport/index_SORT_BY_BLOCK_DESC.html deleted file mode 100644 index 8477e58cfb..0000000000 --- a/htmlReport/index_SORT_BY_BLOCK_DESC.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
    - - -

    Overall Coverage Summary

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    all classes - - 70% - - - (14/20) - - - - 57% - - - (57/100) - - - - 35.8% - - - (123/344) - -
    - -
    -

    Coverage Breakdown

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Package - Class, % - - Method, % - - Line, % -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    -
    - - - - - - - diff --git a/htmlReport/index_SORT_BY_CLASS.html b/htmlReport/index_SORT_BY_CLASS.html deleted file mode 100644 index d2ba22e3f6..0000000000 --- a/htmlReport/index_SORT_BY_CLASS.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
    - - -

    Overall Coverage Summary

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    all classes - - 70% - - - (14/20) - - - - 57% - - - (57/100) - - - - 35.8% - - - (123/344) - -
    - -
    -

    Coverage Breakdown

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    -
    - - - - - - - diff --git a/htmlReport/index_SORT_BY_CLASS_DESC.html b/htmlReport/index_SORT_BY_CLASS_DESC.html deleted file mode 100644 index d10233f172..0000000000 --- a/htmlReport/index_SORT_BY_CLASS_DESC.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
    - - -

    Overall Coverage Summary

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    all classes - - 70% - - - (14/20) - - - - 57% - - - (57/100) - - - - 35.8% - - - (123/344) - -
    - -
    -

    Coverage Breakdown

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Package - Class, % - - Method, % - - Line, % -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    -
    - - - - - - - diff --git a/htmlReport/index_SORT_BY_LINE.html b/htmlReport/index_SORT_BY_LINE.html deleted file mode 100644 index bc3ff32915..0000000000 --- a/htmlReport/index_SORT_BY_LINE.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
    - - -

    Overall Coverage Summary

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    all classes - - 70% - - - (14/20) - - - - 57% - - - (57/100) - - - - 35.8% - - - (123/344) - -
    - -
    -

    Coverage Breakdown

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    -
    - - - - - - - diff --git a/htmlReport/index_SORT_BY_LINE_DESC.html b/htmlReport/index_SORT_BY_LINE_DESC.html deleted file mode 100644 index 8f099d27fc..0000000000 --- a/htmlReport/index_SORT_BY_LINE_DESC.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
    - - -

    Overall Coverage Summary

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    all classes - - 70% - - - (14/20) - - - - 57% - - - (57/100) - - - - 35.8% - - - (123/344) - -
    - -
    -

    Coverage Breakdown

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Package - Class, % - - Method, % - - Line, % -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    -
    - - - - - - - diff --git a/htmlReport/index_SORT_BY_METHOD.html b/htmlReport/index_SORT_BY_METHOD.html deleted file mode 100644 index 8336867732..0000000000 --- a/htmlReport/index_SORT_BY_METHOD.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
    - - -

    Overall Coverage Summary

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    all classes - - 70% - - - (14/20) - - - - 57% - - - (57/100) - - - - 35.8% - - - (123/344) - -
    - -
    -

    Coverage Breakdown

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    -
    - - - - - - - diff --git a/htmlReport/index_SORT_BY_METHOD_DESC.html b/htmlReport/index_SORT_BY_METHOD_DESC.html deleted file mode 100644 index cd2896dceb..0000000000 --- a/htmlReport/index_SORT_BY_METHOD_DESC.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
    - - -

    Overall Coverage Summary

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    all classes - - 70% - - - (14/20) - - - - 57% - - - (57/100) - - - - 35.8% - - - (123/344) - -
    - -
    -

    Coverage Breakdown

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Package - Class, % - - Method, % - - Line, % -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    -
    - - - - - - - diff --git a/htmlReport/index_SORT_BY_NAME_DESC.html b/htmlReport/index_SORT_BY_NAME_DESC.html deleted file mode 100644 index 57fa4b1a2f..0000000000 --- a/htmlReport/index_SORT_BY_NAME_DESC.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - Coverage Report > Summary - - - - - - -
    - - -

    Overall Coverage Summary

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    all classes - - 70% - - - (14/20) - - - - 57% - - - (57/100) - - - - 35.8% - - - (123/344) - -
    - -
    -

    Coverage Breakdown

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Package - Class, % - - Method, % - - Line, % -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    -
    - - - - - - - diff --git a/htmlReport/js/highlight.min.js b/htmlReport/js/highlight.min.js deleted file mode 100644 index e88731520e..0000000000 --- a/htmlReport/js/highlight.min.js +++ /dev/null @@ -1,1388 +0,0 @@ -/* - Highlight.js 10.7.2 (00233d63) - License: BSD-3-Clause - Copyright (c) 2006-2021, Ivan Sagalaev - - BSD 3-Clause License - - Copyright (c) 2006-2021, Ivan Sagalaev. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -var hljs=function(){"use strict";function e(t){ -return t instanceof Map?t.clear=t.delete=t.set=()=>{ -throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{ -throw Error("set is read-only") -}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{var i=t[n] -;"object"!=typeof i||Object.isFrozen(i)||e(i)})),t}var t=e,n=e;t.default=n -;class i{constructor(e){ -void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} -ignoreMatch(){this.isMatchIgnored=!0}}function s(e){ -return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") -}function a(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] -;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const r=e=>!!e.kind -;class l{constructor(e,t){ -this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ -this.buffer+=s(e)}openNode(e){if(!r(e))return;let t=e.kind -;e.sublanguage||(t=`${this.classPrefix}${t}`),this.span(t)}closeNode(e){ -r(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ -this.buffer+=``}}class o{constructor(){this.rootNode={ -children:[]},this.stack=[this.rootNode]}get top(){ -return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ -this.top.children.push(e)}openNode(e){const t={kind:e,children:[]} -;this.add(t),this.stack.push(t)}closeNode(){ -if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ -for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} -walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ -return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), -t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ -"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ -o._collapse(e)})))}}class c extends o{constructor(e){super(),this.options=e} -addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} -addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root -;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){ -return new l(this,this.options).value()}finalize(){return!0}}function g(e){ -return e?"string"==typeof e?e:e.source:null} -const u=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,h="[a-zA-Z]\\w*",d="[a-zA-Z_]\\w*",f="\\b\\d+(\\.\\d+)?",p="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",m="\\b(0b[01]+)",b={ -begin:"\\\\[\\s\\S]",relevance:0},E={className:"string",begin:"'",end:"'", -illegal:"\\n",contains:[b]},x={className:"string",begin:'"',end:'"', -illegal:"\\n",contains:[b]},v={ -begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ -},w=(e,t,n={})=>{const i=a({className:"comment",begin:e,end:t,contains:[]},n) -;return i.contains.push(v),i.contains.push({className:"doctag", -begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),i -},y=w("//","$"),N=w("/\\*","\\*/"),R=w("#","$");var _=Object.freeze({ -__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:h,UNDERSCORE_IDENT_RE:d, -NUMBER_RE:f,C_NUMBER_RE:p,BINARY_NUMBER_RE:m, -RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", -SHEBANG:(e={})=>{const t=/^#![ ]*\// -;return e.binary&&(e.begin=((...e)=>e.map((e=>g(e))).join(""))(t,/.*\b/,e.binary,/\b.*/)), -a({className:"meta",begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{ -0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:b,APOS_STRING_MODE:E, -QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:v,COMMENT:w,C_LINE_COMMENT_MODE:y, -C_BLOCK_COMMENT_MODE:N,HASH_COMMENT_MODE:R,NUMBER_MODE:{className:"number", -begin:f,relevance:0},C_NUMBER_MODE:{className:"number",begin:p,relevance:0}, -BINARY_NUMBER_MODE:{className:"number",begin:m,relevance:0},CSS_NUMBER_MODE:{ -className:"number", -begin:f+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", -relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp", -begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[b,{begin:/\[/,end:/\]/, -relevance:0,contains:[b]}]}]},TITLE_MODE:{className:"title",begin:h,relevance:0 -},UNDERSCORE_TITLE_MODE:{className:"title",begin:d,relevance:0},METHOD_GUARD:{ -begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ -"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ -t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function k(e,t){ -"."===e.input[e.index-1]&&t.ignoreMatch()}function M(e,t){ -t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", -e.__beforeBegin=k,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, -void 0===e.relevance&&(e.relevance=0))}function O(e,t){ -Array.isArray(e.illegal)&&(e.illegal=((...e)=>"("+e.map((e=>g(e))).join("|")+")")(...e.illegal)) -}function A(e,t){if(e.match){ -if(e.begin||e.end)throw Error("begin & end are not supported with match") -;e.begin=e.match,delete e.match}}function L(e,t){ -void 0===e.relevance&&(e.relevance=1)} -const I=["of","and","for","in","not","or","if","then","parent","list","value"] -;function j(e,t,n="keyword"){const i={} -;return"string"==typeof e?s(n,e.split(" ")):Array.isArray(e)?s(n,e):Object.keys(e).forEach((n=>{ -Object.assign(i,j(e[n],t,n))})),i;function s(e,n){ -t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") -;i[n[0]]=[e,B(n[0],n[1])]}))}}function B(e,t){ -return t?Number(t):(e=>I.includes(e.toLowerCase()))(e)?0:1} -function T(e,{plugins:t}){function n(t,n){ -return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(n?"g":""))}class i{ -constructor(){ -this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} -addRule(e,t){ -t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), -this.matchAt+=(e=>RegExp(e.toString()+"|").exec("").length-1)(e)+1}compile(){ -0===this.regexes.length&&(this.exec=()=>null) -;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(((e,t="|")=>{let n=0 -;return e.map((e=>{n+=1;const t=n;let i=g(e),s="";for(;i.length>0;){ -const e=u.exec(i);if(!e){s+=i;break} -s+=i.substring(0,e.index),i=i.substring(e.index+e[0].length), -"\\"===e[0][0]&&e[1]?s+="\\"+(Number(e[1])+t):(s+=e[0],"("===e[0]&&n++)}return s -})).map((e=>`(${e})`)).join(t)})(e),!0),this.lastIndex=0}exec(e){ -this.matcherRe.lastIndex=this.lastIndex;const t=this.matcherRe.exec(e) -;if(!t)return null -;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] -;return t.splice(0,n),Object.assign(t,i)}}class s{constructor(){ -this.rules=[],this.multiRegexes=[], -this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ -if(this.multiRegexes[e])return this.multiRegexes[e];const t=new i -;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), -t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ -return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ -this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ -const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex -;let n=t.exec(e) -;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ -const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} -return n&&(this.regexIndex+=n.position+1, -this.regexIndex===this.count&&this.considerAll()),n}} -if(e.compilerExtensions||(e.compilerExtensions=[]), -e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") -;return e.classNameAliases=a(e.classNameAliases||{}),function t(i,r){const l=i -;if(i.isCompiled)return l -;[A].forEach((e=>e(i,r))),e.compilerExtensions.forEach((e=>e(i,r))), -i.__beforeBegin=null,[M,O,L].forEach((e=>e(i,r))),i.isCompiled=!0;let o=null -;if("object"==typeof i.keywords&&(o=i.keywords.$pattern, -delete i.keywords.$pattern), -i.keywords&&(i.keywords=j(i.keywords,e.case_insensitive)), -i.lexemes&&o)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ") -;return o=o||i.lexemes||/\w+/, -l.keywordPatternRe=n(o,!0),r&&(i.begin||(i.begin=/\B|\b/), -l.beginRe=n(i.begin),i.endSameAsBegin&&(i.end=i.begin), -i.end||i.endsWithParent||(i.end=/\B|\b/), -i.end&&(l.endRe=n(i.end)),l.terminatorEnd=g(i.end)||"", -i.endsWithParent&&r.terminatorEnd&&(l.terminatorEnd+=(i.end?"|":"")+r.terminatorEnd)), -i.illegal&&(l.illegalRe=n(i.illegal)), -i.contains||(i.contains=[]),i.contains=[].concat(...i.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>a(e,{ -variants:null},t)))),e.cachedVariants?e.cachedVariants:S(e)?a(e,{ -starts:e.starts?a(e.starts):null -}):Object.isFrozen(e)?a(e):e))("self"===e?i:e)))),i.contains.forEach((e=>{t(e,l) -})),i.starts&&t(i.starts,r),l.matcher=(e=>{const t=new s -;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" -}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" -}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(l),l}(e)}function S(e){ -return!!e&&(e.endsWithParent||S(e.starts))}function P(e){const t={ -props:["language","code","autodetect"],data:()=>({detectedLanguage:"", -unknownLanguage:!1}),computed:{className(){ -return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){ -if(!this.autoDetect&&!e.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`), -this.unknownLanguage=!0,s(this.code);let t={} -;return this.autoDetect?(t=e.highlightAuto(this.code), -this.detectedLanguage=t.language):(t=e.highlight(this.language,this.code,this.ignoreIllegals), -this.detectedLanguage=this.language),t.value},autoDetect(){ -return!(this.language&&(e=this.autodetect,!e&&""!==e));var e}, -ignoreIllegals:()=>!0},render(e){return e("pre",{},[e("code",{ -class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{ -Component:t,VuePlugin:{install(e){e.component("highlightjs",t)}}}}const D={ -"after:highlightElement":({el:e,result:t,text:n})=>{const i=H(e) -;if(!i.length)return;const a=document.createElement("div") -;a.innerHTML=t.value,t.value=((e,t,n)=>{let i=0,a="";const r=[];function l(){ -return e.length&&t.length?e[0].offset!==t[0].offset?e[0].offset"}function c(e){ -a+=""}function g(e){("start"===e.event?o:c)(e.node)} -for(;e.length||t.length;){let t=l() -;if(a+=s(n.substring(i,t[0].offset)),i=t[0].offset,t===e){r.reverse().forEach(c) -;do{g(t.splice(0,1)[0]),t=l()}while(t===e&&t.length&&t[0].offset===i) -;r.reverse().forEach(o) -}else"start"===t[0].event?r.push(t[0].node):r.pop(),g(t.splice(0,1)[0])} -return a+s(n.substr(i))})(i,H(a),n)}};function C(e){ -return e.nodeName.toLowerCase()}function H(e){const t=[];return function e(n,i){ -for(let s=n.firstChild;s;s=s.nextSibling)3===s.nodeType?i+=s.nodeValue.length:1===s.nodeType&&(t.push({ -event:"start",offset:i,node:s}),i=e(s,i),C(s).match(/br|hr|img|input/)||t.push({ -event:"stop",offset:i,node:s}));return i}(e,0),t}const $={},U=e=>{ -console.error(e)},z=(e,...t)=>{console.log("WARN: "+e,...t)},K=(e,t)=>{ -$[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),$[`${e}/${t}`]=!0) -},G=s,V=a,W=Symbol("nomatch");return(e=>{ -const n=Object.create(null),s=Object.create(null),a=[];let r=!0 -;const l=/(^(<[^>]+>|\t|)+|\n)/gm,o="Could not find the language '{}', did you forget to load/include a language module?",g={ -disableAutodetect:!0,name:"Plain text",contains:[]};let u={ -noHighlightRe:/^(no-?highlight)$/i, -languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", -tabReplace:null,useBR:!1,languages:null,__emitter:c};function h(e){ -return u.noHighlightRe.test(e)}function d(e,t,n,i){let s="",a="" -;"object"==typeof t?(s=e, -n=t.ignoreIllegals,a=t.language,i=void 0):(K("10.7.0","highlight(lang, code, ...args) has been deprecated."), -K("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), -a=e,s=t);const r={code:s,language:a};M("before:highlight",r) -;const l=r.result?r.result:f(r.language,r.code,n,i) -;return l.code=r.code,M("after:highlight",l),l}function f(e,t,s,l){ -function c(e,t){const n=v.case_insensitive?t[0].toLowerCase():t[0] -;return Object.prototype.hasOwnProperty.call(e.keywords,n)&&e.keywords[n]} -function g(){null!=R.subLanguage?(()=>{if(""===M)return;let e=null -;if("string"==typeof R.subLanguage){ -if(!n[R.subLanguage])return void k.addText(M) -;e=f(R.subLanguage,M,!0,_[R.subLanguage]),_[R.subLanguage]=e.top -}else e=p(M,R.subLanguage.length?R.subLanguage:null) -;R.relevance>0&&(O+=e.relevance),k.addSublanguage(e.emitter,e.language) -})():(()=>{if(!R.keywords)return void k.addText(M);let e=0 -;R.keywordPatternRe.lastIndex=0;let t=R.keywordPatternRe.exec(M),n="";for(;t;){ -n+=M.substring(e,t.index);const i=c(R,t);if(i){const[e,s]=i -;if(k.addText(n),n="",O+=s,e.startsWith("_"))n+=t[0];else{ -const n=v.classNameAliases[e]||e;k.addKeyword(t[0],n)}}else n+=t[0] -;e=R.keywordPatternRe.lastIndex,t=R.keywordPatternRe.exec(M)} -n+=M.substr(e),k.addText(n)})(),M=""}function h(e){ -return e.className&&k.openNode(v.classNameAliases[e.className]||e.className), -R=Object.create(e,{parent:{value:R}}),R}function d(e,t,n){let s=((e,t)=>{ -const n=e&&e.exec(t);return n&&0===n.index})(e.endRe,n);if(s){if(e["on:end"]){ -const n=new i(e);e["on:end"](t,n),n.isMatchIgnored&&(s=!1)}if(s){ -for(;e.endsParent&&e.parent;)e=e.parent;return e}} -if(e.endsWithParent)return d(e.parent,t,n)}function m(e){ -return 0===R.matcher.regexIndex?(M+=e[0],1):(I=!0,0)}function b(e){ -const n=e[0],i=t.substr(e.index),s=d(R,e,i);if(!s)return W;const a=R -;a.skip?M+=n:(a.returnEnd||a.excludeEnd||(M+=n),g(),a.excludeEnd&&(M=n));do{ -R.className&&k.closeNode(),R.skip||R.subLanguage||(O+=R.relevance),R=R.parent -}while(R!==s.parent) -;return s.starts&&(s.endSameAsBegin&&(s.starts.endRe=s.endRe), -h(s.starts)),a.returnEnd?0:n.length}let E={};function x(n,a){const l=a&&a[0] -;if(M+=n,null==l)return g(),0 -;if("begin"===E.type&&"end"===a.type&&E.index===a.index&&""===l){ -if(M+=t.slice(a.index,a.index+1),!r){const t=Error("0 width match regex") -;throw t.languageName=e,t.badRule=E.rule,t}return 1} -if(E=a,"begin"===a.type)return function(e){ -const t=e[0],n=e.rule,s=new i(n),a=[n.__beforeBegin,n["on:begin"]] -;for(const n of a)if(n&&(n(e,s),s.isMatchIgnored))return m(t) -;return n&&n.endSameAsBegin&&(n.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")), -n.skip?M+=t:(n.excludeBegin&&(M+=t), -g(),n.returnBegin||n.excludeBegin||(M=t)),h(n),n.returnBegin?0:t.length}(a) -;if("illegal"===a.type&&!s){ -const e=Error('Illegal lexeme "'+l+'" for mode "'+(R.className||"")+'"') -;throw e.mode=R,e}if("end"===a.type){const e=b(a);if(e!==W)return e} -if("illegal"===a.type&&""===l)return 1 -;if(L>1e5&&L>3*a.index)throw Error("potential infinite loop, way more iterations than matches") -;return M+=l,l.length}const v=N(e) -;if(!v)throw U(o.replace("{}",e)),Error('Unknown language: "'+e+'"') -;const w=T(v,{plugins:a});let y="",R=l||w;const _={},k=new u.__emitter(u);(()=>{ -const e=[];for(let t=R;t!==v;t=t.parent)t.className&&e.unshift(t.className) -;e.forEach((e=>k.openNode(e)))})();let M="",O=0,A=0,L=0,I=!1;try{ -for(R.matcher.considerAll();;){ -L++,I?I=!1:R.matcher.considerAll(),R.matcher.lastIndex=A -;const e=R.matcher.exec(t);if(!e)break;const n=x(t.substring(A,e.index),e) -;A=e.index+n}return x(t.substr(A)),k.closeAllNodes(),k.finalize(),y=k.toHTML(),{ -relevance:Math.floor(O),value:y,language:e,illegal:!1,emitter:k,top:R}}catch(n){ -if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{ -msg:n.message,context:t.slice(A-100,A+100),mode:n.mode},sofar:y,relevance:0, -value:G(t),emitter:k};if(r)return{illegal:!1,relevance:0,value:G(t),emitter:k, -language:e,top:R,errorRaised:n};throw n}}function p(e,t){ -t=t||u.languages||Object.keys(n);const i=(e=>{const t={relevance:0, -emitter:new u.__emitter(u),value:G(e),illegal:!1,top:g} -;return t.emitter.addText(e),t})(e),s=t.filter(N).filter(k).map((t=>f(t,e,!1))) -;s.unshift(i);const a=s.sort(((e,t)=>{ -if(e.relevance!==t.relevance)return t.relevance-e.relevance -;if(e.language&&t.language){if(N(e.language).supersetOf===t.language)return 1 -;if(N(t.language).supersetOf===e.language)return-1}return 0})),[r,l]=a,o=r -;return o.second_best=l,o}const m={"before:highlightElement":({el:e})=>{ -u.useBR&&(e.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")) -},"after:highlightElement":({result:e})=>{ -u.useBR&&(e.value=e.value.replace(/\n/g,"
    "))}},b=/^(<[^>]+>|\t)+/gm,E={ -"after:highlightElement":({result:e})=>{ -u.tabReplace&&(e.value=e.value.replace(b,(e=>e.replace(/\t/g,u.tabReplace))))}} -;function x(e){let t=null;const n=(e=>{let t=e.className+" " -;t+=e.parentNode?e.parentNode.className:"";const n=u.languageDetectRe.exec(t) -;if(n){const t=N(n[1]) -;return t||(z(o.replace("{}",n[1])),z("Falling back to no-highlight mode for this block.",e)), -t?n[1]:"no-highlight"}return t.split(/\s+/).find((e=>h(e)||N(e)))})(e) -;if(h(n))return;M("before:highlightElement",{el:e,language:n}),t=e -;const i=t.textContent,a=n?d(i,{language:n,ignoreIllegals:!0}):p(i) -;M("after:highlightElement",{el:e,result:a,text:i -}),e.innerHTML=a.value,((e,t,n)=>{const i=t?s[t]:n -;e.classList.add("hljs"),i&&e.classList.add(i)})(e,n,a.language),e.result={ -language:a.language,re:a.relevance,relavance:a.relevance -},a.second_best&&(e.second_best={language:a.second_best.language, -re:a.second_best.relevance,relavance:a.second_best.relevance})}const v=()=>{ -v.called||(v.called=!0, -K("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead."), -document.querySelectorAll("pre code").forEach(x))};let w=!1;function y(){ -"loading"!==document.readyState?document.querySelectorAll("pre code").forEach(x):w=!0 -}function N(e){return e=(e||"").toLowerCase(),n[e]||n[s[e]]} -function R(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ -s[e.toLowerCase()]=t}))}function k(e){const t=N(e) -;return t&&!t.disableAutodetect}function M(e,t){const n=e;a.forEach((e=>{ -e[n]&&e[n](t)}))} -"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ -w&&y()}),!1),Object.assign(e,{highlight:d,highlightAuto:p,highlightAll:y, -fixMarkup:e=>{ -return K("10.2.0","fixMarkup will be removed entirely in v11.0"),K("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"), -t=e, -u.tabReplace||u.useBR?t.replace(l,(e=>"\n"===e?u.useBR?"
    ":e:u.tabReplace?e.replace(/\t/g,u.tabReplace):e)):t -;var t},highlightElement:x, -highlightBlock:e=>(K("10.7.0","highlightBlock will be removed entirely in v12.0"), -K("10.7.0","Please use highlightElement now."),x(e)),configure:e=>{ -e.useBR&&(K("10.3.0","'useBR' will be removed entirely in v11.0"), -K("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")), -u=V(u,e)},initHighlighting:v,initHighlightingOnLoad:()=>{ -K("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."), -w=!0},registerLanguage:(t,i)=>{let s=null;try{s=i(e)}catch(e){ -if(U("Language definition for '{}' could not be registered.".replace("{}",t)), -!r)throw e;U(e),s=g} -s.name||(s.name=t),n[t]=s,s.rawDefinition=i.bind(null,e),s.aliases&&R(s.aliases,{ -languageName:t})},unregisterLanguage:e=>{delete n[e] -;for(const t of Object.keys(s))s[t]===e&&delete s[t]}, -listLanguages:()=>Object.keys(n),getLanguage:N,registerAliases:R, -requireLanguage:e=>{ -K("10.4.0","requireLanguage will be removed entirely in v11."), -K("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844") -;const t=N(e);if(t)return t -;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))}, -autoDetection:k,inherit:V,addPlugin:e=>{(e=>{ -e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ -e["before:highlightBlock"](Object.assign({block:t.el},t)) -}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ -e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),a.push(e)}, -vuePlugin:P(e).VuePlugin}),e.debugMode=()=>{r=!1},e.safeMode=()=>{r=!0 -},e.versionString="10.7.2";for(const e in _)"object"==typeof _[e]&&t(_[e]) -;return Object.assign(e,_),e.addPlugin(m),e.addPlugin(D),e.addPlugin(E),e})({}) -}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); -hljs.registerLanguage("apache",(()=>{"use strict";return e=>{const n={ -className:"number",begin:/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?/} -;return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0, -contains:[e.HASH_COMMENT_MODE,{className:"section",begin:/<\/?/,end:/>/, -contains:[n,{className:"number",begin:/:\d{1,5}/ -},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute", -begin:/\w+/,relevance:0,keywords:{ -nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername" -},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"}, -contains:[{className:"meta",begin:/\s\[/,end:/\]$/},{className:"variable", -begin:/[\$%]\{/,end:/\}/,contains:["self",{className:"number",begin:/[$%]\d+/}] -},n,{className:"number",begin:/\d+/},e.QUOTE_STRING_MODE]}}],illegal:/\S/}} -})()); -hljs.registerLanguage("bash",(()=>{"use strict";function e(...e){ -return e.map((e=>{return(s=e)?"string"==typeof s?s:s.source:null;var s -})).join("")}return s=>{const n={},t={begin:/\$\{/,end:/\}/,contains:["self",{ -begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{ -begin:e(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},t]});const a={ -className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},i={ -begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/, -end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/, -contains:[s.BACKSLASH_ESCAPE,n,a]};a.contains.push(c);const o={begin:/\$\(\(/, -end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,n] -},r=s.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 -}),l={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, -contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ -name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/, -keyword:"if then else elif fi for while in do done case esac function", -literal:"true false", -built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp" -},contains:[r,s.SHEBANG(),l,o,s.HASH_COMMENT_MODE,i,c,{className:"",begin:/\\"/ -},{className:"string",begin:/'/,end:/'/},n]}}})()); -hljs.registerLanguage("c",(()=>{"use strict";function e(e){ -return((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(",e,")?") -}return t=>{const n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}] -}),r="[a-zA-Z_]\\w*::",a="(decltype\\(auto\\)|"+e(r)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",i={ -className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string", -variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", -contains:[t.BACKSLASH_ESCAPE]},{ -begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", -end:"'",illegal:"."},t.END_SAME_AS_BEGIN({ -begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ -className:"number",variants:[{begin:"\\b(0b[01']+)"},{ -begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" -},{ -begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" -}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ -"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" -},contains:[{begin:/\\\n/,relevance:0},t.inherit(s,{className:"meta-string"}),{ -className:"meta-string",begin:/<.*?>/},n,t.C_BLOCK_COMMENT_MODE]},l={ -className:"title",begin:e(r)+t.IDENT_RE,relevance:0 -},d=e(r)+t.IDENT_RE+"\\s*\\(",u={ -keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", -built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary", -literal:"true false nullptr NULL"},m=[c,i,n,t.C_BLOCK_COMMENT_MODE,o,s],p={ -variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ -beginKeywords:"new throw return else",end:/;/}],keywords:u,contains:m.concat([{ -begin:/\(/,end:/\)/,keywords:u,contains:m.concat(["self"]),relevance:0}]), -relevance:0},_={className:"function",begin:"("+a+"[\\*&\\s]+)+"+d, -returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:u,illegal:/[^\w\s\*&:<>.]/, -contains:[{begin:"decltype\\(auto\\)",keywords:u,relevance:0},{begin:d, -returnBegin:!0,contains:[l],relevance:0},{className:"params",begin:/\(/, -end:/\)/,keywords:u,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,s,o,i,{ -begin:/\(/,end:/\)/,keywords:u,relevance:0, -contains:["self",n,t.C_BLOCK_COMMENT_MODE,s,o,i]}] -},i,n,t.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, -disableAutodetect:!0,illegal:"",keywords:u,contains:["self",i]},{begin:t.IDENT_RE+"::",keywords:u},{ -className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, -contains:[{beginKeywords:"final class struct"},t.TITLE_MODE]}]),exports:{ -preprocessor:c,strings:s,keywords:u}}}})()); -hljs.registerLanguage("coffeescript",(()=>{"use strict" -;const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) -;return r=>{const t={ -keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((i=["var","const","let","function","static"], -e=>!i.includes(e))),literal:n.concat(["yes","no","on","off"]), -built_in:a.concat(["npm","print"])};var i;const s="[A-Za-z$_][0-9A-Za-z$_]*",o={ -className:"subst",begin:/#\{/,end:/\}/,keywords:t -},c=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?", -relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/, -contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE] -},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,o]},{begin:/"/,end:/"/, -contains:[r.BACKSLASH_ESCAPE,o]}]},{className:"regexp",variants:[{begin:"///", -end:"///",contains:[o,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)", -relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+s -},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{ -begin:"```",end:"```"},{begin:"`",end:"`"}]}];o.contains=c -;const l=r.inherit(r.TITLE_MODE,{begin:s}),d="(\\(.*\\)\\s*)?\\B[-=]>",g={ -className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/, -end:/\)/,keywords:t,contains:["self"].concat(c)}]};return{name:"CoffeeScript", -aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/, -contains:c.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{ -className:"function",begin:"^\\s*"+s+"\\s*=\\s*"+d,end:"[-=]>",returnBegin:!0, -contains:[l,g]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function", -begin:d,end:"[-=]>",returnBegin:!0,contains:[g]}]},{className:"class", -beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{ -beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[l]},l] -},{begin:s+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}})()); -hljs.registerLanguage("cpp",(()=>{"use strict";function e(e){ -return t("(",e,")?")}function t(...e){return e.map((e=>{ -return(t=e)?"string"==typeof t?t:t.source:null;var t})).join("")}return n=>{ -const r=n.COMMENT("//","$",{contains:[{begin:/\\\n/}] -}),a="[a-zA-Z_]\\w*::",i="(decltype\\(auto\\)|"+e(a)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",s={ -className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string", -variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", -contains:[n.BACKSLASH_ESCAPE]},{ -begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", -end:"'",illegal:"."},n.END_SAME_AS_BEGIN({ -begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ -className:"number",variants:[{begin:"\\b(0b[01']+)"},{ -begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" -},{ -begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" -}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ -"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" -},contains:[{begin:/\\\n/,relevance:0},n.inherit(c,{className:"meta-string"}),{ -className:"meta-string",begin:/<.*?>/},r,n.C_BLOCK_COMMENT_MODE]},d={ -className:"title",begin:e(a)+n.IDENT_RE,relevance:0 -},u=e(a)+n.IDENT_RE+"\\s*\\(",m={ -keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", -built_in:"_Bool _Complex _Imaginary", -_relevance_hints:["asin","atan2","atan","calloc","ceil","cosh","cos","exit","exp","fabs","floor","fmod","fprintf","fputs","free","frexp","auto_ptr","deque","list","queue","stack","vector","map","set","pair","bitset","multiset","multimap","unordered_set","fscanf","future","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","tolower","toupper","labs","ldexp","log10","log","malloc","realloc","memchr","memcmp","memcpy","memset","modf","pow","printf","putchar","puts","scanf","sinh","sin","snprintf","sprintf","sqrt","sscanf","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","tanh","tan","unordered_map","unordered_multiset","unordered_multimap","priority_queue","make_pair","array","shared_ptr","abort","terminate","abs","acos","vfprintf","vprintf","vsprintf","endl","initializer_list","unique_ptr","complex","imaginary","std","string","wstring","cin","cout","cerr","clog","stdin","stdout","stderr","stringstream","istringstream","ostringstream"], -literal:"true false nullptr NULL"},p={className:"function.dispatch",relevance:0, -keywords:m, -begin:t(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!while)/,n.IDENT_RE,(_=/\s*\(/, -t("(?=",_,")")))};var _;const g=[p,l,s,r,n.C_BLOCK_COMMENT_MODE,o,c],b={ -variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ -beginKeywords:"new throw return else",end:/;/}],keywords:m,contains:g.concat([{ -begin:/\(/,end:/\)/,keywords:m,contains:g.concat(["self"]),relevance:0}]), -relevance:0},f={className:"function",begin:"("+i+"[\\*&\\s]+)+"+u, -returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:m,illegal:/[^\w\s\*&:<>.]/, -contains:[{begin:"decltype\\(auto\\)",keywords:m,relevance:0},{begin:u, -returnBegin:!0,contains:[d],relevance:0},{begin:/::/,relevance:0},{begin:/:/, -endsWithParent:!0,contains:[c,o]},{className:"params",begin:/\(/,end:/\)/, -keywords:m,relevance:0,contains:[r,n.C_BLOCK_COMMENT_MODE,c,o,s,{begin:/\(/, -end:/\)/,keywords:m,relevance:0,contains:["self",r,n.C_BLOCK_COMMENT_MODE,c,o,s] -}]},s,r,n.C_BLOCK_COMMENT_MODE,l]};return{name:"C++", -aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:m,illegal:"",keywords:m,contains:["self",s]},{begin:n.IDENT_RE+"::",keywords:m},{ -className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, -contains:[{beginKeywords:"final class struct"},n.TITLE_MODE]}]),exports:{ -preprocessor:l,strings:c,keywords:m}}}})()); -hljs.registerLanguage("csharp",(()=>{"use strict";return e=>{const n={ -keyword:["abstract","as","base","break","case","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), -built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], -literal:["default","false","null","true"]},a=e.inherit(e.TITLE_MODE,{ -begin:"[a-zA-Z](\\.?\\w)*"}),i={className:"number",variants:[{ -begin:"\\b(0b[01']+)"},{ -begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ -begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" -}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] -},t=e.inherit(s,{illegal:/\n/}),r={className:"subst",begin:/\{/,end:/\}/, -keywords:n},l=e.inherit(r,{illegal:/\n/}),c={className:"string",begin:/\$"/, -end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ -},e.BACKSLASH_ESCAPE,l]},o={className:"string",begin:/\$@"/,end:'"',contains:[{ -begin:/\{\{/},{begin:/\}\}/},{begin:'""'},r]},d=e.inherit(o,{illegal:/\n/, -contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},l]}) -;r.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.C_BLOCK_COMMENT_MODE], -l.contains=[d,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.inherit(e.C_BLOCK_COMMENT_MODE,{ -illegal:/\n/})];const g={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] -},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},a] -},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={ -begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], -keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, -contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ -begin:"\x3c!--|--\x3e"},{begin:""}]}] -}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", -end:"$",keywords:{ -"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum" -}},g,i,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, -illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" -},a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", -relevance:0,end:/[{;=]/,illegal:/[^\s:]/, -contains:[a,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ -beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, -contains:[a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", -begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ -className:"meta-string",begin:/"/,end:/"/}]},{ -beginKeywords:"new return throw await else",relevance:0},{className:"function", -begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(<.+>\\s*)?\\(",returnBegin:!0, -end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ -beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", -relevance:0},{begin:e.IDENT_RE+"\\s*(<.+>\\s*)?\\(",returnBegin:!0, -contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/, -excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, -contains:[g,i,e.C_BLOCK_COMMENT_MODE] -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}})()); -hljs.registerLanguage("css",(()=>{"use strict" -;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],r=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() -;return n=>{const a=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, -HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, -ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, -illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} -}))(n),l=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS", -case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"}, -classNameAliases:{keyframePosition:"selector-tag"}, -contains:[n.C_BLOCK_COMMENT_MODE,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ -},n.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 -},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 -},a.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ -begin:":("+i.join("|")+")"},{begin:"::("+o.join("|")+")"}]},{ -className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{begin:":",end:"[;}]", -contains:[a.HEXCOLOR,a.IMPORTANT,n.CSS_NUMBER_MODE,...l,{ -begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" -},contains:[{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}] -},{className:"built_in",begin:/[\w-]+(?=\()/}]},{ -begin:(s=/@/,((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(?=",s,")")), -end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword", -begin:/@-?\w[\w]*(-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0, -relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only", -attribute:t.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute" -},...l,n.CSS_NUMBER_MODE]}]},{className:"selector-tag", -begin:"\\b("+e.join("|")+")\\b"}]};var s}})()); -hljs.registerLanguage("diff",(()=>{"use strict";return e=>({name:"Diff", -aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{ -begin:/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{ -begin:/^--- +\d+,\d+ +----$/}]},{className:"comment",variants:[{begin:/Index: /, -end:/$/},{begin:/^index/,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^-{3}/,end:/$/ -},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/},{ -begin:/^diff --git/,end:/$/}]},{className:"addition",begin:/^\+/,end:/$/},{ -className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, -end:/$/}]})})()); -hljs.registerLanguage("go",(()=>{"use strict";return e=>{const n={ -keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune", -literal:"true false iota nil", -built_in:"append cap close complex copy imag len make new panic print println real recover delete" -};return{name:"Go",aliases:["golang"],keywords:n,illegal:"{"use strict";function e(...e){ -return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n -})).join("")}return n=>{const a="HTTP/(2|1\\.[01])",s={className:"attribute", -begin:e("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{ -className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]} -},t=[s,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{ -name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+a+" \\d{3})", -end:/$/,contains:[{className:"meta",begin:a},{className:"number", -begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:t}},{ -begin:"(?=^[A-Z]+ (.*?) "+a+"$)",end:/$/,contains:[{className:"string", -begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:a},{ -className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:t} -},n.inherit(s,{relevance:0})]}}})()); -hljs.registerLanguage("ini",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(...n){ -return n.map((n=>e(n))).join("")}return s=>{const a={className:"number", -relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{begin:s.NUMBER_RE}] -},i=s.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];const t={ -className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)\}/ -}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={ -className:"string",contains:[s.BACKSLASH_ESCAPE],variants:[{begin:"'''", -end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"' -},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,a,"self"], -relevance:0 -},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map((n=>e(n))).join("|")+")" -;return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, -contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{ -begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr", -starts:{end:/$/,contains:[i,c,r,t,l,a]}}]}}})()); -hljs.registerLanguage("java",(()=>{"use strict" -;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ -className:"number",variants:[{ -begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` -},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ -begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ -begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` -},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ -begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], -relevance:0};return e=>{ -var n="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s={ -className:"meta",begin:"@[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*", -contains:[{begin:/\(/,end:/\)/,contains:["self"]}]};const r=a;return{ -name:"Java",aliases:["jsp"],keywords:n,illegal:/<\/|#/, -contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, -relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ -begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ -className:"class",beginKeywords:"class interface enum",end:/[{;=]/, -excludeEnd:!0,relevance:1,keywords:"class interface enum",illegal:/[:"\[\]]/, -contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ -beginKeywords:"new throw return else",relevance:0},{className:"class", -begin:"record\\s+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,excludeEnd:!0, -end:/[{;=]/,keywords:n,contains:[{beginKeywords:"record"},{ -begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, -contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, -keywords:n,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE] -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"function", -begin:"([\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(<[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(\\s*,\\s*[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(", -returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:n,contains:[{ -begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, -contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/, -keywords:n,relevance:0, -contains:[s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,r,e.C_BLOCK_COMMENT_MODE] -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},r,s]}}})()); -hljs.registerLanguage("javascript",(()=>{"use strict" -;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) -;function r(e){return t("(?=",e,")")}function t(...e){return e.map((e=>{ -return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return i=>{ -const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/, -isTrulyOpeningTag:(e,n)=>{const a=e[0].length+e.index,s=e.input[a] -;"<"!==s?">"===s&&(((e,{after:n})=>{const a="", -returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{ -begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0 -},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:f}]}] -},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{ -variants:[{begin:"<>",end:""},{begin:o.begin,"on:begin":o.isTrulyOpeningTag, -end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0, -contains:["self"]}]}],relevance:0},{className:"function", -beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l, -contains:["self",i.inherit(i.TITLE_MODE,{begin:c}),p],illegal:/%/},{ -beginKeywords:"while if switch catch for"},{className:"function", -begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", -returnBegin:!0,contains:[p,i.inherit(i.TITLE_MODE,{begin:c})]},{variants:[{ -begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class", -beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{ -beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/, -end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:c}),"self",p] -},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set", -contains:[i.inherit(i.TITLE_MODE,{begin:c}),{begin:/\(\)/},p]},{begin:/\$[(.]/}] -}}})()); -hljs.registerLanguage("json",(()=>{"use strict";return n=>{const e={ -literal:"true false null" -},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],a=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],l={ -end:",",endsWithParent:!0,excludeEnd:!0,contains:a,keywords:e},t={begin:/\{/, -end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/, -contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(l,{begin:/:/ -})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(l)], -illegal:"\\S"};return a.push(t,s),i.forEach((n=>{a.push(n)})),{name:"JSON", -contains:a,keywords:e,illegal:"\\S"}}})()); -hljs.registerLanguage("kotlin",(()=>{"use strict" -;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={ -className:"number",variants:[{ -begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` -},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ -begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ -begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` -},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ -begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], -relevance:0};return e=>{const n={ -keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", -built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", -literal:"true false null"},i={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" -},s={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},t={ -className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", -variants:[{begin:'"""',end:'"""(?=[^"])',contains:[t,s]},{begin:"'",end:"'", -illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, -contains:[e.BACKSLASH_ESCAPE,t,s]}]};s.contains.push(r);const l={ -className:"meta", -begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" -},c={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, -end:/\)/,contains:[e.inherit(r,{className:"meta-string"})]}] -},o=a,b=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),E={ -variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, -contains:[]}]},d=E;return d.variants[1].contains=[E],E.variants[1].contains=[d], -{name:"Kotlin",aliases:["kt","kts"],keywords:n, -contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", -begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,b,{className:"keyword", -begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", -begin:/@\w+/}]}},i,l,c,{className:"function",beginKeywords:"fun",end:"[(]|$", -returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ -begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, -contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, -keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, -endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, -endsWithParent:!0,contains:[E,e.C_LINE_COMMENT_MODE,b],relevance:0 -},e.C_LINE_COMMENT_MODE,b,l,c,r,e.C_NUMBER_MODE]},b]},{className:"class", -beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, -illegal:"extends implements",contains:[{ -beginKeywords:"public protected internal private constructor" -},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, -excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/, -excludeBegin:!0,returnEnd:!0},l,c]},r,{className:"meta",begin:"^#!/usr/bin/env", -end:"$",illegal:"\n"},o]}}})()); -hljs.registerLanguage("less",(()=>{"use strict" -;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],n=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse(),r=i.concat(o) -;return a=>{const s=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, -HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, -ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, -illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} -}))(a),l=r,d="([\\w-]+|@\\{[\\w-]+\\})",c=[],g=[],b=e=>({className:"string", -begin:"~?"+e+".*?"+e}),m=(e,t,i)=>({className:e,begin:t,relevance:i}),u={ -$pattern:/[a-z-]+/,keyword:"and or not only",attribute:t.join(" ")},p={ -begin:"\\(",end:"\\)",contains:g,keywords:u,relevance:0} -;g.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,b("'"),b('"'),a.CSS_NUMBER_MODE,{ -begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", -excludeEnd:!0} -},s.HEXCOLOR,p,m("variable","@@?[\\w-]+",10),m("variable","@\\{[\\w-]+\\}"),m("built_in","~?`[^`]*?`"),{ -className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0 -},s.IMPORTANT);const f=g.concat({begin:/\{/,end:/\}/,contains:c}),h={ -beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not" -}].concat(g)},w={begin:d+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0, -contains:[{begin:/-(webkit|moz|ms|o)-/},{className:"attribute", -begin:"\\b("+n.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0, -illegal:"[<=$]",relevance:0,contains:g}}]},v={className:"keyword", -begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", -starts:{end:"[;{}]",keywords:u,returnEnd:!0,contains:g,relevance:0}},y={ -className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{ -begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:f}},k={variants:[{ -begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:d,end:/\{/}],returnBegin:!0, -returnEnd:!0,illegal:"[<='$\"]",relevance:0, -contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,h,m("keyword","all\\b"),m("variable","@\\{[\\w-]+\\}"),{ -begin:"\\b("+e.join("|")+")\\b",className:"selector-tag" -},m("selector-tag",d+"%?",0),m("selector-id","#"+d),m("selector-class","\\."+d,0),m("selector-tag","&",0),s.ATTRIBUTE_SELECTOR_MODE,{ -className:"selector-pseudo",begin:":("+i.join("|")+")"},{ -className:"selector-pseudo",begin:"::("+o.join("|")+")"},{begin:"\\(",end:"\\)", -contains:f},{begin:"!important"}]},E={begin:`[\\w-]+:(:)?(${l.join("|")})`, -returnBegin:!0,contains:[k]} -;return c.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,v,y,E,w,k),{ -name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:c}}})()); -hljs.registerLanguage("lua",(()=>{"use strict";return e=>{ -const t="\\[=*\\[",a="\\]=*\\]",n={begin:t,end:a,contains:["self"] -},o=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[",a,{contains:[n], -relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, -literal:"true false nil", -keyword:"and break do else elseif end for goto if in local not or repeat return then until while", -built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" -},contains:o.concat([{className:"function",beginKeywords:"function",end:"\\)", -contains:[e.inherit(e.TITLE_MODE,{ -begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", -begin:"\\(",endsWithParent:!0,contains:o}].concat(o) -},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", -begin:t,end:a,contains:[n],relevance:5}])}}})()); -hljs.registerLanguage("makefile",(()=>{"use strict";return e=>{const i={ -className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", -contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} -function a(...n){return n.map((n=>e(n))).join("")}function s(...n){ -return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ -const t=a(/[A-Z_]/,a("(",/[A-Z0-9_.-]*:/,")?"),/[A-Z0-9_.-]*/),i={ -className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},r={begin:/\s/, -contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] -},c=e.inherit(r,{begin:/\(/,end:/\)/}),l=e.inherit(e.APOS_STRING_MODE,{ -className:"meta-string"}),g=e.inherit(e.QUOTE_STRING_MODE,{ -className:"meta-string"}),m={endsWithParent:!0,illegal:/`]+/}]}] -}]};return{name:"HTML, XML", -aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], -case_insensitive:!0,contains:[{className:"meta",begin://, -relevance:10,contains:[r,g,l,c,{begin:/\[/,end:/\]/,contains:[{className:"meta", -begin://,contains:[r,c,g,l]}]}]},e.COMMENT(//,{ -relevance:10}),{begin://,relevance:10},i,{ -className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag", -begin:/)/,end:/>/,keywords:{name:"style"},contains:[m],starts:{ -end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", -begin:/)/,end:/>/,keywords:{name:"script"},contains:[m],starts:{ -end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ -className:"tag",begin:/<>|<\/>/},{className:"tag", -begin:a(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name", -begin:t,relevance:0,starts:m}]},{className:"tag",begin:a(/<\//,n(a(t,/>/))), -contains:[{className:"name",begin:t,relevance:0},{begin:/>/,relevance:0, -endsParent:!0}]}]}}})()); -hljs.registerLanguage("markdown",(()=>{"use strict";function n(...n){ -return n.map((n=>{return(e=n)?"string"==typeof e?e:e.source:null;var e -})).join("")}return e=>{const a={begin:/<\/?[A-Za-z_]/,end:">", -subLanguage:"xml",relevance:0},i={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0 -},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, -relevance:2},{begin:n(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), -relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ -begin:/\[.+?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{ -className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, -returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", -excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", -end:"\\]",excludeBegin:!0,excludeEnd:!0}]},s={className:"strong",contains:[], -variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},c={ -className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{ -begin:/_(?!_)/,end:/_/,relevance:0}]};s.contains.push(c),c.contains.push(s) -;let t=[a,i] -;return s.contains=s.contains.concat(t),c.contains=c.contains.concat(t), -t=t.concat(s,c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ -className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:t},{ -begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", -contains:t}]}]},a,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", -end:"\\s+",excludeEnd:!0},s,c,{className:"quote",begin:"^>\\s+",contains:t, -end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ -begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ -begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", -contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ -begin:"^[-\\*]{3,}",end:"$"},i,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ -className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ -className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})()); -hljs.registerLanguage("nginx",(()=>{"use strict";return e=>{const n={ -className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/\}/},{ -begin:/[$@]/+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{ -$pattern:"[a-z/_]+", -literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll" -},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string", -contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/ -}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n] -},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^", -end:"\\s|\\{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|\\{|;",returnEnd:!0},{ -begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number", -begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{ -className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{ -name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{ -begin:e.UNDERSCORE_IDENT_RE+"\\s+\\{",returnBegin:!0,end:/\{/,contains:[{ -className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{ -begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|\\{",returnBegin:!0,contains:[{ -className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}], -illegal:"[^\\s\\}]"}}})()); -hljs.registerLanguage("objectivec",(()=>{"use strict";return e=>{ -const n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n, -keyword:"@interface @class @protocol @implementation"};return{ -name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], -keywords:{$pattern:n, -keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN", -literal:"false true FALSE TRUE nil YES NO NULL", -built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once" -},illegal:"/,end:/$/, -illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ -className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:/(\{|$)/, -excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{ -begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}})()); -hljs.registerLanguage("perl",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(...n){ -return n.map((n=>e(n))).join("")}function t(...n){ -return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ -const r=/[dualxmsipngr]{0,12}/,s={$pattern:/[\w.]+/, -keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" -},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:s},a={begin:/->\{/, -end:/\}/},o={variants:[{begin:/\$\d/},{ -begin:n(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])") -},{begin:/[$%@][^\s\w{]/,relevance:0}] -},c=[e.BACKSLASH_ESCAPE,i,o],g=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],l=(e,t,s="\\1")=>{ -const i="\\1"===s?s:n(s,t) -;return n(n("(?:",e,")"),t,/(?:\\.|[^\\\/])*?/,i,/(?:\\.|[^\\\/])*?/,s,r) -},d=(e,t,s)=>n(n("(?:",e,")"),t,/(?:\\.|[^\\\/])*?/,s,r),p=[o,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{ -endsWithParent:!0}),a,{className:"string",contains:c,variants:[{ -begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[", -end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{ -begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">", -relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'", -contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`", -contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{ -begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number", -begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b", -relevance:0},{ -begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*", -keywords:"split return print reverse grep",relevance:0, -contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{ -begin:l("s|tr|y",t(...g))},{begin:l("s|tr|y","\\(","\\)")},{ -begin:l("s|tr|y","\\[","\\]")},{begin:l("s|tr|y","\\{","\\}")}],relevance:2},{ -className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{ -begin:d("(?:m|qr)?",/\//,/\//)},{begin:d("m|qr",t(...g),/\1/)},{ -begin:d("m|qr",/\(/,/\)/)},{begin:d("m|qr",/\[/,/\]/)},{ -begin:d("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub", -end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{ -begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$", -subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}] -}];return i.contains=p,a.contains=p,{name:"Perl",aliases:["pl","pm"],keywords:s, -contains:p}}})()); -hljs.registerLanguage("php",(()=>{"use strict";return e=>{const r={ -className:"variable", -begin:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?![A-Za-z0-9])(?![$])"},t={ -className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{ -begin:/\?>/}]},a={className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/, -end:/\}/}]},n=e.inherit(e.APOS_STRING_MODE,{illegal:null -}),i=e.inherit(e.QUOTE_STRING_MODE,{illegal:null, -contains:e.QUOTE_STRING_MODE.contains.concat(a)}),o=e.END_SAME_AS_BEGIN({ -begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/, -contains:e.QUOTE_STRING_MODE.contains.concat(a)}),l={className:"string", -contains:[e.BACKSLASH_ESCAPE,t],variants:[e.inherit(n,{begin:"b'",end:"'" -}),e.inherit(i,{begin:'b"',end:'"'}),i,n,o]},s={className:"number",variants:[{ -begin:"\\b0b[01]+(?:_[01]+)*\\b"},{begin:"\\b0o[0-7]+(?:_[0-7]+)*\\b"},{ -begin:"\\b0x[\\da-f]+(?:_[\\da-f]+)*\\b"},{ -begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:e[+-]?\\d+)?" -}],relevance:0},c={ -keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile enum eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list match|0 mixed new object or private protected public real return string switch throw trait try unset use var void while xor yield", -literal:"false null true", -built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException UnhandledMatchError ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Stringable Throwable Traversable WeakReference WeakMap Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass" -};return{aliases:["php3","php4","php5","php6","php7","php8"], -case_insensitive:!0,keywords:c, -contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t] -}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}] -}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0, -keywords:"__halt_compiler"}),t,{className:"keyword",begin:/\$this\b/},r,{ -begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function", -relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0, -illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{ -begin:"=>",endsParent:!0},{className:"params",begin:"\\(",end:"\\)", -excludeBegin:!0,excludeEnd:!0,keywords:c, -contains:["self",r,e.C_BLOCK_COMMENT_MODE,l,s]}]},{className:"class",variants:[{ -beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", -illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ -beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ -beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, -contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",relevance:0,end:";", -contains:[e.UNDERSCORE_TITLE_MODE]},l,s]}}})()); -hljs.registerLanguage("php-template",(()=>{"use strict";return n=>({ -name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/, -subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"', -end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{ -illegal:null,className:null,contains:null,skip:!0 -}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null, -skip:!0})]}]})})()); -hljs.registerLanguage("plaintext",(()=>{"use strict";return t=>({ -name:"Plain text",aliases:["text","txt"],disableAutodetect:!0})})()); -hljs.registerLanguage("properties",(()=>{"use strict";return e=>{ -var n="[ \\t\\f]*",a=n+"[:=]"+n,t="("+a+"|[ \\t\\f]+)",r="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",s="([^\\\\:= \\t\\f\\n]|\\\\.)+",i={ -end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{ -begin:"\\\\\\\\"},{begin:"\\\\\\n"}]}};return{name:".properties", -case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{ -returnBegin:!0,variants:[{begin:r+a,relevance:1},{begin:r+"[ \\t\\f]+", -relevance:0}],contains:[{className:"attr",begin:r,endsParent:!0,relevance:0}], -starts:i},{begin:s+t,returnBegin:!0,relevance:0,contains:[{className:"meta", -begin:s,endsParent:!0,relevance:0}],starts:i},{className:"attr",relevance:0, -begin:s+n+"$"}]}}})()); -hljs.registerLanguage("python",(()=>{"use strict";return e=>{const n={ -$pattern:/[A-Za-z]\w+|__\w+__/, -keyword:["and","as","assert","async","await","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"], -built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], -literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], -type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] -},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/, -end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},t={ -className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ -begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, -contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{ -begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, -contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{ -begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, -contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, -end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/([uU]|[rR])'/,end:/'/, -relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ -begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, -end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, -contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, -contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] -},r="[0-9](_?[0-9])*",l=`(\\b(${r}))?\\.(${r})|\\b(${r})\\.`,b={ -className:"number",relevance:0,variants:[{ -begin:`(\\b(${r})|(${l}))[eE][+-]?(${r})[jJ]?\\b`},{begin:`(${l})[jJ]?`},{ -begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?\\b"},{ -begin:"\\b0[bB](_?[01])+[lL]?\\b"},{begin:"\\b0[oO](_?[0-7])+[lL]?\\b"},{ -begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?\\b"},{begin:`\\b(${r})[jJ]\\b`}]},o={ -className:"comment", -begin:(d=/# type:/,((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(?=",d,")")), -end:/$/,keywords:n,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/, -endsWithParent:!0}]},c={className:"params",variants:[{className:"", -begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0, -keywords:n,contains:["self",a,b,t,e.HASH_COMMENT_MODE]}]};var d -;return i.contains=[t,b,a],{name:"Python",aliases:["py","gyp","ipython"], -keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,b,{begin:/\bself\b/},{ -beginKeywords:"if",relevance:0},t,o,e.HASH_COMMENT_MODE,{variants:[{ -className:"function",beginKeywords:"def"},{className:"class", -beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/, -contains:[e.UNDERSCORE_TITLE_MODE,c,{begin:/->/,endsWithParent:!0,keywords:n}] -},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[b,c,t]}]}}})()); -hljs.registerLanguage("python-repl",(()=>{"use strict";return s=>({ -aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$", -subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{ -begin:/^\.\.\.(?=[ ]|$)/}]}]})})()); -hljs.registerLanguage("r",(()=>{"use strict";function e(...e){return e.map((e=>{ -return(a=e)?"string"==typeof a?a:a.source:null;var a})).join("")}return a=>{ -const n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/;return{name:"R", -illegal:/->/,keywords:{$pattern:n, -keyword:"function if in break next repeat else for while", -literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", -built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" -},compilerExtensions:[(a,n)=>{if(!a.beforeMatch)return -;if(a.starts)throw Error("beforeMatch cannot be used with starts") -;const i=Object.assign({},a);Object.keys(a).forEach((e=>{delete a[e] -})),a.begin=e(i.beforeMatch,e("(?=",i.begin,")")),a.starts={relevance:0, -contains:[Object.assign(i,{endsParent:!0})]},a.relevance=0,delete i.beforeMatch -}],contains:[a.COMMENT(/#'/,/$/,{contains:[{className:"doctag", -begin:"@examples",starts:{contains:[{begin:/\n/},{begin:/#'\s*(?=@[a-zA-Z]+)/, -endsParent:!0},{begin:/#'/,end:/$/,excludeBegin:!0}]}},{className:"doctag", -begin:"@param",end:/$/,contains:[{className:"variable",variants:[{begin:n},{ -begin:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{className:"doctag", -begin:/@[a-zA-Z]+/},{className:"meta-keyword",begin:/\\[a-zA-Z]+/}] -}),a.HASH_COMMENT_MODE,{className:"string",contains:[a.BACKSLASH_ESCAPE], -variants:[a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', -relevance:0},{begin:"'",end:"'",relevance:0}]},{className:"number",relevance:0, -beforeMatch:/([^a-zA-Z0-9._])/,variants:[{ -match:/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/},{ -match:/0[xX][0-9a-fA-F]+([pP][+-]?\d+)?[Li]?/},{ -match:/(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?[Li]?/}]},{begin:"%",end:"%"},{ -begin:e(/[a-zA-Z][a-zA-Z_0-9]*/,"\\s+<-\\s+")},{begin:"`",end:"`",contains:[{ -begin:/\\./}]}]}}})()); -hljs.registerLanguage("ruby",(()=>{"use strict";function e(...e){ -return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n -})).join("")}return n=>{ -const a="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",i={ -keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor __FILE__", -built_in:"proc lambda",literal:"true false nil"},s={className:"doctag", -begin:"@[A-Za-z]+"},r={begin:"#<",end:">"},b=[n.COMMENT("#","$",{contains:[s] -}),n.COMMENT("^=begin","^=end",{contains:[s],relevance:10 -}),n.COMMENT("^__END__","\\n$")],c={className:"subst",begin:/#\{/,end:/\}/, -keywords:i},t={className:"string",contains:[n.BACKSLASH_ESCAPE,c],variants:[{ -begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/, -end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{ -begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/, -end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{ -begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{ -begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ -begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ -begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ -begin:/<<[-~]?'?(\w+)\n(?:[^\n]*\n)*?\s*\1\b/,returnBegin:!0,contains:[{ -begin:/<<[-~]?'?/},n.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, -contains:[n.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",d={className:"number", -relevance:0,variants:[{ -begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ -begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" -},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ -begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ -begin:"\\b0(_?[0-7])+r?i?\\b"}]},l={className:"params",begin:"\\(",end:"\\)", -endsParent:!0,keywords:i},o=[t,{className:"class",beginKeywords:"class module", -end:"$|;",illegal:/=/,contains:[n.inherit(n.TITLE_MODE,{ -begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|!)?"}),{begin:"<\\s*",contains:[{ -begin:"("+n.IDENT_RE+"::)?"+n.IDENT_RE,relevance:0}]}].concat(b)},{ -className:"function",begin:e(/def\s+/,(_=a+"\\s*(\\(|;|$)",e("(?=",_,")"))), -relevance:0,keywords:"def",end:"$|;",contains:[n.inherit(n.TITLE_MODE,{begin:a -}),l].concat(b)},{begin:n.IDENT_RE+"::"},{className:"symbol", -begin:n.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", -begin:":(?!\\s)",contains:[t,{begin:a}],relevance:0},d,{className:"variable", -begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ -className:"params",begin:/\|/,end:/\|/,relevance:0,keywords:i},{ -begin:"("+n.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{ -className:"regexp",contains:[n.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{ -begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(", -end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}] -}].concat(r,b),relevance:0}].concat(r,b);var _;c.contains=o,l.contains=o -;const E=[{begin:/^\s*=>/,starts:{end:"$",contains:o}},{className:"meta", -begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", -starts:{end:"$",contains:o}}];return b.unshift(r),{name:"Ruby", -aliases:["rb","gemspec","podspec","thor","irb"],keywords:i,illegal:/\/\*/, -contains:[n.SHEBANG({binary:"ruby"})].concat(E).concat(b).concat(o)}}})()); -hljs.registerLanguage("rust",(()=>{"use strict";return e=>{ -const n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!" -;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?", -keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield", -literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}})()); -hljs.registerLanguage("scss",(()=>{"use strict" -;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],r=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() -;return a=>{const n=(e=>({IMPORTANT:{className:"meta",begin:"!important"}, -HEXCOLOR:{className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, -ATTRIBUTE_SELECTOR_MODE:{className:"selector-attr",begin:/\[/,end:/\]/, -illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]} -}))(a),l=o,s=i,d="@[a-z-]+",c={className:"variable", -begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"};return{name:"SCSS",case_insensitive:!0, -illegal:"[=/|']",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{ -className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ -className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 -},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", -begin:"\\b("+e.join("|")+")\\b",relevance:0},{className:"selector-pseudo", -begin:":("+s.join("|")+")"},{className:"selector-pseudo", -begin:"::("+l.join("|")+")"},c,{begin:/\(/,end:/\)/,contains:[a.CSS_NUMBER_MODE] -},{className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{ -begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" -},{begin:":",end:";", -contains:[c,n.HEXCOLOR,a.CSS_NUMBER_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,n.IMPORTANT] -},{begin:"@(page|font-face)",lexemes:d,keywords:"@page @font-face"},{begin:"@", -end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, -keyword:"and or not only",attribute:t.join(" ")},contains:[{begin:d, -className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" -},c,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,n.HEXCOLOR,a.CSS_NUMBER_MODE]}]}} -})()); -hljs.registerLanguage("shell",(()=>{"use strict";return s=>({ -name:"Shell Session",aliases:["console"],contains:[{className:"meta", -begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#]/,starts:{end:/[^\\](?=\s*$)/, -subLanguage:"bash"}}]})})()); -hljs.registerLanguage("sql",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function r(...r){ -return r.map((r=>e(r))).join("")}function t(...r){ -return"("+r.map((r=>e(r))).join("|")+")"}return e=>{ -const n=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],s=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],o=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],c=s,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update ","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!s.includes(e))),u={ -begin:r(/\b/,t(...c),/\s*\(/),keywords:{built_in:c}};return{name:"SQL", -case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/, -keyword:((e,{exceptions:r,when:t}={})=>{const n=t -;return r=r||[],e.map((e=>e.match(/\|\d+$/)||r.includes(e)?e:n(e)?e+"|0":e)) -})(l,{when:e=>e.length<3}),literal:a,type:i, -built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] -},contains:[{begin:t(...o),keywords:{$pattern:/[\w\.]+/,keyword:l.concat(o), -literal:a,type:i}},{className:"type", -begin:t("double precision","large object","with timezone","without timezone") -},u,{className:"variable",begin:/@[a-z0-9]+/},{className:"string",variants:[{ -begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/,contains:[{ -begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,n,{className:"operator", -begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}})()); -hljs.registerLanguage("swift",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} -function a(...n){return n.map((n=>e(n))).join("")}function t(...n){ -return"("+n.map((n=>e(n))).join("|")+")"} -const i=e=>a(/\b/,e,/\w$/.test(e)?/\b/:/\B/),s=["Protocol","Type"].map(i),u=["init","self"].map(i),c=["Any","Self"],r=["associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],o=["false","nil","true"],l=["assignment","associativity","higherThan","left","lowerThan","none","right"],m=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],d=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],p=t(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),F=t(p,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),b=a(p,F,"*"),h=t(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),f=t(h,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),w=a(h,f,"*"),y=a(/[A-Z]/,f,"*"),g=["autoclosure",a(/convention\(/,t("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",a(/objc\(/,w,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","testable","UIApplicationMain","unknown","usableFromInline"],E=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] -;return e=>{const p={match:/\s+/,relevance:0},h=e.COMMENT("/\\*","\\*/",{ -contains:["self"]}),v=[e.C_LINE_COMMENT_MODE,h],N={className:"keyword", -begin:a(/\./,n(t(...s,...u))),end:t(...s,...u),excludeBegin:!0},A={ -match:a(/\./,t(...r)),relevance:0 -},C=r.filter((e=>"string"==typeof e)).concat(["_|0"]),_={variants:[{ -className:"keyword", -match:t(...r.filter((e=>"string"!=typeof e)).concat(c).map(i),...u)}]},D={ -$pattern:t(/\b\w+/,/#\w+/),keyword:C.concat(m),literal:o},B=[N,A,_],k=[{ -match:a(/\./,t(...d)),relevance:0},{className:"built_in", -match:a(/\b/,t(...d),/(?=\()/)}],M={match:/->/,relevance:0},S=[M,{ -className:"operator",relevance:0,variants:[{match:b},{match:`\\.(\\.|${F})+`}] -}],x="([0-9a-fA-F]_*)+",I={className:"number",relevance:0,variants:[{ -match:"\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b"},{ -match:`\\b0x(${x})(\\.(${x}))?([pP][+-]?(([0-9]_*)+))?\\b`},{ -match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},O=(e="")=>({ -className:"subst",variants:[{match:a(/\\/,e,/[0\\tnr"']/)},{ -match:a(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}]}),T=(e="")=>({className:"subst", -match:a(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),L=(e="")=>({className:"subst", -label:"interpol",begin:a(/\\/,e,/\(/),end:/\)/}),P=(e="")=>({begin:a(e,/"""/), -end:a(/"""/,e),contains:[O(e),T(e),L(e)]}),$=(e="")=>({begin:a(e,/"/), -end:a(/"/,e),contains:[O(e),L(e)]}),K={className:"string", -variants:[P(),P("#"),P("##"),P("###"),$(),$("#"),$("##"),$("###")]},j={ -match:a(/`/,w,/`/)},z=[j,{className:"variable",match:/\$\d+/},{ -className:"variable",match:`\\$${f}+`}],q=[{match:/(@|#)available/, -className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:E, -contains:[...S,I,K]}]}},{className:"keyword",match:a(/@/,t(...g))},{ -className:"meta",match:a(/@/,w)}],U={match:n(/\b[A-Z]/),relevance:0,contains:[{ -className:"type", -match:a(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,f,"+") -},{className:"type",match:y,relevance:0},{match:/[?!]+/,relevance:0},{ -match:/\.\.\./,relevance:0},{match:a(/\s+&\s+/,n(y)),relevance:0}]},Z={ -begin://,keywords:D,contains:[...v,...B,...q,M,U]};U.contains.push(Z) -;const G={begin:/\(/,end:/\)/,relevance:0,keywords:D,contains:["self",{ -match:a(w,/\s*:/),keywords:"_|0",relevance:0 -},...v,...B,...k,...S,I,K,...z,...q,U]},H={beginKeywords:"func",contains:[{ -className:"title",match:t(j.match,w,b),endsParent:!0,relevance:0},p]},R={ -begin://,contains:[...v,U]},V={begin:/\(/,end:/\)/,keywords:D, -contains:[{begin:t(n(a(w,/\s*:/)),n(a(w,/\s+/,w,/\s*:/))),end:/:/,relevance:0, -contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:w}] -},...v,...B,...S,I,K,...q,U,G],endsParent:!0,illegal:/["']/},W={ -className:"function",match:n(/\bfunc\b/),contains:[H,R,V,p],illegal:[/\[/,/%/] -},X={className:"function",match:/\b(subscript|init[?!]?)\s*(?=[<(])/,keywords:{ -keyword:"subscript init init? init!",$pattern:/\w+[?!]?/},contains:[R,V,p], -illegal:/\[|%/},J={beginKeywords:"operator",end:e.MATCH_NOTHING_RE,contains:[{ -className:"title",match:b,endsParent:!0,relevance:0}]},Q={ -beginKeywords:"precedencegroup",end:e.MATCH_NOTHING_RE,contains:[{ -className:"title",match:y,relevance:0},{begin:/{/,end:/}/,relevance:0, -endsParent:!0,keywords:[...l,...o],contains:[U]}]};for(const e of K.variants){ -const n=e.contains.find((e=>"interpol"===e.label));n.keywords=D -;const a=[...B,...k,...S,I,K,...z];n.contains=[...a,{begin:/\(/,end:/\)/, -contains:["self",...a]}]}return{name:"Swift",keywords:D,contains:[...v,W,X,{ -className:"class",beginKeywords:"struct protocol class extension enum", -end:"\\{",excludeEnd:!0,keywords:D,contains:[e.inherit(e.TITLE_MODE,{ -begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...B]},J,Q,{ -beginKeywords:"import",end:/$/,contains:[...v],relevance:0 -},...B,...k,...S,I,K,...z,...q,U,G]}}})()); -hljs.registerLanguage("typescript",(()=>{"use strict" -;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]) -;function t(e){return r("(?=",e,")")}function r(...e){return e.map((e=>{ -return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return i=>{ -const c={$pattern:e, -keyword:n.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]), -literal:a, -built_in:s.concat(["any","void","number","boolean","string","object","never","enum"]) -},o={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},l=(e,n,a)=>{ -const s=e.contains.findIndex((e=>e.label===n)) -;if(-1===s)throw Error("can not find mode to replace");e.contains.splice(s,1,a) -},b=(i=>{const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/, -end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ -const a=e[0].length+e.index,s=e.input[a];"<"!==s?">"===s&&(((e,{after:n})=>{ -const a="", -returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{ -begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0 -},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:f}]}] -},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{ -variants:[{begin:"<>",end:""},{begin:o.begin,"on:begin":o.isTrulyOpeningTag, -end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0, -contains:["self"]}]}],relevance:0},{className:"function", -beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l, -contains:["self",i.inherit(i.TITLE_MODE,{begin:c}),A],illegal:/%/},{ -beginKeywords:"while if switch catch for"},{className:"function", -begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", -returnBegin:!0,contains:[A,i.inherit(i.TITLE_MODE,{begin:c})]},{variants:[{ -begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class", -beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{ -beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/, -end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:c}),"self",A] -},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set", -contains:[i.inherit(i.TITLE_MODE,{begin:c}),{begin:/\(\)/},A]},{begin:/\$[(.]/}] -}})(i) -;return Object.assign(b.keywords,c),b.exports.PARAMS_CONTAINS.push(o),b.contains=b.contains.concat([o,{ -beginKeywords:"namespace",end:/\{/,excludeEnd:!0},{beginKeywords:"interface", -end:/\{/,excludeEnd:!0,keywords:"interface extends" -}]),l(b,"shebang",i.SHEBANG()),l(b,"use_strict",{className:"meta",relevance:10, -begin:/^\s*['"]use strict['"]/ -}),b.contains.find((e=>"function"===e.className)).relevance=0,Object.assign(b,{ -name:"TypeScript",aliases:["ts","tsx"]}),b}})()); -hljs.registerLanguage("vbnet",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(...n){ -return n.map((n=>e(n))).join("")}function t(...n){ -return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ -const a=/\d{1,2}\/\d{1,2}\/\d{4}/,i=/\d{4}-\d{1,2}-\d{1,2}/,s=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,o={ -className:"literal",variants:[{begin:n(/# */,t(i,a),/ *#/)},{ -begin:n(/# */,r,/ *#/)},{begin:n(/# */,s,/ *#/)},{ -begin:n(/# */,t(i,a),/ +/,t(s,r),/ *#/)}]},l=e.COMMENT(/'''/,/$/,{contains:[{ -className:"doctag",begin:/<\/?/,end:/>/}]}),c=e.COMMENT(null,/$/,{variants:[{ -begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]});return{name:"Visual Basic .NET", -aliases:["vb"],case_insensitive:!0,classNameAliases:{label:"symbol"},keywords:{ -keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", -built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", -type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", -literal:"true false nothing"}, -illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{ -className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/, -end:/"/,illegal:/\n/,contains:[{begin:/""/}]},o,{className:"number",relevance:0, -variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ -},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{ -begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{ -className:"label",begin:/^\w+:/},l,c,{className:"meta", -begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, -end:/$/,keywords:{ -"meta-keyword":"const disable else elseif enable end externalsource if region then" -},contains:[c]}]}}})()); -hljs.registerLanguage("yaml",(()=>{"use strict";return e=>{ -var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*'()[\\]]+",s={ -className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ -},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", -variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(s,{ -variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={ -end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},t={begin:/\{/, -end:/\}/,contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]", -contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{ -begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ -begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", -relevance:10},{className:"string", -begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ -begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, -relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type", -begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a -},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", -begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", -relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ -className:"number", -begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" -},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},t,g,s],r=[...b] -;return r.pop(),r.push(i),l.contains=r,{name:"YAML",case_insensitive:!0, -aliases:["yml"],contains:b}}})()); \ No newline at end of file diff --git a/htmlReport/js/highlightjs-line-numbers.min.js b/htmlReport/js/highlightjs-line-numbers.min.js deleted file mode 100644 index 8548576704..0000000000 --- a/htmlReport/js/highlightjs-line-numbers.min.js +++ /dev/null @@ -1,24 +0,0 @@ -/* -The MIT License (MIT) - -Copyright (c) 2017 Yauheni Pakala - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - */ -!function(r,o){"use strict";var e,i="hljs-ln",l="hljs-ln-line",h="hljs-ln-code",s="hljs-ln-numbers",c="hljs-ln-n",m="data-line-number",a=/\r\n|\r|\n/g;function u(e){for(var n=e.toString(),t=e.anchorNode;"TD"!==t.nodeName;)t=t.parentNode;for(var r=e.focusNode;"TD"!==r.nodeName;)r=r.parentNode;var o=parseInt(t.dataset.lineNumber),a=parseInt(r.dataset.lineNumber);if(o==a)return n;var i,l=t.textContent,s=r.textContent;for(a
    {6}',[l,s,c,m,h,o+n.startFrom,0{1}',[i,r])}return e}(e.innerHTML,o)}function v(e){var n=e.className;if(/hljs-/.test(n)){for(var t=g(e.innerHTML),r=0,o="";r{1}
    \n',[n,0 - - - Coverage Report > bagpacker - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    -
    - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_BLOCK.html b/htmlReport/ns-1/index_SORT_BY_BLOCK.html deleted file mode 100644 index 37d37ba903..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_BLOCK.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    -
    - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html deleted file mode 100644 index f71e0a68a4..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_BLOCK_DESC.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    -
    - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_CLASS.html b/htmlReport/ns-1/index_SORT_BY_CLASS.html deleted file mode 100644 index 69d025ba89..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_CLASS.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    -
    - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html deleted file mode 100644 index 5dce98cf7f..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_CLASS_DESC.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    -
    - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_LINE.html b/htmlReport/ns-1/index_SORT_BY_LINE.html deleted file mode 100644 index 8fcc2c0ab4..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_LINE.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    -
    - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html deleted file mode 100644 index 2590d16f48..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_LINE_DESC.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    -
    - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_METHOD.html b/htmlReport/ns-1/index_SORT_BY_METHOD.html deleted file mode 100644 index 81073be476..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_METHOD.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    -
    - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html deleted file mode 100644 index 05509590a8..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_METHOD_DESC.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    -
    - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html deleted file mode 100644 index 288d78acd5..0000000000 --- a/htmlReport/ns-1/index_SORT_BY_NAME_DESC.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Coverage Report > bagpacker - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    -
    - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-1/sources/source-1.html b/htmlReport/ns-1/sources/source-1.html deleted file mode 100644 index 0e2063de4f..0000000000 --- a/htmlReport/ns-1/sources/source-1.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - Coverage Report > BagPacker - - - - - - -
    - - -

    Coverage Summary for Class: BagPacker (bagpacker)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    BagPacker - - 0% - - - (0/1) - - - - 0% - - - (0/3) - - - - 0% - - - (0/15) - -
    - -
    -
    - - -
    - package bagpacker;
    - 
    - import bagpacker.commands.ByeCommand;
    - import bagpacker.commands.Command;
    - import bagpacker.iohandler.Storage;
    - import bagpacker.iohandler.Ui;
    - import bagpacker.iohandler.Parser;
    - import bagpacker.packingfunc.PackingList;
    - 
    - import java.io.FileNotFoundException;
    - 
    - public class BagPacker {
    -     private static PackingList packingList;
    - 
    -     /**
    -      * Main entry-point for the java.BagPacker application.
    -      */
    -     public static void main(String[] args) {
    -         // Initialise variables
    -         BagPacker.packingList = new PackingList();
    -         Ui.initialMessage();
    - 
    -         // load save file if possible
    -         try {
    -             Storage.load();
    -             Ui.showUserReturn();
    -         } catch (FileNotFoundException | RuntimeException e) {
    -             Ui.showNewUser();
    -         }
    - 
    -         // run main program
    -         runBagPacker();
    - 
    -         // save packingList
    -         Storage.save(packingList);
    - 
    -         // Close program
    -         Ui.goodbyeMessage();
    -     }
    - 
    -     public static void runBagPacker() {
    -         while (ByeCommand.isBagPackerRunning) {
    -             Command c = Parser.parse();
    -             c.execute(packingList);
    -         }
    -     }
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-2/index.html b/htmlReport/ns-2/index.html deleted file mode 100644 index 78fc33a710..0000000000 --- a/htmlReport/ns-2/index.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.commands

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (8/8) - -
    ByeCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (3/3) - -
    Command - - 100% - - - (1/1) - - - - 83.3% - - - (5/6) - - - - 87.5% - - - (7/8) - -
    DeleteCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
    DeleteListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    HelpCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (2/2) - -
    IncorrectCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    ListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 72.7% - - - (8/11) - -
    PackAllCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    UnpackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_BLOCK.html b/htmlReport/ns-2/index_SORT_BY_BLOCK.html deleted file mode 100644 index b8e83aa195..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_BLOCK.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.commands

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (8/8) - -
    ByeCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (3/3) - -
    Command - - 100% - - - (1/1) - - - - 83.3% - - - (5/6) - - - - 87.5% - - - (7/8) - -
    DeleteCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
    DeleteListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    HelpCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (2/2) - -
    IncorrectCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    ListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 72.7% - - - (8/11) - -
    PackAllCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    UnpackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html deleted file mode 100644 index 9a3aff2f1f..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_BLOCK_DESC.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.commands

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    UnpackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackAllCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    ListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 72.7% - - - (8/11) - -
    IncorrectCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    HelpCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (2/2) - -
    DeleteListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    DeleteCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
    Command - - 100% - - - (1/1) - - - - 83.3% - - - (5/6) - - - - 87.5% - - - (7/8) - -
    ByeCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (3/3) - -
    AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (8/8) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_CLASS.html b/htmlReport/ns-2/index_SORT_BY_CLASS.html deleted file mode 100644 index 93dcbfd28f..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_CLASS.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.commands

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (8/8) - -
    ByeCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (3/3) - -
    Command - - 100% - - - (1/1) - - - - 83.3% - - - (5/6) - - - - 87.5% - - - (7/8) - -
    DeleteCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
    DeleteListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    HelpCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (2/2) - -
    IncorrectCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    ListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 72.7% - - - (8/11) - -
    PackAllCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    UnpackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html deleted file mode 100644 index 8c46d75e51..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_CLASS_DESC.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.commands

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    UnpackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackAllCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    ListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 72.7% - - - (8/11) - -
    IncorrectCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    HelpCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (2/2) - -
    DeleteListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    DeleteCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
    Command - - 100% - - - (1/1) - - - - 83.3% - - - (5/6) - - - - 87.5% - - - (7/8) - -
    ByeCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (3/3) - -
    AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (8/8) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_LINE.html b/htmlReport/ns-2/index_SORT_BY_LINE.html deleted file mode 100644 index 3606814e33..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_LINE.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.commands

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    ListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 72.7% - - - (8/11) - -
    Command - - 100% - - - (1/1) - - - - 83.3% - - - (5/6) - - - - 87.5% - - - (7/8) - -
    AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (8/8) - -
    ByeCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (3/3) - -
    DeleteCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
    DeleteListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    HelpCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (2/2) - -
    IncorrectCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    PackAllCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    UnpackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html deleted file mode 100644 index 92f941632a..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_LINE_DESC.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.commands

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    UnpackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackAllCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    IncorrectCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    HelpCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (2/2) - -
    DeleteListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    DeleteCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
    ByeCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (3/3) - -
    AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (8/8) - -
    Command - - 100% - - - (1/1) - - - - 83.3% - - - (5/6) - - - - 87.5% - - - (7/8) - -
    ListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 72.7% - - - (8/11) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_METHOD.html b/htmlReport/ns-2/index_SORT_BY_METHOD.html deleted file mode 100644 index 601ae686d8..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_METHOD.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.commands

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Command - - 100% - - - (1/1) - - - - 83.3% - - - (5/6) - - - - 87.5% - - - (7/8) - -
    AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (8/8) - -
    ByeCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (3/3) - -
    DeleteCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
    DeleteListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    HelpCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (2/2) - -
    IncorrectCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    ListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 72.7% - - - (8/11) - -
    PackAllCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    UnpackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html deleted file mode 100644 index c51bd074ca..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_METHOD_DESC.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.commands

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    UnpackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackAllCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    ListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 72.7% - - - (8/11) - -
    IncorrectCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    HelpCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (2/2) - -
    DeleteListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    DeleteCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
    ByeCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (3/3) - -
    AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (8/8) - -
    Command - - 100% - - - (1/1) - - - - 83.3% - - - (5/6) - - - - 87.5% - - - (7/8) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html deleted file mode 100644 index 9c756c9395..0000000000 --- a/htmlReport/ns-2/index_SORT_BY_NAME_DESC.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - Coverage Report > bagpacker.commands - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.commands

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.commands - - 100% - - - (11/11) - - - - 96.7% - - - (29/30) - - - - 94.2% - - - (65/69) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    UnpackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    PackAllCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    ListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 72.7% - - - (8/11) - -
    IncorrectCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    HelpCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (2/2) - -
    DeleteListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    DeleteCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
    Command - - 100% - - - (1/1) - - - - 83.3% - - - (5/6) - - - - 87.5% - - - (7/8) - -
    ByeCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (3/3) - -
    AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (8/8) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-2/sources/source-1.html b/htmlReport/ns-2/sources/source-1.html deleted file mode 100644 index ded1f7dd10..0000000000 --- a/htmlReport/ns-2/sources/source-1.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - Coverage Report > AddCommand - - - - - - -
    - - -

    Coverage Summary for Class: AddCommand (bagpacker.commands)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    AddCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (8/8) - -
    - -
    -
    - - -
    - package bagpacker.commands;
    - 
    - import bagpacker.iohandler.Ui;
    - import bagpacker.packingfunc.Item;
    - import bagpacker.packingfunc.PackingList;
    - 
    - public class AddCommand extends Command {
    -     public static final String MSG_SUCCESS_ADD = "New item added: %s";
    -     public static final String MSG_SUCCESS_ADD_EXISTING = "Add to quantity of existing item: %s";
    - 
    -     public static final String HELP_MSG = "add : Adds quantity and name of item to the packing list.\n" +
    -             "\tExample: add 3 /of toothbrush\n" +
    -             "\tMeaning: add quantity of 3 toothbrushes to the packing list";
    - 
    -     private final Item item;
    - 
    -     public AddCommand(Item item) {
    -         this.item = item;
    -     }
    - 
    -     @Override
    -     public void execute(PackingList packingList) {
    -         if(PackingList.itemFinder(item.getItemName())){
    -             PackingList.addToItemQuantity(item.getItemName(), item.getTotalQuantity());
    -             Ui.printToUser(String.format(MSG_SUCCESS_ADD_EXISTING, PackingList.getExistingItem(item.getItemName())));
    -             return;
    -         }
    -         this.packingList = packingList;
    -         packingList.addItem(item);
    -         Ui.printToUser(String.format(MSG_SUCCESS_ADD, item));
    -     }
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-2/sources/source-2.html b/htmlReport/ns-2/sources/source-2.html deleted file mode 100644 index 31152099ee..0000000000 --- a/htmlReport/ns-2/sources/source-2.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - Coverage Report > ByeCommand - - - - - - -
    - - -

    Coverage Summary for Class: ByeCommand (bagpacker.commands)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    ByeCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (3/3) - -
    - -
    -
    - - -
    - package bagpacker.commands;
    - 
    - import bagpacker.packingfunc.PackingList;
    - 
    - /**
    -  * ByeCommand class stops the BagPacker application by changing the run status
    -  */
    - public class ByeCommand extends Command {
    -     public static boolean isBagPackerRunning = true;
    -     public static final String HELP_MSG = "bye : Stops the BagPacker Application\n" +
    -             "\tExample: bye";
    - 
    -     public void execute(PackingList packingList) {
    -         this.isBagPackerRunning = false;
    -     }
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-2/sources/source-3.html b/htmlReport/ns-2/sources/source-3.html deleted file mode 100644 index 28a7f284d6..0000000000 --- a/htmlReport/ns-2/sources/source-3.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - Coverage Report > Command - - - - - - -
    - - -

    Coverage Summary for Class: Command (bagpacker.commands)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    Command - - 100% - - - (1/1) - - - - 83.3% - - - (5/6) - - - - 87.5% - - - (7/8) - -
    - -
    -
    - - -
    - package bagpacker.commands;
    - 
    - import bagpacker.packingfunc.Item;
    - import bagpacker.packingfunc.PackingList;
    - 
    - /**
    -  * Commands class used to execute given commands from user
    -  */
    - public abstract class Command {
    -     protected PackingList packingList;
    -     private int targetIndex = -1;
    - 
    -     /**
    -      * @param targetIndex listing index of the target item
    -      */
    -     public Command(int targetIndex) {
    -         this.setTargetIndex(targetIndex);
    -     }
    - 
    -     protected Command() {
    -     }
    - 
    -     public void setTargetIndex(int targetIndex) {
    -         this.targetIndex = targetIndex;
    -     }
    - 
    -     public int getTargetIndex() {
    -         return targetIndex;
    -     }
    - 
    -     /**
    -      * Extracts the target item in the list.
    -      *
    -      * @throws IndexOutOfBoundsException if the target index is out of bounds
    -      */
    -     protected Item getTargetItem() throws IndexOutOfBoundsException {
    -         return packingList.get(getTargetIndex() - 1);
    -     }
    - 
    - 
    -     /**
    -      * Executes the command which requires a packingList
    -      *
    -      * @param packingList used to execute the command
    -      */
    -     public void execute(PackingList packingList) {
    -     }
    - 
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-2/sources/source-4.html b/htmlReport/ns-2/sources/source-4.html deleted file mode 100644 index 30f325b460..0000000000 --- a/htmlReport/ns-2/sources/source-4.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - Coverage Report > DeleteCommand - - - - - - -
    - - -

    Coverage Summary for Class: DeleteCommand (bagpacker.commands)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    DeleteCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (5/5) - -
    - -
    -
    - - -
    - package bagpacker.commands;
    - 
    - import bagpacker.packingfunc.Item;
    - import bagpacker.packingfunc.PackingList;
    - 
    - import bagpacker.iohandler.Ui;
    - 
    - public class DeleteCommand extends Command {
    - 
    -     public static final String MSG_SUCCESS_DELETE = "%s removed from the list";
    - 
    -     public static final String HELP_MSG = "delete : Deletes an item from the packing list.\n" +
    -             "\tExample: delete 1\n" +
    -             "\tMeaning: removes the first item in the packing list";
    - 
    - 
    -     public DeleteCommand(int targetIndex) {
    -         super(targetIndex);
    -     }
    - 
    -     @Override
    -     public void execute(PackingList packingList) {
    -         Item item = getTargetItem();
    -         this.packingList = packingList;
    -         packingList.deleteItem(item);
    -         Ui.printToUser(String.format(MSG_SUCCESS_DELETE, item));
    -     }
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-2/sources/source-5.html b/htmlReport/ns-2/sources/source-5.html deleted file mode 100644 index ef9cf2bacf..0000000000 --- a/htmlReport/ns-2/sources/source-5.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - Coverage Report > DeleteListCommand - - - - - - -
    - - -

    Coverage Summary for Class: DeleteListCommand (bagpacker.commands)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    DeleteListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    - -
    -
    - - -
    - package bagpacker.commands;
    - 
    - import bagpacker.iohandler.Ui;
    - import bagpacker.packingfunc.Item;
    - import bagpacker.packingfunc.PackingList;
    - 
    - import java.util.ArrayList;
    - 
    - public class DeleteListCommand extends Command {
    -     public static final String MSG_SUCCESS_DELETE_LIST = "Packing list deleted";
    - 
    -     public static final String HELP_MSG =
    -             "deletelist : Deletes all items in the packing list.\n" +
    -                     "\tExample: deletelist";
    - 
    -     @Override
    -     public void execute(PackingList packingList) {
    -         ArrayList<Item> emptyList = new ArrayList<>();
    -         PackingList.setItemList(emptyList);
    -         Ui.printToUser(String.format(MSG_SUCCESS_DELETE_LIST));
    -     }
    - 
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-2/sources/source-6.html b/htmlReport/ns-2/sources/source-6.html deleted file mode 100644 index aacf3e1986..0000000000 --- a/htmlReport/ns-2/sources/source-6.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - Coverage Report > HelpCommand - - - - - - -
    - - -

    Coverage Summary for Class: HelpCommand (bagpacker.commands)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    HelpCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (2/2) - -
    - -
    -
    - - -
    - package bagpacker.commands;
    - 
    - import bagpacker.iohandler.Ui;
    - import bagpacker.packingfunc.PackingList;
    - 
    - public class HelpCommand extends Command {
    -     @Override
    -     public void execute(PackingList packingList) {
    -         Ui.helpMessage();
    -     }
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-2/sources/source-7.html b/htmlReport/ns-2/sources/source-7.html deleted file mode 100644 index 9da708b346..0000000000 --- a/htmlReport/ns-2/sources/source-7.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - Coverage Report > IncorrectCommand - - - - - - -
    - - -

    Coverage Summary for Class: IncorrectCommand (bagpacker.commands)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    IncorrectCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 100% - - - (4/4) - -
    - -
    -
    - - -
    - package bagpacker.commands;
    - 
    - import bagpacker.iohandler.Ui;
    - import bagpacker.packingfunc.PackingList;
    - 
    - public class IncorrectCommand extends Command {
    -     private final String errorType;
    -     private final String helpMessage;
    - 
    -     public IncorrectCommand(String errorType, String helpMessage) {
    -         this.helpMessage = helpMessage;
    -         this.errorType = errorType;
    -     }
    - 
    -     @Override
    -     public void execute(PackingList packingList) {
    -         Ui.errorMessage(errorType, helpMessage);
    -     }
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-2/sources/source-8.html b/htmlReport/ns-2/sources/source-8.html deleted file mode 100644 index b36a9e5f18..0000000000 --- a/htmlReport/ns-2/sources/source-8.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - Coverage Report > ListCommand - - - - - - -
    - - -

    Coverage Summary for Class: ListCommand (bagpacker.commands)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    ListCommand - - 100% - - - (1/1) - - - - 100% - - - (2/2) - - - - 72.7% - - - (8/11) - -
    - -
    -
    - - -
    - package bagpacker.commands;
    - 
    - import bagpacker.packingfunc.PackingList;
    - 
    - public class ListCommand extends Command {
    -     public static final String HELP_MSG = "list : List all items and their total quantities packed in packing list.\n" +
    -             "\tExample: list";
    - 
    -     @Override
    -     public void execute(PackingList packingList) {
    - 
    -         if (packingList.size() == 0) {
    -             System.out.println("____________________________________________________________");
    -             System.out.println("There are no items in your list. What would you like to add?");
    -             System.out.println("____________________________________________________________");
    -             return;
    -         }
    - 
    -         System.out.println("____________________________________________________________");
    -         System.out.println("Here are the items in your list");
    -         for (int i = 0; i < packingList.size(); i++) {
    -             //            String isItemPacked;
    -             //            if (packingList.get(i).getIsPacked()) {
    -             //                isItemPacked = "X";
    -             //            } else {
    -             //                isItemPacked = " ";
    -             //            }
    -             //            String itemName = packingList.get(i).getItemName();
    -             //            System.out.println((i + 1) + ". [" + isItemPacked + "] " + itemName);
    -             System.out.print((i + 1) + ". ");
    -             System.out.println(PackingList.get(i));
    -         }
    -         System.out.println("____________________________________________________________");
    -     }
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-2/sources/source-9.html b/htmlReport/ns-2/sources/source-9.html deleted file mode 100644 index 239a22f567..0000000000 --- a/htmlReport/ns-2/sources/source-9.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - Coverage Report > PackAllCommand - - - - - - -
    - - -

    Coverage Summary for Class: PackAllCommand (bagpacker.commands)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    PackAllCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    - -
    -
    - - -
    - package bagpacker.commands;
    - 
    - import bagpacker.iohandler.Ui;
    - import bagpacker.packingfunc.Item;
    - import bagpacker.packingfunc.PackingList;
    - 
    - public class PackAllCommand extends Command {
    - 
    -     public static final String MSG_SUCCESS_PACK = "Item packed: %s";
    - 
    -     public static final String HELP_MSG = "packall : Marks all quantity of the specified item as packed in the " +
    -             "packing list.\n" +
    -             "\tExample: packall /of 3\n" +
    -             "\tMeaning: packs all of the quantities of the third item in the packing list";
    - 
    -     private static int packQuantity;
    - 
    -     public PackAllCommand(int targetIndex) {
    -         super(targetIndex);
    - 
    -         assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) :
    -                 "PackAll Command Target index is out of bounds";
    -     }
    - 
    -     @Override
    -     public void execute(PackingList packingList) {
    -         this.packingList = packingList;
    -         final Item item = getTargetItem();
    -         packQuantity = item.getUnpackedQuantity();
    -         packingList.packItem(item, packQuantity);
    -         Ui.printToUser(String.format(MSG_SUCCESS_PACK, item));
    -     }
    - 
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-2/sources/source-a.html b/htmlReport/ns-2/sources/source-a.html deleted file mode 100644 index f5536813a0..0000000000 --- a/htmlReport/ns-2/sources/source-a.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - Coverage Report > PackCommand - - - - - - -
    - - -

    Coverage Summary for Class: PackCommand (bagpacker.commands)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    PackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    - -
    -
    - - -
    - package bagpacker.commands;
    - 
    - import bagpacker.iohandler.Ui;
    - import bagpacker.packingfunc.Item;
    - import bagpacker.packingfunc.PackingList;
    - 
    - public class PackCommand extends Command {
    - 
    -     public static final String MSG_SUCCESS_PACK = "Item packed: %s";
    -     public static final String HELP_MSG = "pack : Adds to the current quantity of items packed in the packing list.\n" +
    -             "\tExample: pack 2 /of 3\n" +
    -             "\tMeaning: packs 2 more quantities of the third item in the packing list";
    - 
    -     private static int packQuantity;
    - 
    -     public PackCommand(int quantity, int targetIndex) {
    -         super(targetIndex);
    -         packQuantity = quantity;
    -         assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) :
    -                 "Pack Command Target index is out of bounds";
    -     }
    - 
    -     @Override
    -     public void execute(PackingList packingList) {
    -         this.packingList = packingList;
    -         final Item item = getTargetItem();
    -         packingList.packItem(item, packQuantity);
    -         Ui.printToUser(String.format(MSG_SUCCESS_PACK, item));
    -     }
    - 
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-2/sources/source-b.html b/htmlReport/ns-2/sources/source-b.html deleted file mode 100644 index fdef7a1b84..0000000000 --- a/htmlReport/ns-2/sources/source-b.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - Coverage Report > UnpackCommand - - - - - - -
    - - -

    Coverage Summary for Class: UnpackCommand (bagpacker.commands)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    UnpackCommand - - 100% - - - (1/1) - - - - 100% - - - (3/3) - - - - 100% - - - (8/8) - -
    - -
    -
    - - -
    - package bagpacker.commands;
    - 
    - import bagpacker.iohandler.Ui;
    - import bagpacker.packingfunc.Item;
    - import bagpacker.packingfunc.PackingList;
    - 
    - public class UnpackCommand extends Command {
    - 
    -     public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s";
    - 
    -     public static final String HELP_MSG = "unpack : Deducts from the current quantity of items packed in the packing " +
    -             "list.\n" +
    -             "\tExample: unpack 1 /of 2\n" +
    -             "\tMeaning: unpacks 1 quantity of the second item in the packing list";
    -     private static int unpackQuantity;
    - 
    -     public UnpackCommand(int quantity, int targetIndex) {
    -         super(targetIndex);
    -         unpackQuantity = quantity;
    -         assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) :
    -                 "Unpack Command Target index is out of bounds";
    -     }
    - 
    -     @Override
    -     public void execute(PackingList packingList) {
    -         this.packingList = packingList;
    -         final Item item = getTargetItem();
    -         packingList.unpackItem(item, unpackQuantity);
    -         Ui.printToUser(String.format(MSG_SUCCESS_UNPACK, item));
    -     }
    - 
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-3/index.html b/htmlReport/ns-3/index.html deleted file mode 100644 index 732440749d..0000000000 --- a/htmlReport/ns-3/index.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.exception

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    EmptyInputException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_BLOCK.html b/htmlReport/ns-3/index_SORT_BY_BLOCK.html deleted file mode 100644 index aa7ae187a2..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_BLOCK.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.exception

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    EmptyInputException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html deleted file mode 100644 index 578199d1a4..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_BLOCK_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.exception

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    EmptyInputException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_CLASS.html b/htmlReport/ns-3/index_SORT_BY_CLASS.html deleted file mode 100644 index cdcb70427d..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_CLASS.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.exception

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    EmptyInputException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html deleted file mode 100644 index 21951f7557..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_CLASS_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.exception

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    EmptyInputException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_LINE.html b/htmlReport/ns-3/index_SORT_BY_LINE.html deleted file mode 100644 index 69daea784a..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_LINE.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.exception

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    EmptyInputException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html deleted file mode 100644 index 1cfe6e6704..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_LINE_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.exception

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    EmptyInputException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_METHOD.html b/htmlReport/ns-3/index_SORT_BY_METHOD.html deleted file mode 100644 index 8ef006e257..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_METHOD.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.exception

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    EmptyInputException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html deleted file mode 100644 index 7d2e0e71b7..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_METHOD_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.exception

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    EmptyInputException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html deleted file mode 100644 index 856f16fff2..0000000000 --- a/htmlReport/ns-3/index_SORT_BY_NAME_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.exception - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.exception

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.exception - - 0% - - - (0/3) - - - - 0% - - - (0/3) - - - - 0% - - - (0/3) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    EmptyInputException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-3/sources/source-1.html b/htmlReport/ns-3/sources/source-1.html deleted file mode 100644 index 95176c5017..0000000000 --- a/htmlReport/ns-3/sources/source-1.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - Coverage Report > EmptyInputException - - - - - - -
    - - -

    Coverage Summary for Class: EmptyInputException (bagpacker.exception)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    EmptyInputException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    - -
    -
    - - -
    - package bagpacker.exception;
    - 
    - public class EmptyInputException extends Exception {
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-3/sources/source-2.html b/htmlReport/ns-3/sources/source-2.html deleted file mode 100644 index d128f323c6..0000000000 --- a/htmlReport/ns-3/sources/source-2.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - Coverage Report > InvalidIndexException - - - - - - -
    - - -

    Coverage Summary for Class: InvalidIndexException (bagpacker.exception)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    InvalidIndexException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    - -
    -
    - - -
    - package bagpacker.exception;
    - 
    - 
    - public class InvalidIndexException extends Exception {
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-3/sources/source-3.html b/htmlReport/ns-3/sources/source-3.html deleted file mode 100644 index 3fc863cc44..0000000000 --- a/htmlReport/ns-3/sources/source-3.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - Coverage Report > InvalidVariablesException - - - - - - -
    - - -

    Coverage Summary for Class: InvalidVariablesException (bagpacker.exception)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    InvalidVariablesException - - 0% - - - (0/1) - - - - 0% - - - (0/1) - - - - 0% - - - (0/1) - -
    - -
    -
    - - -
    - package bagpacker.exception;
    - 
    - 
    - public class InvalidVariablesException extends Exception {
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-4/index.html b/htmlReport/ns-4/index.html deleted file mode 100644 index e84547a900..0000000000 --- a/htmlReport/ns-4/index.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.iohandler

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Parser - - 0% - - - (0/1) - - - - 0% - - - (0/25) - - - - 0% - - - (0/165) - -
    Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/20) - -
    Ui - - 100% - - - (1/1) - - - - 54.5% - - - (6/11) - - - - 68.8% - - - (22/32) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_BLOCK.html b/htmlReport/ns-4/index_SORT_BY_BLOCK.html deleted file mode 100644 index 83e4dfc6ca..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_BLOCK.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.iohandler

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Parser - - 0% - - - (0/1) - - - - 0% - - - (0/25) - - - - 0% - - - (0/165) - -
    Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/20) - -
    Ui - - 100% - - - (1/1) - - - - 54.5% - - - (6/11) - - - - 68.8% - - - (22/32) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html deleted file mode 100644 index 26405e2e00..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_BLOCK_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.iohandler

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Ui - - 100% - - - (1/1) - - - - 54.5% - - - (6/11) - - - - 68.8% - - - (22/32) - -
    Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/20) - -
    Parser - - 0% - - - (0/1) - - - - 0% - - - (0/25) - - - - 0% - - - (0/165) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_CLASS.html b/htmlReport/ns-4/index_SORT_BY_CLASS.html deleted file mode 100644 index e919e74aa9..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_CLASS.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.iohandler

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Parser - - 0% - - - (0/1) - - - - 0% - - - (0/25) - - - - 0% - - - (0/165) - -
    Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/20) - -
    Ui - - 100% - - - (1/1) - - - - 54.5% - - - (6/11) - - - - 68.8% - - - (22/32) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html deleted file mode 100644 index 9b147bd5f7..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_CLASS_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.iohandler

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Ui - - 100% - - - (1/1) - - - - 54.5% - - - (6/11) - - - - 68.8% - - - (22/32) - -
    Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/20) - -
    Parser - - 0% - - - (0/1) - - - - 0% - - - (0/25) - - - - 0% - - - (0/165) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_LINE.html b/htmlReport/ns-4/index_SORT_BY_LINE.html deleted file mode 100644 index 1a258d565b..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_LINE.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.iohandler

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Parser - - 0% - - - (0/1) - - - - 0% - - - (0/25) - - - - 0% - - - (0/165) - -
    Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/20) - -
    Ui - - 100% - - - (1/1) - - - - 54.5% - - - (6/11) - - - - 68.8% - - - (22/32) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html deleted file mode 100644 index 0fb214e0bc..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_LINE_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.iohandler

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Ui - - 100% - - - (1/1) - - - - 54.5% - - - (6/11) - - - - 68.8% - - - (22/32) - -
    Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/20) - -
    Parser - - 0% - - - (0/1) - - - - 0% - - - (0/25) - - - - 0% - - - (0/165) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_METHOD.html b/htmlReport/ns-4/index_SORT_BY_METHOD.html deleted file mode 100644 index ed0737e2b4..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_METHOD.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.iohandler

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Parser - - 0% - - - (0/1) - - - - 0% - - - (0/25) - - - - 0% - - - (0/165) - -
    Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/20) - -
    Ui - - 100% - - - (1/1) - - - - 54.5% - - - (6/11) - - - - 68.8% - - - (22/32) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html deleted file mode 100644 index 6754eda50a..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_METHOD_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.iohandler

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Ui - - 100% - - - (1/1) - - - - 54.5% - - - (6/11) - - - - 68.8% - - - (22/32) - -
    Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/20) - -
    Parser - - 0% - - - (0/1) - - - - 0% - - - (0/25) - - - - 0% - - - (0/165) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html deleted file mode 100644 index 6a66508296..0000000000 --- a/htmlReport/ns-4/index_SORT_BY_NAME_DESC.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Coverage Report > bagpacker.iohandler - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.iohandler

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.iohandler - - 33.3% - - - (1/3) - - - - 14.6% - - - (6/41) - - - - 10.1% - - - (22/217) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Ui - - 100% - - - (1/1) - - - - 54.5% - - - (6/11) - - - - 68.8% - - - (22/32) - -
    Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/20) - -
    Parser - - 0% - - - (0/1) - - - - 0% - - - (0/25) - - - - 0% - - - (0/165) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-4/sources/source-1.html b/htmlReport/ns-4/sources/source-1.html deleted file mode 100644 index f7a83f182d..0000000000 --- a/htmlReport/ns-4/sources/source-1.html +++ /dev/null @@ -1,537 +0,0 @@ - - - - - - - Coverage Report > Parser - - - - - - -
    - - -

    Coverage Summary for Class: Parser (bagpacker.iohandler)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    Parser - - 0% - - - (0/1) - - - - 0% - - - (0/25) - - - - 0% - - - (0/165) - -
    - -
    -
    - - -
    - package bagpacker.iohandler;
    - 
    - 
    - import bagpacker.commands.AddCommand;
    - import bagpacker.commands.ByeCommand;
    - import bagpacker.commands.Command;
    - import bagpacker.commands.DeleteCommand;
    - import bagpacker.commands.DeleteListCommand;
    - import bagpacker.commands.HelpCommand;
    - import bagpacker.commands.IncorrectCommand;
    - import bagpacker.commands.ListCommand;
    - import bagpacker.commands.PackCommand;
    - import bagpacker.commands.UnpackCommand;
    - import bagpacker.commands.PackAllCommand;
    - import bagpacker.exception.EmptyInputException;
    - import bagpacker.exception.InvalidIndexException;
    - import bagpacker.exception.InvalidVariablesException;
    - import bagpacker.packingfunc.Item;
    - import bagpacker.packingfunc.PackingList;
    - 
    - import java.util.ArrayList;
    - import java.util.Arrays;
    - import java.util.Scanner;
    - 
    - /**
    -  * Parser class contains methods to manipulate user input
    -  */
    - public class Parser {
    -     private static ArrayList<String> inputStringArray;
    -     private static String fullInput;
    - 
    -     public static void setFullInput(String fullInput) {
    -         Parser.fullInput = fullInput;
    -     }
    - 
    -     /**
    -      * Returns the user input as in array format
    -      */
    -     public static ArrayList<String> getInputStringArray() {
    -         return inputStringArray;
    -     }
    - 
    -     public static void setInputStringArray(String[] inputStringArray) {
    -         Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray));
    -     }
    - 
    -     /**
    -      * Returns the user input in String format
    -      */
    -     public static String getFullInput() {
    -         return fullInput;
    -     }
    - 
    -     public static Command parse() {
    -         String inputLine = "";
    -         while (inputLine.isEmpty()) {
    -             try {
    -                 inputLine = readLine();
    -             } catch (EmptyInputException e) {
    -                 Ui.errorMessage("Empty input received",
    -                         "try to input a command, to view all commands input 'help'");
    -             }
    -         }
    -         setFullInput(inputLine);
    -         String[] inputStringList = inputLine.trim().split("\\s+");
    -         setInputStringArray(inputStringList);
    -         switch (getCommand()) {
    -         case "add":
    -             return createAddObj();
    -         case "delete":
    -             return createDeleteObj();
    -         case "pack":
    -             return createPackObj();
    -         case "unpack":
    -             return createUnpackObj();
    -         case "list":
    -             return listCommand();
    -         case "help":
    -             return createHelpObj();
    -         case "deletelist":
    -             return createDeletelistObj();
    -         case "packall":
    -             return createPackAllObj();
    -         case "bye":
    -             return createByeObj();
    -         default:
    -             return new IncorrectCommand("'" + Parser.getCommand() + "' is an invalid User Command",
    -                     "input 'help' to receive all valid commands");
    -         }
    -     }
    - 
    -     /**
    -      * Reads and returns the full user input from the command line interface
    -      * - trims the leading and trailing white spaces
    -      *
    -      * @return inputLine the String input of the user
    -      * @throws EmptyInputException when user input empty line
    -      */
    -     public static String readLine() throws EmptyInputException {
    -         String inputLine;
    -         Scanner in = new Scanner(System.in);
    -         inputLine = in.nextLine().trim();
    -         if (inputLine.isEmpty()) {
    -             throw new EmptyInputException();
    -         }
    -         return inputLine;
    -     }
    - 
    -     /**
    -      * Returns the user command in lower case
    -      *
    -      * @return command from user
    -      */
    -     public static String getCommand() {
    -         return getInputStringArray().get(0).toLowerCase();
    -     }
    - 
    -     /**
    -      * Returns a string which represents the name of the item from the user input
    -      *
    -      * @return inputVariables which is the name of the item
    -      * @throws InvalidVariablesException when the item name cannot be found
    -      */
    -     public static String getItemName() throws InvalidVariablesException {
    -         String itemName;
    -         if (inputStringArray.size() <= 1) {
    -             throw new InvalidVariablesException();
    -         }
    -         try {
    -             int itemIndStart = fullInput.indexOf(" ") + 1;
    -             itemName = fullInput.substring(itemIndStart).trim();
    -         } catch (IndexOutOfBoundsException e) {
    -             throw new InvalidVariablesException();
    -         }
    -         return itemName;
    -     }
    - 
    -     /**
    -      * Returns a string which represents the index of the item from the user input
    -      *
    -      * @return inputIndex which is the item index of the item in packing list
    -      * @throws InvalidIndexException when the item index is not valid
    -      */
    -     public static String getItemIndex() throws InvalidIndexException {
    -         String inputIndex;
    -         int itemIndex;
    -         if (inputStringArray.size() != 2) {
    -             throw new InvalidIndexException();
    -         }
    -         try {
    -             inputIndex = inputStringArray.get(1);
    -             itemIndex = Integer.parseInt(inputIndex);
    -             if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) {
    -                 throw new InvalidIndexException();
    -             }
    -         } catch (IndexOutOfBoundsException | NumberFormatException e) {
    -             throw new InvalidIndexException();
    -         }
    -         return inputIndex;
    -     }
    - 
    -     /**
    -      * Returns a string which represents the relevant variable depending on the command
    -      * - "add" will return the item name
    -      * - "delete", "pack", "unpack" will return item index
    -      *
    -      * @param command used to determine the type of variable to return
    -      * @return itemVariable which is the index OR name of the item in packing list
    -      * @throws InvalidIndexException when the item index is not valid
    -      */
    -     public static String getVariable(String command) throws InvalidVariablesException, InvalidIndexException {
    -         String itemVariable;
    -         try {
    -             if (command.equals("add")) {
    -                 itemVariable = getItemName();
    -             } else {
    -                 itemVariable = getItemIndex();
    -             }
    -         } catch (InvalidVariablesException e) {
    -             throw new InvalidVariablesException();
    -         } catch (InvalidIndexException e) {
    -             throw new InvalidIndexException();
    -         }
    -         return itemVariable;
    -     }
    - 
    - 
    -     /**
    -      * Returns the user item description
    -      */
    -     public static String getItemDescrip() {
    -         //String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length);
    -         int indexItemName = getFullInput().indexOf("i/") + 2;
    -         return getFullInput().substring(indexItemName).trim();
    -     }
    - 
    - 
    -     /**
    -      * Attempts to create AddCommand object to be executed where it is called from
    -      *
    -      * @return AddCommand the command to be executed to add an item to the packing list, else
    -      *              an IncorrectCommand is created to be executed
    -      */
    -     public static Command createAddObj() {
    -         try {
    -             String[] quantityAndName = getAddVariables();
    -             int itemQuantity = Integer.parseInt(quantityAndName[0]);
    -             String itemName = quantityAndName[1];
    -             if (itemName == null) {
    -                 throw new InvalidVariablesException();
    -             }
    -             if (itemQuantity < 1) {
    -                 throw new InvalidIndexException();
    -             }
    -             return new AddCommand(new Item(itemQuantity, itemName));
    -         } catch (InvalidVariablesException | ArrayIndexOutOfBoundsException e) {
    -             return new IncorrectCommand("Invalid input format",
    -                     AddCommand.HELP_MSG);
    -         } catch (NumberFormatException | InvalidIndexException e) {
    -             return new IncorrectCommand("Invalid Item Quantity",
    -                     "For item quantity, try to input a positive integer number between 1 and 1000000");
    -         }
    -     }
    - 
    -     public static String[] getAddVariables() throws InvalidVariablesException {
    -         String[] inputStringList = fullInput.trim().split(" ", 2);
    -         String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+");
    -         if (inputVariables.length != 2) {
    -             throw new InvalidVariablesException();
    -         }
    -         return inputVariables;
    -     }
    - 
    -     /**
    -      * Attempts to create DeleteCommand object to be executed where it is called from
    -      *
    -      * @return DeleteCommand the command to be executed to delete an item to the packing list, else
    -      *              an IncorrectCommand is created to be executed
    -      */
    -     public static Command createDeleteObj() {
    -         try {
    -             String itemIndex = getVariable("delete");
    -             return new DeleteCommand(Integer.parseInt(itemIndex));
    -         } catch (InvalidVariablesException e) {
    -             return new IncorrectCommand("Invalid Item Name",
    -                     "Try to input a name (word(s)) to be added into the list");
    -         } catch (InvalidIndexException e) {
    -             if (PackingList.getItemList().size() == 0) {
    -                 return new IncorrectCommand("Invalid Item Index",
    -                         "Your packing list is empty, there is nothing to delete");
    -             } else {
    -                 return new IncorrectCommand("Invalid Item Index",
    -                         "Try to input a positive integer number that is at most " +
    -                                 PackingList.getItemList().size());
    -             }
    -         }
    -     }
    - 
    -     public static int[] getQuantityAndIndex() throws InvalidVariablesException, InvalidIndexException {
    -         int[] itemQuantityAndIndex = new int[2];
    -         try {
    -             itemQuantityAndIndex[0] = Integer.parseInt(inputStringArray.get(1).trim());
    -             itemQuantityAndIndex[1] = Integer.parseInt(inputStringArray.get(3).trim());
    -         } catch (IndexOutOfBoundsException e) {
    -             throw new InvalidVariablesException();
    -         } catch (NumberFormatException e) {
    -             throw new InvalidIndexException();
    -         }
    -         return itemQuantityAndIndex;
    -     }
    - 
    -     /**
    -      * Attempts to create PackCommand object to be executed where it is called from
    -      *
    -      * @return PackCommand the command to be executed to Pack an item in the packing list, else
    -      *              an IncorrectCommand is created to be executed
    -      */
    -     public static Command createPackObj() {
    -         int quantityNotPacked = 0;
    -         try {
    -             String[] quantityAndIndex = getPackVariables();
    -             int itemQuantity = Integer.parseInt(quantityAndIndex[0]);
    -             int itemIndex = Integer.parseInt(quantityAndIndex[1]);
    -             quantityNotPacked = PackingList.get(itemIndex - 1).getUnpackedQuantity();
    -             if (itemQuantity < 1 | itemQuantity > quantityNotPacked) {
    -                 throw new InvalidVariablesException();
    -             }
    -             return new PackCommand(itemQuantity, itemIndex);
    -         } catch (NumberFormatException | InvalidIndexException e) {
    -             if (PackingList.getItemList().size() == 0) {
    -                 return new IncorrectCommand("Invalid Item Index",
    -                         "Your packing list is empty, there is nothing to pack");
    -             } else {
    -                 return new IncorrectCommand("Invalid Item Index",
    -                         "Try to input a positive integer number that is at most " +
    -                                 PackingList.getItemList().size());
    -             }
    -         } catch (ArrayIndexOutOfBoundsException e) {
    -             return new IncorrectCommand("Invalid Input Variables",
    -                     PackCommand.HELP_MSG);
    -         } catch (InvalidVariablesException e) {
    -             if (quantityNotPacked == 0) {
    -                 return new IncorrectCommand("Invalid Pack Usage",
    -                         "This item is fully packed");
    -             }
    -             return new IncorrectCommand("Invalid Input Quantity",
    -                     "Try to input a positive quantity that is at most "
    -                             + quantityNotPacked + " to be packed");
    -         }
    -     }
    - 
    -     /**
    -      * Attempts to create PackCommand object to be executed where it is called from
    -      *
    -      * @return PackCommand the command to be executed to Pack an item in the packing list, else
    -      *              an IncorrectCommand is created to be executed
    -      */
    - 
    -     public static String[] getPackVariables() throws InvalidIndexException {
    -         String[] inputStringList = fullInput.trim().split(" ", 2);
    -         String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+");
    -         if (Integer.parseInt(inputVariables[1]) < 1 | Integer.parseInt(inputVariables[1])
    -                 > PackingList.getItemList().size()) {
    -             throw new InvalidIndexException();
    -         }
    -         return inputVariables;
    -     }
    - 
    -     public static int getPackAllIndex() throws InvalidIndexException {
    -         String[] inputStringList = fullInput.trim().split("/", 2);
    -         inputStringList = inputStringList[1].split(" ", 2);
    -         int itemIndex = Integer.parseInt(inputStringList[1]);
    - 
    -         if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) {
    -             throw new InvalidIndexException();
    -         }
    - 
    -         return itemIndex;
    -     }
    - 
    -     public static Command createPackAllObj() {
    -         int quantityNotPacked = 0;
    - 
    -         try {
    -             int itemIndex = getPackAllIndex();
    - 
    -             quantityNotPacked = PackingList.get(itemIndex - 1).getUnpackedQuantity();
    - 
    -             return new PackAllCommand(itemIndex);
    -         } catch (NumberFormatException | InvalidIndexException e) {
    -             if (PackingList.getItemList().size() == 0) {
    -                 return new IncorrectCommand("Invalid Item Index",
    -                         "Your packing list is empty, there is nothing to pack");
    -             } else {
    -                 return new IncorrectCommand("Invalid Item Index",
    -                         "Try to input a positive integer number that is at most " +
    -                                 PackingList.getItemList().size());
    -             }
    -         } catch (ArrayIndexOutOfBoundsException e) {
    -             return new IncorrectCommand("Invalid Input Variables",
    -                     PackCommand.HELP_MSG);
    -         }
    -     }
    - 
    - 
    -     /**
    -      * Attempts to create UnpackCommand object to be executed where it is called from
    -      *
    -      * @return UnpackCommand the command to be executed to unpack an item in the packing list, else
    -      *              an IncorrectCommand is created to be executed
    -      */
    -     public static Command createUnpackObj() {
    -         int quantityPacked = 0;
    -         try {
    -             String[] quantityAndIndex = getPackVariables();
    -             int itemQuantity = Integer.parseInt(quantityAndIndex[0]);
    -             if (itemQuantity <= 0) {
    -                 return new IncorrectCommand("Invalid Item Quantity", "Your item quantity should " +
    -                         "be greater than 0");
    -             }
    - 
    -             int itemIndex = Integer.parseInt(quantityAndIndex[1]);
    - 
    -             if (itemIndex > PackingList.getItemList().size()) {
    -                 return new IncorrectCommand("Invalid Item Index",
    -                         "Try to input a positive integer number that does not exceed " +
    -                                 PackingList.getItemList().size());
    -             }
    - 
    - 
    -             quantityPacked = PackingList.get(itemIndex - 1).getPackedQuantity();
    -             if (itemQuantity < 1 | itemQuantity > quantityPacked) {
    -                 throw new InvalidVariablesException();
    -             }
    - 
    -             return new UnpackCommand(itemQuantity, itemIndex);
    -         } catch (NumberFormatException | InvalidIndexException e) {
    -             if (PackingList.getItemList().size() == 0) {
    -                 return new IncorrectCommand("Invalid Item Index",
    -                         "Your packing list is empty, there is nothing to unpack");
    -             } else {
    -                 return new IncorrectCommand("Invalid Item Index",
    -                         "Try to input a positive item index number that is at most " +
    -                                 PackingList.getItemList().size());
    -             }
    -         } catch (ArrayIndexOutOfBoundsException e) {
    -             return new IncorrectCommand("Invalid Input Variables",
    -                     UnpackCommand.HELP_MSG);
    -         } catch (InvalidVariablesException e) {
    -             if (quantityPacked == 0) {
    -                 return new IncorrectCommand("Invalid Unpack Usage",
    -                         "This item is not even packed yet");
    -             }
    -             return new IncorrectCommand("Invalid Input Quantity",
    -                     "Try to input a positive quantity that does not exceed " + quantityPacked);
    -         }
    -     }
    - 
    -     public static Command listCommand() {
    -         return new ListCommand();
    -     }
    - 
    -     public static Command createDeletelistObj() {
    -         return new DeleteListCommand();
    -     }
    - 
    -     private static Command createHelpObj() {
    -         return new HelpCommand();
    -     }
    - 
    -     private static Command createByeObj() {
    -         return new ByeCommand();
    -     }
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-4/sources/source-2.html b/htmlReport/ns-4/sources/source-2.html deleted file mode 100644 index ba02e887a5..0000000000 --- a/htmlReport/ns-4/sources/source-2.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - Coverage Report > Storage - - - - - - -
    - - -

    Coverage Summary for Class: Storage (bagpacker.iohandler)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    Storage - - 0% - - - (0/1) - - - - 0% - - - (0/5) - - - - 0% - - - (0/20) - -
    - -
    -
    - - -
    - package bagpacker.iohandler;
    - 
    - import bagpacker.packingfunc.Item;
    - import bagpacker.packingfunc.PackingList;
    - 
    - import java.io.File;
    - import java.io.FileNotFoundException;
    - import java.io.FileWriter;
    - import java.io.IOException;
    - import java.util.Scanner;
    - 
    - /**
    -  * Storage class contains methods to save and retrieve saved packing list in txt file
    -  */
    - public class Storage {
    - 
    -     private static final String FILE_PATH = "packing_list.txt";
    - 
    -     /**
    -      * Loads packingList with items saved in save file
    -      * @throws FileNotFoundException when no save file in directory FILE_PATH is found
    -      */
    -     public static void load() throws FileNotFoundException {
    -         Scanner reader = new Scanner(new File(FILE_PATH));
    -         String line;
    -         while (reader.hasNext()) {
    -             line = reader.nextLine();
    -             PackingList.getItemList().add(readItem(line));
    -         }
    -     }
    - 
    -     /**
    -      * Returns an item with details saved in save file
    -      * @param line line from save file
    -      * @return item containing relevant packedQuantity, totalQuantity and item description
    -      */
    -     private static Item readItem(String line) {
    -         int openBracketIndex = line.indexOf('[');
    -         int forwardSlashIndex = line.indexOf('/');
    -         int closeBracketIndex = line.indexOf(']');
    - 
    -         // packedQuantity of an item is integer form of number after '[' and before '/'
    -         int packedQuantity = Integer.parseInt(line.substring(openBracketIndex + 1, forwardSlashIndex));
    - 
    -         // totalQuantity of an item is integer form of number after '/' and before ']'
    -         int totalQuantity = Integer.parseInt(line.substring(forwardSlashIndex + 1, closeBracketIndex));
    - 
    -         // itemDesc will be after '] '
    -         String itemDesc = line.substring(line.indexOf(']') + 2);
    -         return new Item(totalQuantity, packedQuantity, itemDesc);
    -     }
    - 
    -     /**
    -      * saves current list of items onto file directory FILE_PATH
    -      * @param packingList list of items used by user
    -      */
    -     public static void save(PackingList packingList) {
    -         try {
    -             writeToFile(packingList);
    -         } catch (IOException e) {
    -             System.out.println("Something went wrong: " + e.getMessage());
    -         }
    -     }
    - 
    -     public static void writeToFile(PackingList packingList) throws IOException {
    -         FileWriter fw = new FileWriter(FILE_PATH);
    -         for (int i = 0; i < packingList.size(); i++) {
    -             fw.write(PackingList.get(i).toString() + "\n");
    -         }
    -         fw.close();
    -     }
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-4/sources/source-3.html b/htmlReport/ns-4/sources/source-3.html deleted file mode 100644 index 0bc0fbc18e..0000000000 --- a/htmlReport/ns-4/sources/source-3.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - Coverage Report > Ui - - - - - - -
    - - -

    Coverage Summary for Class: Ui (bagpacker.iohandler)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    Ui - - 100% - - - (1/1) - - - - 54.5% - - - (6/11) - - - - 68.8% - - - (22/32) - -
    - -
    -
    - - -
    - package bagpacker.iohandler;
    - 
    - 
    - import bagpacker.commands.AddCommand;
    - import bagpacker.commands.ByeCommand;
    - import bagpacker.commands.DeleteCommand;
    - import bagpacker.commands.DeleteListCommand;
    - import bagpacker.commands.ListCommand;
    - import bagpacker.commands.PackAllCommand;
    - import bagpacker.commands.PackCommand;
    - import bagpacker.commands.UnpackCommand;
    - 
    - /**
    -  * Ui class contains methods to print messages to user interface on Command Line Interface
    -  */
    - public class Ui {
    -     public static String logo = " ____              _____           _\n"
    -             + "|  _ \\            |  __ \\         | |\n"
    -             + "| |_) | __ _  __ _| |__) |_ _  ___| | _____ _ __\n"
    -             + "|  _ < / _` |/ _` |  ___/ _` |/ __| |/ / _ \\ '__|\n"
    -             + "| |_) | (_| | (_| | |  | (_| | (__|   <  __/ |\n"
    -             + "|____/ \\__,_|\\__, |_|   \\__,_|\\___|_|\\_\\___|_|\n"
    -             + "              __/ |\n"
    -             + "             |___/\n";
    -     private static final String RETURN_USER_GREET = "Welcome back, User!";
    -     private static final String NEW_USER_GREET = "No save files detected. Hello new user!";
    - 
    -     public static void printErrorLine() {
    -         System.out.println("/////////////////////////////////////////////////////////////");
    -     }
    - 
    -     public static void printLine() {
    -         System.out.println("____________________________________________________________");
    -     }
    - 
    -     /**
    -      * Prints initialising Message
    -      */
    -     public static void initialMessage() {
    -         printLine();
    -         System.out.println("Hi this is,\n" + logo);
    -         System.out.println("Enter \"help\" to find out how to use BagPacker");
    -         printLine();
    -     }
    - 
    -     /**
    -      * Prints goodbye Message
    -      */
    -     public static void goodbyeMessage() {
    -         printLine();
    -         System.out.println("Bye thanks for using,\n" + logo);
    -         printLine();
    -     }
    - 
    -     /**
    -      * Prints Error Message with the type of error and a helping message
    -      *
    -      * @param errorType   the type of error (e.g. invalid integer input)
    -      * @param helpMessage a message to help the user (e.g. try to input a whole number digit)
    -      */
    -     public static void errorMessage(String errorType, String helpMessage) {
    -         printErrorLine();
    -         System.out.print("Error " + errorType);
    -         System.out.println(":\n" + helpMessage);
    -         printErrorLine();
    -     }
    - 
    -     /**
    -      * Prints help message
    -      */
    -     public static void helpMessage() {
    -         printLine();
    -         System.out.println("All Commands:");
    -         System.out.println("1. " + AddCommand.HELP_MSG);
    -         System.out.println("2. " + DeleteCommand.HELP_MSG);
    -         System.out.println("3. " + ListCommand.HELP_MSG);
    -         System.out.println("4. " + PackCommand.HELP_MSG);
    -         System.out.println("5. " + UnpackCommand.HELP_MSG);
    -         System.out.println("6. " + DeleteListCommand.HELP_MSG);
    -         System.out.println("7. " + PackAllCommand.HELP_MSG);
    -         System.out.println("8. " + ByeCommand.HELP_MSG);
    -         printLine();
    -     }
    - 
    -     /**
    -      * Prints messages(s) to the user
    -      *
    -      * @param message Message to be shown to the user
    -      */
    -     public static void printToUser(String... message) {
    -         printLine();
    -         for (String m : message) {
    -             System.out.println(m);
    -         }
    -         printLine();
    -     }
    - 
    -     public static void showUserReturn() {
    -         printToUser(RETURN_USER_GREET);
    -     }
    - 
    -     public static void showNewUser() {
    -         printToUser(NEW_USER_GREET);
    -     }
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-5/index.html b/htmlReport/ns-5/index.html deleted file mode 100644 index 307369d9af..0000000000 --- a/htmlReport/ns-5/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.packingfunc

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Item - - 100% - - - (1/1) - - - - 90% - - - (9/10) - - - - 75% - - - (12/16) - -
    PackingList - - 100% - - - (1/1) - - - - 100% - - - (13/13) - - - - 100% - - - (24/24) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_BLOCK.html b/htmlReport/ns-5/index_SORT_BY_BLOCK.html deleted file mode 100644 index a1f65fc0c9..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_BLOCK.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.packingfunc

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Item - - 100% - - - (1/1) - - - - 90% - - - (9/10) - - - - 75% - - - (12/16) - -
    PackingList - - 100% - - - (1/1) - - - - 100% - - - (13/13) - - - - 100% - - - (24/24) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html b/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html deleted file mode 100644 index 7916507655..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_BLOCK_DESC.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.packingfunc

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    PackingList - - 100% - - - (1/1) - - - - 100% - - - (13/13) - - - - 100% - - - (24/24) - -
    Item - - 100% - - - (1/1) - - - - 90% - - - (9/10) - - - - 75% - - - (12/16) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_CLASS.html b/htmlReport/ns-5/index_SORT_BY_CLASS.html deleted file mode 100644 index 40f40f3307..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_CLASS.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.packingfunc

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Item - - 100% - - - (1/1) - - - - 90% - - - (9/10) - - - - 75% - - - (12/16) - -
    PackingList - - 100% - - - (1/1) - - - - 100% - - - (13/13) - - - - 100% - - - (24/24) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html b/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html deleted file mode 100644 index bc7e7d5afd..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_CLASS_DESC.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.packingfunc

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    PackingList - - 100% - - - (1/1) - - - - 100% - - - (13/13) - - - - 100% - - - (24/24) - -
    Item - - 100% - - - (1/1) - - - - 90% - - - (9/10) - - - - 75% - - - (12/16) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_LINE.html b/htmlReport/ns-5/index_SORT_BY_LINE.html deleted file mode 100644 index 401905c10e..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_LINE.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.packingfunc

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Item - - 100% - - - (1/1) - - - - 90% - - - (9/10) - - - - 75% - - - (12/16) - -
    PackingList - - 100% - - - (1/1) - - - - 100% - - - (13/13) - - - - 100% - - - (24/24) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html b/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html deleted file mode 100644 index 04d3dc29a7..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_LINE_DESC.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.packingfunc

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    PackingList - - 100% - - - (1/1) - - - - 100% - - - (13/13) - - - - 100% - - - (24/24) - -
    Item - - 100% - - - (1/1) - - - - 90% - - - (9/10) - - - - 75% - - - (12/16) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_METHOD.html b/htmlReport/ns-5/index_SORT_BY_METHOD.html deleted file mode 100644 index 4e35e93cfa..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_METHOD.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.packingfunc

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    Item - - 100% - - - (1/1) - - - - 90% - - - (9/10) - - - - 75% - - - (12/16) - -
    PackingList - - 100% - - - (1/1) - - - - 100% - - - (13/13) - - - - 100% - - - (24/24) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html b/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html deleted file mode 100644 index d60fe517ef..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_METHOD_DESC.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.packingfunc

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    PackingList - - 100% - - - (1/1) - - - - 100% - - - (13/13) - - - - 100% - - - (24/24) - -
    Item - - 100% - - - (1/1) - - - - 90% - - - (9/10) - - - - 75% - - - (12/16) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html b/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html deleted file mode 100644 index e6fbefa869..0000000000 --- a/htmlReport/ns-5/index_SORT_BY_NAME_DESC.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Coverage Report > bagpacker.packingfunc - - - - - - -
    - - - -

    Coverage Summary for Package: bagpacker.packingfunc

    - - - - - - - - - - - - - -
    Package - Class, % - - Method, % - - Line, % -
    bagpacker.packingfunc - - 100% - - - (2/2) - - - - 95.7% - - - (22/23) - - - - 90% - - - (36/40) - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - -
    -Class - Class, % - - Method, % - - Line, % -
    PackingList - - 100% - - - (1/1) - - - - 100% - - - (13/13) - - - - 100% - - - (24/24) - -
    Item - - 100% - - - (1/1) - - - - 90% - - - (9/10) - - - - 75% - - - (12/16) - -
    - -
    - - - - - - diff --git a/htmlReport/ns-5/sources/source-1.html b/htmlReport/ns-5/sources/source-1.html deleted file mode 100644 index 8b8ee4c3d2..0000000000 --- a/htmlReport/ns-5/sources/source-1.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - Coverage Report > Item - - - - - - -
    - - -

    Coverage Summary for Class: Item (bagpacker.packingfunc)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    Item - - 100% - - - (1/1) - - - - 90% - - - (9/10) - - - - 75% - - - (12/16) - -
    - -
    -
    - - -
    - package bagpacker.packingfunc;
    - 
    - /**
    -  * Item class used to store information about item
    -  * Items to be packed can be saved in PackingList class
    -  */
    - public class Item {
    -     private final String itemName;
    - 
    -     private int packedQuantity;
    - 
    -     private int totalQuantity;
    - 
    -     /**
    -      * Constructor of an Item class used in @AddCommand
    -      * @param quantity no. of items user wants to pack
    -      * @param description name of the item
    -      */
    -     public Item(int quantity, String description) {
    -         this.itemName = description;
    -         packedQuantity = 0;
    -         this.totalQuantity = quantity;
    -     }
    - 
    -     /**
    -      * Constructor of an Item class used in @Storage
    -      * @param totalQuantity total no. of items needed to pack shown in save file
    -      * @param packedQuantity no. of items currently packed shown in the save file
    -      * @param description name of item to be packed shown in save file
    -      */
    -     public Item(int totalQuantity, int packedQuantity, String description) {
    -         itemName = description;
    -         this.packedQuantity = packedQuantity;
    -         this.totalQuantity = totalQuantity;
    -     }
    - 
    -     public int getTotalQuantity() {
    -         return totalQuantity;
    -     }
    - 
    -     public int getPackedQuantity() {
    -         return packedQuantity;
    -     }
    -     public void setTotalQuantity(int totalQuantity) {
    -         this.totalQuantity = totalQuantity;
    -     }
    - 
    -     public int getUnpackedQuantity() {
    -         return totalQuantity - packedQuantity;
    -     }
    - 
    -     public String getItemName() {
    -         return itemName;
    -     }
    - 
    -     public void setPacked(int quantity) {
    -         this.packedQuantity += quantity;
    -     }
    - 
    -     public void setUnpacked(int quantity) {
    -         this.packedQuantity -= quantity;
    -     }
    - 
    -     public String toString() {
    -         return "[" + packedQuantity + "/" + totalQuantity + "] " + this.getItemName();
    -     }
    - }
    -
    -
    -
    - - - - - - diff --git a/htmlReport/ns-5/sources/source-2.html b/htmlReport/ns-5/sources/source-2.html deleted file mode 100644 index 6455be56af..0000000000 --- a/htmlReport/ns-5/sources/source-2.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - Coverage Report > PackingList - - - - - - -
    - - -

    Coverage Summary for Class: PackingList (bagpacker.packingfunc)

    - - - - - - - - - - - - - - - -
    Class - Class, % - - Method, % - - Line, % -
    PackingList - - 100% - - - (1/1) - - - - 100% - - - (13/13) - - - - 100% - - - (24/24) - -
    - -
    -
    - - -
    - package bagpacker.packingfunc;
    - import java.util.ArrayList;
    - 
    - /**
    -  * PackingList class contains methods to manipulate the users packing list
    -  */
    - public class PackingList {
    -     private static ArrayList<Item> itemList = new ArrayList<>();
    - 
    -     /***
    -      * Checks if item of the same name as itemName is found in the current packing list
    -      *
    -      * @param itemName
    -      * @return true if item of same name as itemName is found else false
    -      */
    -     public static boolean itemFinder(String itemName) {
    -         for (Item item : itemList) {
    -             if (itemName.equals(item.getItemName())) {
    -                 return true;
    -             }
    -         }
    -         return false;
    -     }
    - 
    -     /***
    -      * getExistingItem returns the object of type Item of the same name as input itemName
    -      *
    -      * this should only be called after checking that item does exist in the itemList
    -      *
    -      * @param itemName
    -      * @return item of the name itemName
    -      */
    -     public static Item getExistingItem(String itemName) {
    -         Item existingItem = null;
    -         for (int i = 0; i < itemList.size(); i++) {
    -             if (itemName.equals(itemList.get(i).getItemName())) {
    -                 existingItem = itemList.get(i);
    -             }
    -         }
    -         assert(existingItem != null);
    -         return existingItem;
    -     }
    -     /***
    -      * Adds the added quantity to the current total quantity of an item in the itemList
    -      *
    -      * @param itemName name of the item to add total quantity to be packed
    -      * @param addQty the quantity to add to the old total
    -      */
    -     public static void addToItemQuantity(String itemName, int addQty) {
    -         Item itemToAdd = getExistingItem(itemName);
    -         int totalQuantity = itemToAdd.getTotalQuantity();
    -         itemToAdd.setTotalQuantity(totalQuantity + addQty);
    -     }
    - 
    -     public static void setItemList(ArrayList<Item> itemList) {
    -         PackingList.itemList = itemList;
    -     }
    - 
    -     /**
    -      * Getter for itemList
    -      *
    -      * @return list of items
    -      */
    -     public static ArrayList<Item> getItemList() {
    -         return itemList;
    -     }
    - 
    -     /**
    -      * Adds an item to the list.
    -      */
    -     public void addItem(Item toAdd) {
    -         itemList.add(toAdd);
    -     }
    - 
    -     /**
    -      * Removes an item from the list.
    -      */
    -     public void deleteItem(Item toDelete) {
    -         itemList.remove(toDelete);
    -     }
    - 
    -     /**
    -      * Marks an item as packed in the list.
    -      */
    -     public void packItem(Item toPack, int quantity) {
    -         toPack.setPacked(quantity);
    -     }
    - 
    -     /**
    -      * Marks an item as unpacked in the list.
    -      */
    -     public void unpackItem(Item toPack, int quantity) {
    -         toPack.setUnpacked(quantity);
    -     }
    - 
    -     public static Item get(int targetIndex) {
    -         return itemList.get(targetIndex);
    -     }
    - 
    -     /**
    -      * Returns size of packing list
    -      */
    -     public int size() {
    -         return itemList.size();
    -     }
    - 
    - 
    - }
    -
    -
    -
    - - - - - - From 5225b4e52832466422ead406b8a30e37f3aaa3cb Mon Sep 17 00:00:00 2001 From: linuspuah Date: Tue, 4 Apr 2023 12:09:47 +0800 Subject: [PATCH 095/207] Update runtest.bat expected output --- text-ui-test/EXPECTED.TXT | 3 +++ 1 file changed, 3 insertions(+) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index e555e99a30..5d12e64eee 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -12,6 +12,9 @@ Hi this is, Enter "help" to find out how to use BagPacker ____________________________________________________________ ____________________________________________________________ +No save files detected. Hello new user! +____________________________________________________________ +____________________________________________________________ Bye thanks for using, ____ _____ _ | _ \ | __ \ | | From 758b41455cf90081342cde9424bc465178df88b8 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Tue, 4 Apr 2023 12:12:39 +0800 Subject: [PATCH 096/207] Update Unix expected test output --- text-ui-test/EXPECTED-UNIX.TXT | 1 + 1 file changed, 1 insertion(+) diff --git a/text-ui-test/EXPECTED-UNIX.TXT b/text-ui-test/EXPECTED-UNIX.TXT index e555e99a30..a65710dec7 100644 --- a/text-ui-test/EXPECTED-UNIX.TXT +++ b/text-ui-test/EXPECTED-UNIX.TXT @@ -11,6 +11,7 @@ Hi this is, Enter "help" to find out how to use BagPacker ____________________________________________________________ +No save files detected. Hello new user! ____________________________________________________________ Bye thanks for using, ____ _____ _ From 3f23dd3b665ede5b94754e1be85949dd8e70e19a Mon Sep 17 00:00:00 2001 From: linuspuah Date: Tue, 4 Apr 2023 12:37:15 +0800 Subject: [PATCH 097/207] Empty input and expected text ui testing --- text-ui-test/EXPECTED-UNIX.TXT | 26 -------------------------- text-ui-test/EXPECTED.TXT | 28 ---------------------------- text-ui-test/input.txt | 2 +- 3 files changed, 1 insertion(+), 55 deletions(-) diff --git a/text-ui-test/EXPECTED-UNIX.TXT b/text-ui-test/EXPECTED-UNIX.TXT index a65710dec7..e69de29bb2 100644 --- a/text-ui-test/EXPECTED-UNIX.TXT +++ b/text-ui-test/EXPECTED-UNIX.TXT @@ -1,26 +0,0 @@ -____________________________________________________________ -Hi this is, - ____ _____ _ -| _ \ | __ \ | | -| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ -| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| -| |_) | (_| | (_| | | | (_| | (__| < __/ | -|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| - __/ | - |___/ - -Enter "help" to find out how to use BagPacker -____________________________________________________________ -No save files detected. Hello new user! -____________________________________________________________ -Bye thanks for using, - ____ _____ _ -| _ \ | __ \ | | -| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ -| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| -| |_) | (_| | (_| | | | (_| | (__| < __/ | -|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| - __/ | - |___/ - -____________________________________________________________ diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 5d12e64eee..e69de29bb2 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,28 +0,0 @@ -____________________________________________________________ -Hi this is, - ____ _____ _ -| _ \ | __ \ | | -| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ -| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| -| |_) | (_| | (_| | | | (_| | (__| < __/ | -|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| - __/ | - |___/ - -Enter "help" to find out how to use BagPacker -____________________________________________________________ -____________________________________________________________ -No save files detected. Hello new user! -____________________________________________________________ -____________________________________________________________ -Bye thanks for using, - ____ _____ _ -| _ \ | __ \ | | -| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ -| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| -| |_) | (_| | (_| | | | (_| | (__| < __/ | -|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| - __/ | - |___/ - -____________________________________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index b023018cab..8b13789179 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +1 @@ -bye + From 5c1f9baa96d0ba5f2559613d4c8416128875fba4 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Tue, 4 Apr 2023 12:40:29 +0800 Subject: [PATCH 098/207] Revert "Empty input and expected text ui testing" This reverts commit 3f23dd3b665ede5b94754e1be85949dd8e70e19a. --- text-ui-test/EXPECTED-UNIX.TXT | 26 ++++++++++++++++++++++++++ text-ui-test/EXPECTED.TXT | 28 ++++++++++++++++++++++++++++ text-ui-test/input.txt | 2 +- 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/text-ui-test/EXPECTED-UNIX.TXT b/text-ui-test/EXPECTED-UNIX.TXT index e69de29bb2..a65710dec7 100644 --- a/text-ui-test/EXPECTED-UNIX.TXT +++ b/text-ui-test/EXPECTED-UNIX.TXT @@ -0,0 +1,26 @@ +____________________________________________________________ +Hi this is, + ____ _____ _ +| _ \ | __ \ | | +| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ +| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| +| |_) | (_| | (_| | | | (_| | (__| < __/ | +|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ + +Enter "help" to find out how to use BagPacker +____________________________________________________________ +No save files detected. Hello new user! +____________________________________________________________ +Bye thanks for using, + ____ _____ _ +| _ \ | __ \ | | +| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ +| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| +| |_) | (_| | (_| | | | (_| | (__| < __/ | +|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ + +____________________________________________________________ diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index e69de29bb2..5d12e64eee 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -0,0 +1,28 @@ +____________________________________________________________ +Hi this is, + ____ _____ _ +| _ \ | __ \ | | +| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ +| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| +| |_) | (_| | (_| | | | (_| | (__| < __/ | +|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ + +Enter "help" to find out how to use BagPacker +____________________________________________________________ +____________________________________________________________ +No save files detected. Hello new user! +____________________________________________________________ +____________________________________________________________ +Bye thanks for using, + ____ _____ _ +| _ \ | __ \ | | +| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ +| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| +| |_) | (_| | (_| | | | (_| | (__| < __/ | +|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ + +____________________________________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 8b13789179..b023018cab 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +1 @@ - +bye From 333be3e3fc566e8ffbf84573453a07f07f4f30fd Mon Sep 17 00:00:00 2001 From: coregano Date: Tue, 4 Apr 2023 13:06:03 +0800 Subject: [PATCH 099/207] fix - code violations removed to pass checkstyle --- src/main/java/bagpacker/commands/FindCommand.java | 4 ++-- src/main/java/bagpacker/iohandler/Parser.java | 13 ++++++++++++- src/main/java/bagpacker/iohandler/Ui.java | 13 +++++++++---- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/java/bagpacker/commands/FindCommand.java b/src/main/java/bagpacker/commands/FindCommand.java index 50a022dec5..053aa35f65 100644 --- a/src/main/java/bagpacker/commands/FindCommand.java +++ b/src/main/java/bagpacker/commands/FindCommand.java @@ -3,7 +3,6 @@ import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; -import java.lang.reflect.Array; import java.util.ArrayList; import static bagpacker.iohandler.Ui.printToUser; @@ -13,7 +12,8 @@ public class FindCommand extends Command { "find: Displays all items in the packingList as a list that contains tha keyword used in the command.\n" + "Example: find jacket"; private static final String MSG_FIND_HEADER = "There are %d items(s) in your list containing %s: "; - private static final String MSG_NO_FOUND_ITEM = "An item containing the description %s does not exist. Please try again."; + private static final String MSG_NO_FOUND_ITEM = + "An item containing the description %s does not exist. Please try again."; private static String keyword; public FindCommand(String keyword) { diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index e4ec421455..b7c416a8f4 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -1,7 +1,18 @@ package bagpacker.iohandler; +import bagpacker.commands.Command; +import bagpacker.commands.AddCommand; +import bagpacker.commands.DeleteCommand; +import bagpacker.commands.ListCommand; +import bagpacker.commands.PackCommand; +import bagpacker.commands.UnpackCommand; +import bagpacker.commands.DeleteListCommand; +import bagpacker.commands.PackAllCommand; +import bagpacker.commands.FindCommand; +import bagpacker.commands.ByeCommand; +import bagpacker.commands.IncorrectCommand; +import bagpacker.commands.HelpCommand; -import bagpacker.commands.*; import bagpacker.exception.EmptyInputException; import bagpacker.exception.InvalidIndexException; import bagpacker.exception.InvalidVariablesException; diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index cc10169c74..6b8487a075 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -1,9 +1,14 @@ package bagpacker.iohandler; - -import bagpacker.commands.*; - -import java.util.ArrayList; +import bagpacker.commands.AddCommand; +import bagpacker.commands.DeleteCommand; +import bagpacker.commands.ListCommand; +import bagpacker.commands.PackCommand; +import bagpacker.commands.UnpackCommand; +import bagpacker.commands.DeleteListCommand; +import bagpacker.commands.PackAllCommand; +import bagpacker.commands.FindCommand; +import bagpacker.commands.ByeCommand; /** * Ui class contains methods to print messages to user interface on Command Line Interface From cbe5d81f66746e4f232a8c4d3cc3ef1cb4741a74 Mon Sep 17 00:00:00 2001 From: Sophie Date: Tue, 4 Apr 2023 21:11:15 +0800 Subject: [PATCH 100/207] Update packall --- docs/DeveloperGuide.md | 9 ++-- docs/UserGuide.md | 46 ++++++++++++++----- src/main/java/bagpacker/iohandler/Parser.java | 2 +- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index b2d090df5a..82de8d8de1 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -67,12 +67,15 @@ All Commands: 4. pack : Adds to the current quantity of items packed in the packing list. Example: pack 2 /of 3 Meaning: packs 2 more quantities of the third item in the packing list -5. unpack : Deducts from the current quantity of items packed in the packing list. +5. packkall: Marks all quantity of the specified item as packed in the packing list. + Example: packall /of 3 + Meaning: packs all of the quantities of the third item in the packing list. +6. unpack : Deducts from the current quantity of items packed in the packing list. Example: unpack 1 /of 2 Meaning: unpacks 1 quantity of the second item in the packing list -6. deletelist : Deletes all items in the packing list. +7. deletelist : Deletes all items in the packing list. Example: deletelist -7. bye : Stops the BagPacker Application +8. bye : Stops the BagPacker Application Example: bye ____________________________________________________________ diff --git a/docs/UserGuide.md b/docs/UserGuide.md index be35253194..c52ba461fd 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -9,6 +9,7 @@ * [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) * [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) * [Packing some items](#span-stylecolor6495ed-packing-some-items--span-pack) + * [Packing all quantity of items](#span-stylecolor6495ed-marking-total-quantity-of-item-as-packed--span-packall) * [Unpacking some items](#span-stylecolor6495ed-unpacking-some-items--span-unpack) * [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) * [Deleting the entire list](#span-stylecolor6495ed-deleting-the-entire-list--span-deletelist) @@ -28,7 +29,6 @@ Users can add items of multiple quantities to their packing list, delete items, ## Quick Start -#### For Windows users: 1. Ensure that you have Java 11 installed. * If not, please follow the instructions here for [Windows](https://docs.oracle.com/en/java/javase/11/install/installation-jdk-microsoft-windows-platforms.html#GUID-A7E27B90-A28D-4237-9383-A58B416071CA) and [macOS](https://docs.oracle.com/en/java/javase/11/install/installation-jdk-macos.html#GUID-2FE451B0-9572-4E38-A1A5-568B77B146DE) 2. Download the `jar` file from the **latest release** [here](https://github.com/AY2223S2-CS2113-T14-2/tp/releases) @@ -90,6 +90,27 @@ Format: `pack QUANTITY /of INDEX` Examples of usage: * `pack 3 /of 1` +### Marking total quantity of item as packed: `packall` +Packs the total quantity of that item in the packing list. + +Format: `packall /of INDEX` + +* `INDEX` is the index of the item that is being packed. + * It must be a positive integer that is more than 0, but no more than the number of items in the list. + * An invalid `INDEX` will result in an error message. + +
    Example of usage:
    + +`packall /of 3` + +
    Expected outcome:
    + +BagPacker will mark all of the quantities of the third item in the packing list as 'packed' + +``` +Item packed: [20/20] socks +``` + ### Unpacking some items: `unpack` Unpacks the given amount of that item in the packing list. @@ -102,7 +123,7 @@ Format: `unpack QUANTITY /of INDEX` * It must be a positive integer that is more than 0, but no more than the number of items in the list. * An invalid `INDEX` will result in an error message. -Examples of usage: +Example of usage: * `unpack 2 /of 5` ### Listing all items: `list` @@ -169,15 +190,16 @@ Examples of usage: ## Command Summary -| Action description | Syntax | Remarks | -|:----------------------|:----------------------------|:---------------------------------------------------------------------------------------------------------------------------------| -| Add an item | `add QUANTITY /of NAME` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000 | -| Delete an item | `delete INDEX` | `INDEX` must be a valid list index | -| Pack some of an item | `pack QUANTITY /of INDEX` |
  • Adding `QUANTITY` should not cause the quantity to exceed the total quantity
  • `INDEX` must be a valid list index
  • | -| Unpack some item | `unpack QUANTITY /of INDEX` |
  • Subtracting `QUANTITY` should not cause the quantity to be less than 0
  • `INDEX` must be a valid list index
  • | | -| List all items | `list` | Additional parameters will be ignored | -| Delete the whole list | `deletelist` | Additional parameters will be ignored | -| Help message | `help` | Additional parameters will be ignored | -| Exit | `bye` | Additional parameters will be ignored | +| Action description | Syntax | Remarks | +|:-----------------------------------------|:----------------------------|:---------------------------------------------------------------------------------------------------------------------------------| +| Add an item | `add QUANTITY /of NAME` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000 | +| Delete an item | `delete INDEX` | `INDEX` must be a valid list index | +| Pack some of an item | `pack QUANTITY /of INDEX` |
  • Adding `QUANTITY` should not cause the quantity to exceed the total quantity
  • `INDEX` must be a valid list index
  • | +| Marking total quantity of item as packed | `packall /of INDEX` | `INDEX` must be a valid list index | +| Unpack some item | `unpack QUANTITY /of INDEX` |
  • Subtracting `QUANTITY` should not cause the quantity to be less than 0
  • `INDEX` must be a valid list index
  • | +| List all items | `list` | Additional parameters will be ignored | +| Delete the whole list | `deletelist` | Additional parameters will be ignored | +| Help message | `help` | Additional parameters will be ignored | +| Exit | `bye` | Additional parameters will be ignored | [Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [Go to Features](#span-stylecolor00a36c-table-of-contents-span) \ No newline at end of file diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index b7c416a8f4..cc578ca4b2 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -376,7 +376,7 @@ public static Command createPackAllObj() { } } catch (ArrayIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid Input Variables", - PackCommand.HELP_MSG); + PackAllCommand.HELP_MSG); } } From af362e00856f86700d25f0afe2367758f8a51dd5 Mon Sep 17 00:00:00 2001 From: Sophie Date: Tue, 4 Apr 2023 21:23:40 +0800 Subject: [PATCH 101/207] Work on [PE-D][Tester C] Suggestions for UG #117 --- docs/UserGuide.md | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index c52ba461fd..9be3c45639 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -59,10 +59,24 @@ Format: `add QUANTITY /of NAME` * `NAME` is the name of the item to be packed. * `NAME` is case-sensitive. -Examples of usage: +
    Examples of usage:
    + * `add 3 /of jackets` + * `add 2 /of water bottles` +
    Expected outcomes:
    + +BagPacker will add a quantity of 3 jackets to the packing list + +``` +New item added: [0/3] jackets +``` +BagPacker will add a quantity of 2 water bottles to the packing list +``` +New item added: [0/2] water bottles +``` + ### Deleting an item: `delete` Deletes an item from the packing list. @@ -72,9 +86,18 @@ Format: `delete INDEX` * It must be more than 0, but no more than the number of items in the list. * An invalid index will result in an error message. -Examples of usage: +
    Example of usage:
    + * `delete 2` +
    Expected outcome:
    + +BagPacker will remove the second item from the packing list + +``` +[0/2] water bottles removed from the list +``` + ### Packing some items: `pack` Packs the given amount of that item in the packing list. From 216139aebe95bc0088139f1d68fe9762e97eebf9 Mon Sep 17 00:00:00 2001 From: coregano Date: Wed, 5 Apr 2023 14:25:20 +0800 Subject: [PATCH 102/207] IO fix test --- text-ui-test/EXPECTED-UNIX.TXT | 2 ++ 1 file changed, 2 insertions(+) diff --git a/text-ui-test/EXPECTED-UNIX.TXT b/text-ui-test/EXPECTED-UNIX.TXT index a65710dec7..5d12e64eee 100644 --- a/text-ui-test/EXPECTED-UNIX.TXT +++ b/text-ui-test/EXPECTED-UNIX.TXT @@ -11,8 +11,10 @@ Hi this is, Enter "help" to find out how to use BagPacker ____________________________________________________________ +____________________________________________________________ No save files detected. Hello new user! ____________________________________________________________ +____________________________________________________________ Bye thanks for using, ____ _____ _ | _ \ | __ \ | | From 2df36811ff2d2d68f6d9a8aa2d4550009314bf89 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Wed, 5 Apr 2023 14:41:48 +0800 Subject: [PATCH 103/207] Add feature EditQuantity to edit the total quantity of an item --- docs/UserGuide.md | 40 +++++++++---- .../commands/EditQuantityCommand.java | 29 ++++++++++ src/main/java/bagpacker/iohandler/Parser.java | 57 +++++++++++++++++-- .../bagpacker/packingfunc/PackingList.java | 6 ++ 4 files changed, 116 insertions(+), 16 deletions(-) create mode 100644 src/main/java/bagpacker/commands/EditQuantityCommand.java diff --git a/docs/UserGuide.md b/docs/UserGuide.md index be35253194..6c73969d04 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -10,6 +10,7 @@ * [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) * [Packing some items](#span-stylecolor6495ed-packing-some-items--span-pack) * [Unpacking some items](#span-stylecolor6495ed-unpacking-some-items--span-unpack) + * [Editing item quantity](#span-stylecolor6495ed-editing-item-quantity--span-editquantity) * [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) * [Deleting the entire list](#span-stylecolor6495ed-deleting-the-entire-list--span-deletelist) * [Help message](#span-stylecolor6495ed-help-message--span-help) @@ -28,7 +29,6 @@ Users can add items of multiple quantities to their packing list, delete items, ## Quick Start -#### For Windows users: 1. Ensure that you have Java 11 installed. * If not, please follow the instructions here for [Windows](https://docs.oracle.com/en/java/javase/11/install/installation-jdk-microsoft-windows-platforms.html#GUID-A7E27B90-A28D-4237-9383-A58B416071CA) and [macOS](https://docs.oracle.com/en/java/javase/11/install/installation-jdk-macos.html#GUID-2FE451B0-9572-4E38-A1A5-568B77B146DE) 2. Download the `jar` file from the **latest release** [here](https://github.com/AY2223S2-CS2113-T14-2/tp/releases) @@ -36,7 +36,7 @@ Users can add items of multiple quantities to their packing list, delete items, 4. Open a command line interface, and navigate to the directory with the `jar` file using the `cd` command. * For Windows users: search for Command Prompt, and launch it. * For macOS users: search for Terminal, and launch it. -6. Execute the following command `java -jar Team_Project.jar` +5. Execute the following command `java -jar Team_Project.jar` --- @@ -105,6 +105,23 @@ Format: `unpack QUANTITY /of INDEX` Examples of usage: * `unpack 2 /of 5` +### Editing item quantity: `editquantity` +Edits the total quantity of an item to be packed. + +Format: `editquantity QUANTITY /of INDEX` +* `QUANTITY` is the new total quantity of that item to be packed. + * It must be a positive integer + * It must be more than 0, but not more than 1 million (1,000,000). + * It must be at least the value of the current quantity packed. + * An invalid `QUANTITY` will result in an error message. +* `INDEX` is the index of the item that the total quantity will be changed. + * It must be a positive integer that is more than 0, but no more than the number of items in the list. + * An invalid `INDEX` will result in an error message. + +Examples of usage: +* `editquantity 200 /of 1` + + ### Listing all items: `list` Lists all the items in the packing list. * Includes the current packed quantity, the total quantity to be packed, and the name of the item. @@ -118,16 +135,17 @@ Examples of usage: Example output: ``` Here are the items in your list -1. [1000000/1000000] tooth -2. [0/1] toothpaste +1. [1000000/1000000] jackets +2. [0/5] water bottles ``` Format explanation: `ITEM_INDEX. [CURRENTLY_PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME` ### Deleting the entire list: `deletelist` -Want to start on a new packing list? This command will clear the whole packing list. -Be careful, this action is irreversible. +Deletes the whole packing list. + +>❗ This action is irreversible. Format: `deletelist` * This command is not expecting any parameters. Any additional parameters will be ignored. @@ -136,7 +154,7 @@ Example of usage: * `deletelist` ### Help message: `help` -Can't get the results you want? Refer to the help message to see which command should be used. +Displays a help message containing the command summary. Format: `help` * This command is not expecting any parameters. Any additional parameters will be ignored. @@ -145,7 +163,7 @@ Examples of usage: * `help` ### Exiting the application: `bye` -Done packing for today? Exit BagPacker and continue tomorrow! +Exits BagPacker and saves the packing list. Format: `bye` * This command is not expecting any parameters. Any additional parameters will be ignored. @@ -153,7 +171,7 @@ Format: `bye` Examples of usage: * `bye` -[Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [Go to Features](#span-stylecolor00a36c-table-of-contents-span) +[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [⏫ Go to Features](#span-stylecolor00a36c-table-of-contents-span) --- @@ -163,7 +181,7 @@ Examples of usage: **A**: Please check that there are no typos in the command. To check the correct spelling of the commands, please type `help` and hit enter. -[Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) +[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) --- @@ -180,4 +198,4 @@ Examples of usage: | Help message | `help` | Additional parameters will be ignored | | Exit | `bye` | Additional parameters will be ignored | -[Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [Go to Features](#span-stylecolor00a36c-table-of-contents-span) \ No newline at end of file +[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [⏫ Go to Features](#span-stylecolor00a36c-table-of-contents-span) \ No newline at end of file diff --git a/src/main/java/bagpacker/commands/EditQuantityCommand.java b/src/main/java/bagpacker/commands/EditQuantityCommand.java new file mode 100644 index 0000000000..bdae277bac --- /dev/null +++ b/src/main/java/bagpacker/commands/EditQuantityCommand.java @@ -0,0 +1,29 @@ +package bagpacker.commands; + +import bagpacker.iohandler.Ui; +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; + +public class EditQuantityCommand extends Command{ + public static final String MSG_SUCCESS_EDITQUANTITY = "Item total quantity edited: %s"; + + public static final String HELP_MSG = "editquantity: edit the total quantity of an item to be packed." + + "\tExample: editquantity 3 /of 2" + + "\tMeaning: change the total quantity of the second item to 3"; + + private static int totalQuantity; + + public EditQuantityCommand(int newTotalQuantity, int targetIndex) { + super(targetIndex); + totalQuantity = newTotalQuantity; + } + + @Override + public void execute(PackingList packingList) { + this.packingList = packingList; + final Item item = getTargetItem(); + PackingList.editTotalQuantity(item, totalQuantity); + Ui.printToUser(String.format(MSG_SUCCESS_EDITQUANTITY, item)); + } + +} diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index dc39c8259c..d8df584238 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -12,6 +12,7 @@ import bagpacker.commands.PackCommand; import bagpacker.commands.UnpackCommand; import bagpacker.commands.PackAllCommand; +import bagpacker.commands.EditQuantityCommand; import bagpacker.exception.EmptyInputException; import bagpacker.exception.InvalidIndexException; import bagpacker.exception.InvalidVariablesException; @@ -81,6 +82,8 @@ public static Command parse() { return createDeletelistObj(); case "packall": return createPackAllObj(); + case "editquantity": + return createEditQuantityObj(); case "bye": return createByeObj(); default: @@ -199,7 +202,7 @@ public static String getItemDescrip() { * Attempts to create AddCommand object to be executed where it is called from * * @return AddCommand the command to be executed to add an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createAddObj() { try { @@ -235,7 +238,7 @@ public static String[] getAddVariables() throws InvalidVariablesException { * Attempts to create DeleteCommand object to be executed where it is called from * * @return DeleteCommand the command to be executed to delete an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createDeleteObj() { try { @@ -273,7 +276,7 @@ public static int[] getQuantityAndIndex() throws InvalidVariablesException, Inva * Attempts to create PackCommand object to be executed where it is called from * * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createPackObj() { int quantityNotPacked = 0; @@ -309,11 +312,55 @@ public static Command createPackObj() { } } + /** + * Attempts to create EditQuantityCommand object to be executed where it is called from + * Will check whether QUANTITY and INDEX are positive integers + * Will check whether changing the total quantity will cause packed + * + * @return EditQuantityCommand the command to be executed to edit the total quantity of an item in the packing list, + * else an IncorrectCommand objected is created to be executed + */ + public static Command createEditQuantityObj() { + try { + String[] quantityAndIndex = getEditQuantityVariables(); + int newTotalQuantity = Integer.parseInt(quantityAndIndex[0]); + if (newTotalQuantity < 1) { + throw new InvalidIndexException(); + } + int index = Integer.parseInt(quantityAndIndex[1]); + if (index < 1 || index > PackingList.getItemList().size()) { + throw new InvalidIndexException(); + } + int packedQuantity = PackingList.get(index - 1).getPackedQuantity(); + if (newTotalQuantity < packedQuantity) { + throw new InvalidIndexException(); + } + return new EditQuantityCommand(newTotalQuantity, index); + } catch (NumberFormatException | InvalidIndexException e) { + return new IncorrectCommand("Invalid item quantity or index", + "For QUANTITY, try to input a positive integer that is at least the quantity packed.\n" + + "For INDEX, try to input a positive integer that is at most " + + PackingList.getItemList().size()); + } catch (ArrayIndexOutOfBoundsException e) { + return new IncorrectCommand("Missing or additional inputs", + "A valid quantity and index are required."); + } + } + + public static String[] getEditQuantityVariables() throws InvalidIndexException { + String[] inputStringList = fullInput.trim().split(" ", 2); + String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); + if (inputVariables.length != 2) { + throw new InvalidIndexException(); + } + return inputVariables; + } + /** * Attempts to create PackCommand object to be executed where it is called from * * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static String[] getPackVariables() throws InvalidIndexException { @@ -367,7 +414,7 @@ public static Command createPackAllObj() { * Attempts to create UnpackCommand object to be executed where it is called from * * @return UnpackCommand the command to be executed to unpack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createUnpackObj() { int quantityPacked = 0; diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index c093591ca9..ac88c5b5ab 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -1,4 +1,6 @@ package bagpacker.packingfunc; +import bagpacker.commands.Command; + import java.util.ArrayList; /** @@ -52,6 +54,10 @@ public static void addToItemQuantity(String itemName, int addQty) { itemToAdd.setTotalQuantity(totalQuantity + addQty); } + public static void editTotalQuantity(Item itemToEdit, int newTotalQuantity) { + itemToEdit.setTotalQuantity(newTotalQuantity); + } + public static void setItemList(ArrayList itemList) { PackingList.itemList = itemList; } From ebdd8483ddc0574201f979c9a9386ecb666c1031 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 5 Apr 2023 16:25:40 +0800 Subject: [PATCH 104/207] Refactor Parser and PackingList --- src/main/java/bagpacker/iohandler/Parser.java | 16 ++++++++-------- .../java/bagpacker/packingfunc/PackingList.java | 2 -- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index f0a4190016..98e7f62a86 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -80,7 +80,7 @@ public static Command parse() { case "help": return createHelpObj(); case "deletelist": - return createDeletelistObj(); + return createDeleteListObj(); case "packall": return createPackAllObj(); case "editquantity": @@ -220,7 +220,7 @@ public static String getItemDescrip() { * Attempts to create AddCommand object to be executed where it is called from * * @return AddCommand the command to be executed to add an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createAddObj() { try { @@ -256,7 +256,7 @@ public static String[] getAddVariables() throws InvalidVariablesException { * Attempts to create DeleteCommand object to be executed where it is called from * * @return DeleteCommand the command to be executed to delete an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createDeleteObj() { try { @@ -294,7 +294,7 @@ public static int[] getQuantityAndIndex() throws InvalidVariablesException, Inva * Attempts to create PackCommand object to be executed where it is called from * * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createPackObj() { int quantityNotPacked = 0; @@ -336,7 +336,7 @@ public static Command createPackObj() { * Will check whether changing the total quantity will cause packed * * @return EditQuantityCommand the command to be executed to edit the total quantity of an item in the packing list, - * else an IncorrectCommand objected is created to be executed + * else an IncorrectCommand objected is created to be executed */ public static Command createEditQuantityObj() { try { @@ -378,7 +378,7 @@ public static String[] getEditQuantityVariables() throws InvalidIndexException { * Attempts to create PackCommand object to be executed where it is called from * * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static String[] getPackVariables() throws InvalidIndexException { @@ -432,7 +432,7 @@ public static Command createPackAllObj() { * Attempts to create UnpackCommand object to be executed where it is called from * * @return UnpackCommand the command to be executed to unpack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createUnpackObj() { int quantityPacked = 0; @@ -498,7 +498,7 @@ public static Command listCommand() { return new ListCommand(); } - public static Command createDeletelistObj() { + public static Command createDeleteListObj() { return new DeleteListCommand(); } diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index 960003969a..dc90aceefb 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -1,6 +1,4 @@ package bagpacker.packingfunc; -import bagpacker.commands.Command; - import java.util.ArrayList; /** From 2c539dfe6a779f657a8f2477404106532985fc4c Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 5 Apr 2023 18:02:06 +0800 Subject: [PATCH 105/207] Add J-unit tests for new commands --- .../java/bagpacker/commands/FindCommand.java | 2 +- .../commands/EditQuantityCommandTest.java | 29 ++++++++++ .../bagpacker/commands/FindCommandTest.java | 53 +++++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/test/java/bagpacker/commands/EditQuantityCommandTest.java create mode 100644 src/test/java/bagpacker/commands/FindCommandTest.java diff --git a/src/main/java/bagpacker/commands/FindCommand.java b/src/main/java/bagpacker/commands/FindCommand.java index 053aa35f65..0273ffb292 100644 --- a/src/main/java/bagpacker/commands/FindCommand.java +++ b/src/main/java/bagpacker/commands/FindCommand.java @@ -33,7 +33,7 @@ public void execute(PackingList packingList) { foundList.add(0, String.format(MSG_FIND_HEADER, foundList.size(), keyword)); printToUser(foundList.toArray(new String[0])); } else { - printToUser(MSG_NO_FOUND_ITEM); + printToUser(String.format(MSG_NO_FOUND_ITEM, keyword)); } } } diff --git a/src/test/java/bagpacker/commands/EditQuantityCommandTest.java b/src/test/java/bagpacker/commands/EditQuantityCommandTest.java new file mode 100644 index 0000000000..ead92ccc8f --- /dev/null +++ b/src/test/java/bagpacker/commands/EditQuantityCommandTest.java @@ -0,0 +1,29 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * CommandsTest to test methods in Commands class + */ +public class EditQuantityCommandTest { + + @Test + public void testEditQuantityCommand() { + PackingList dummyPackingList = new PackingList(); + Item firstItem = new Item(10, "pairs of socks"); + dummyPackingList.addItem(firstItem); + EditQuantityCommand editQtyCmd = new EditQuantityCommand(30, 1); + editQtyCmd.execute(dummyPackingList); + firstItem = PackingList.getItemList().get(0); + assertEquals(30, firstItem.getTotalQuantity()); + + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } + +} diff --git a/src/test/java/bagpacker/commands/FindCommandTest.java b/src/test/java/bagpacker/commands/FindCommandTest.java new file mode 100644 index 0000000000..56faac9f43 --- /dev/null +++ b/src/test/java/bagpacker/commands/FindCommandTest.java @@ -0,0 +1,53 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * CommandsTest to test methods in Commands class + */ +public class FindCommandTest { + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + public void tearDown() { + System.setOut(standardOut); + } + @Test + public void testFindCommand_itemFound() { + PackingList dummyPackingList = new PackingList(); + Item firstItem = new Item(10, "pairs of socks"); + dummyPackingList.addItem(firstItem); + FindCommand findCmd = new FindCommand("pairs of"); + setUp(); + findCmd.execute(dummyPackingList); + assert(outputStreamCaptor.toString().trim().contains("pairs of socks") + & outputStreamCaptor.toString().trim().contains("[0/10]")); + tearDown(); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } + @Test + public void testFindCommand_itemNotFound() { + PackingList dummyPackingList = new PackingList(); + Item firstItem = new Item(10, "pairs of socks"); + dummyPackingList.addItem(firstItem); + FindCommand findCmd = new FindCommand("shoes"); + setUp(); + findCmd.execute(dummyPackingList); + assert(outputStreamCaptor.toString().trim() + .contains("An item containing the description shoes does not exist. Please try again.")); + tearDown(); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } +} From 3c20551b406b97f9a231ec027a67320613d71a42 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 5 Apr 2023 18:28:42 +0800 Subject: [PATCH 106/207] Add ListUnpacked Function --- .../java/bagpacker/commands/ListCommand.java | 17 ++----- .../commands/ListUnpackedCommand.java | 49 +++++++++++++++++++ src/main/java/bagpacker/iohandler/Parser.java | 11 ++++- src/main/java/bagpacker/packingfunc/Item.java | 5 ++ .../commands/EditQuantityCommandTest.java | 1 - .../bagpacker/commands/FindCommandTest.java | 1 - 6 files changed, 68 insertions(+), 16 deletions(-) create mode 100644 src/main/java/bagpacker/commands/ListUnpackedCommand.java diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index 3f979b591c..1645142e62 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -1,5 +1,6 @@ package bagpacker.commands; +import bagpacker.iohandler.Ui; import bagpacker.packingfunc.PackingList; public class ListCommand extends Command { @@ -10,26 +11,18 @@ public class ListCommand extends Command { public void execute(PackingList packingList) { if (packingList.size() == 0) { - System.out.println("____________________________________________________________"); + Ui.printLine(); System.out.println("There are no items in your list. What would you like to add?"); - System.out.println("____________________________________________________________"); + Ui.printLine(); return; } - System.out.println("____________________________________________________________"); + Ui.printLine(); System.out.println("Here are the items in your list"); for (int i = 0; i < packingList.size(); i++) { - // String isItemPacked; - // if (packingList.get(i).getIsPacked()) { - // isItemPacked = "X"; - // } else { - // isItemPacked = " "; - // } - // String itemName = packingList.get(i).getItemName(); - // System.out.println((i + 1) + ". [" + isItemPacked + "] " + itemName); System.out.print((i + 1) + ". "); System.out.println(PackingList.get(i)); } - System.out.println("____________________________________________________________"); + Ui.printLine(); } } diff --git a/src/main/java/bagpacker/commands/ListUnpackedCommand.java b/src/main/java/bagpacker/commands/ListUnpackedCommand.java new file mode 100644 index 0000000000..4558bb4ec6 --- /dev/null +++ b/src/main/java/bagpacker/commands/ListUnpackedCommand.java @@ -0,0 +1,49 @@ +package bagpacker.commands; + +import bagpacker.iohandler.Ui; +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; + +import java.util.ArrayList; + +public class ListUnpackedCommand extends Command{ + public static final String HELP_MSG = + "listunpack : List all items and their total quantities if they are not fully " + "packed yet.\n" + + "\tExample: listunpack"; + + @Override + public void execute(PackingList packingList) { + ArrayList unpackedList = getUnpackedList(); + if (packingList.size() == 0) { + Ui.printLine(); + System.out.println("There are no items in your list. What would you like to add?"); + Ui.printLine(); + return; + } + if (unpackedList.size() == 0) { + Ui.printLine(); + System.out.println("All items in your list are fully packed!"); + Ui.printLine(); + return; + } + Ui.printLine(); + System.out.println("Here are the unpacked items in your list"); + for (int i = 0; i < unpackedList.size(); i++) { + System.out.print((i + 1) + ". "); + System.out.println(unpackedList.get(i)); + } + Ui.printLine(); + } + + private ArrayList getUnpackedList(){ + Item currItem; + ArrayList unpackedList = new ArrayList<>(); + for (int i = 0; i < PackingList.getItemList().size(); i++) { + currItem = PackingList.get(i); + if (!currItem.checkFullyPacked()){ + unpackedList.add(currItem); + } + } + return unpackedList; + } +} diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 98e7f62a86..d84d141911 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -4,6 +4,7 @@ import bagpacker.commands.AddCommand; import bagpacker.commands.DeleteCommand; import bagpacker.commands.ListCommand; +import bagpacker.commands.ListUnpackedCommand; import bagpacker.commands.PackCommand; import bagpacker.commands.UnpackCommand; import bagpacker.commands.DeleteListCommand; @@ -76,7 +77,9 @@ public static Command parse() { case "unpack": return createUnpackObj(); case "list": - return listCommand(); + return createListObj(); + case "listunpacked": + return createListUnpackedObj(); case "help": return createHelpObj(); case "deletelist": @@ -494,10 +497,14 @@ public static Command createFindObj() { } } - public static Command listCommand() { + public static Command createListObj() { return new ListCommand(); } + private static Command createListUnpackedObj() { + return new ListUnpackedCommand(); + } + public static Command createDeleteListObj() { return new DeleteListCommand(); } diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index 9cc3e0170c..2870f88d89 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -34,6 +34,11 @@ public Item(int totalQuantity, int packedQuantity, String description) { this.totalQuantity = totalQuantity; } + public boolean checkFullyPacked(){ + boolean isFullyPacked = totalQuantity == packedQuantity; + return isFullyPacked; + } + public int getTotalQuantity() { return totalQuantity; } diff --git a/src/test/java/bagpacker/commands/EditQuantityCommandTest.java b/src/test/java/bagpacker/commands/EditQuantityCommandTest.java index ead92ccc8f..6214eafe80 100644 --- a/src/test/java/bagpacker/commands/EditQuantityCommandTest.java +++ b/src/test/java/bagpacker/commands/EditQuantityCommandTest.java @@ -2,7 +2,6 @@ import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/bagpacker/commands/FindCommandTest.java b/src/test/java/bagpacker/commands/FindCommandTest.java index 56faac9f43..06ab8e7955 100644 --- a/src/test/java/bagpacker/commands/FindCommandTest.java +++ b/src/test/java/bagpacker/commands/FindCommandTest.java @@ -7,7 +7,6 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; -import static org.junit.jupiter.api.Assertions.assertEquals; /** * CommandsTest to test methods in Commands class From cf95ec970518abb0b54577036106ffa246c6eab4 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 5 Apr 2023 22:45:19 +0800 Subject: [PATCH 107/207] Fix add item bug --- src/main/java/bagpacker/iohandler/Parser.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index d84d141911..452af9c409 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -237,7 +237,7 @@ public static Command createAddObj() { throw new InvalidIndexException(); } return new AddCommand(new Item(itemQuantity, itemName)); - } catch (InvalidVariablesException | ArrayIndexOutOfBoundsException e) { + } catch (InvalidVariablesException | ArrayIndexOutOfBoundsException | StringIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid input format", AddCommand.HELP_MSG); } catch (NumberFormatException | InvalidIndexException e) { @@ -246,10 +246,13 @@ public static Command createAddObj() { } } - public static String[] getAddVariables() throws InvalidVariablesException { - String[] inputStringList = fullInput.trim().split(" ", 2); - String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); - if (inputVariables.length != 2) { + public static String[] getAddVariables() throws InvalidVariablesException, StringIndexOutOfBoundsException { + String[] inputVariables= new String[3]; + String inputWOCommand = fullInput.substring(3).trim(); + int ofIndex = inputWOCommand.indexOf("/of"); + inputVariables[0] = inputWOCommand.substring(0,ofIndex).trim(); + inputVariables[1] = inputWOCommand.substring(ofIndex + 3).trim(); + if (!inputWOCommand.contains("/of") | inputVariables[1].equals("")) { throw new InvalidVariablesException(); } return inputVariables; From 85f77612f9239cc6424eac02ae1b7fbb4018b1b3 Mon Sep 17 00:00:00 2001 From: Sophie Date: Wed, 5 Apr 2023 23:08:19 +0800 Subject: [PATCH 108/207] Create unpackall command feature --- .../bagpacker/commands/PackAllCommand.java | 6 +-- .../bagpacker/commands/UnpackAllCommand.java | 35 +++++++++++++ src/main/java/bagpacker/iohandler/Parser.java | 49 +++++++++++++++++-- src/main/java/bagpacker/iohandler/Ui.java | 7 ++- 4 files changed, 87 insertions(+), 10 deletions(-) create mode 100644 src/main/java/bagpacker/commands/UnpackAllCommand.java diff --git a/src/main/java/bagpacker/commands/PackAllCommand.java b/src/main/java/bagpacker/commands/PackAllCommand.java index 0615a55562..04698521e6 100644 --- a/src/main/java/bagpacker/commands/PackAllCommand.java +++ b/src/main/java/bagpacker/commands/PackAllCommand.java @@ -6,7 +6,7 @@ public class PackAllCommand extends Command { - public static final String MSG_SUCCESS_PACK = "Item packed: %s"; + public static final String MSG_SUCCESS_PACKALL = "Item packed: %s"; public static final String HELP_MSG = "packall : Marks all quantity of the specified item as packed in the " + "packing list.\n" + @@ -19,7 +19,7 @@ public PackAllCommand(int targetIndex) { super(targetIndex); assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : - "PackAll Command Target index is out of bounds"; + "Packall Command Target index is out of bounds"; } @Override @@ -28,7 +28,7 @@ public void execute(PackingList packingList) { final Item item = getTargetItem(); packQuantity = item.getUnpackedQuantity(); packingList.packItem(item, packQuantity); - Ui.printToUser(String.format(MSG_SUCCESS_PACK, item)); + Ui.printToUser(String.format(MSG_SUCCESS_PACKALL, item)); } } diff --git a/src/main/java/bagpacker/commands/UnpackAllCommand.java b/src/main/java/bagpacker/commands/UnpackAllCommand.java new file mode 100644 index 0000000000..d2b57da77d --- /dev/null +++ b/src/main/java/bagpacker/commands/UnpackAllCommand.java @@ -0,0 +1,35 @@ +package bagpacker.commands; + +import bagpacker.iohandler.Ui; +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; + +public class UnpackAllCommand extends Command { + + public static final String MSG_SUCCESS_UNPACKALL = "Item unpacked: %s"; + + public static final String HELP_MSG = "unpackall : Marks all quantity of the specified item as unpacked in the " + + "packing list.\n" + + "\tExample: unpackall /of 3\n" + + "\tMeaning: unpacks all of the quantities of the third item in the packing list"; + + private static int unpackQuantity; + + public UnpackAllCommand(int targetIndex) { + super(targetIndex); + + assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : + "Unpackall Command Target index is out of bounds"; + } + + @Override + public void execute(PackingList packingList) { + this.packingList = packingList; + final Item item = getTargetItem(); + unpackQuantity = item.getPackedQuantity(); + packingList.unpackItem(item, unpackQuantity); + Ui.printToUser(String.format(MSG_SUCCESS_UNPACKALL, item)); + } + +} + diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index d84d141911..8919e03153 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -14,7 +14,7 @@ import bagpacker.commands.ByeCommand; import bagpacker.commands.IncorrectCommand; import bagpacker.commands.HelpCommand; - +import bagpacker.commands.UnpackAllCommand; import bagpacker.exception.EmptyInputException; import bagpacker.exception.InvalidIndexException; import bagpacker.exception.InvalidVariablesException; @@ -86,6 +86,8 @@ public static Command parse() { return createDeleteListObj(); case "packall": return createPackAllObj(); + case "unpackall": + return createUnpackAllObj(); case "editquantity": return createEditQuantityObj(); case "find": @@ -407,13 +409,10 @@ public static int getPackAllIndex() throws InvalidIndexException { } public static Command createPackAllObj() { - int quantityNotPacked = 0; try { int itemIndex = getPackAllIndex(); - quantityNotPacked = PackingList.get(itemIndex - 1).getUnpackedQuantity(); - return new PackAllCommand(itemIndex); } catch (NumberFormatException | InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { @@ -430,7 +429,6 @@ public static Command createPackAllObj() { } } - /** * Attempts to create UnpackCommand object to be executed where it is called from * @@ -484,6 +482,47 @@ public static Command createUnpackObj() { } } + public static Command createUnpackAllObj() { + int quantityPacked = 0; + try { + int itemIndex = getPackAllIndex(); + if (itemIndex > PackingList.getItemList().size()) { + return new IncorrectCommand("Invalid Item Index", + "Try to input a positive integer number that does not exceed " + + PackingList.getItemList().size()); + } + quantityPacked = PackingList.get(itemIndex - 1).getPackedQuantity(); + if (quantityPacked == 0) { + throw new InvalidVariablesException(); + } + + return new UnpackAllCommand(itemIndex); + + } catch (NumberFormatException | InvalidIndexException e) { + if (PackingList.getItemList().size() == 0) { + return new IncorrectCommand("Invalid Item Index", + "Your packing list is empty, there is nothing to unpack"); + } else { + return new IncorrectCommand("Invalid Item Index", + "Try to input a positive item index number that is at most " + + PackingList.getItemList().size()); + } + } catch (ArrayIndexOutOfBoundsException e) { + return new IncorrectCommand("Invalid Input Variables", + UnpackAllCommand.HELP_MSG); + } catch (InvalidVariablesException e) { + if (quantityPacked == 0) { + return new IncorrectCommand("Invalid Unpackall Usage", + "This item is not even packed yet"); + } + return new IncorrectCommand("Invalid Input Quantity", + "Try to input a positive quantity that does not exceed " + quantityPacked); + } + } + + + + /** * Attempts to create a FindCommand object with the given keyword. * @return FindCommand diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index 6b8487a075..b7ab3dc7fe 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -7,9 +7,11 @@ import bagpacker.commands.UnpackCommand; import bagpacker.commands.DeleteListCommand; import bagpacker.commands.PackAllCommand; +import bagpacker.commands.UnpackAllCommand; import bagpacker.commands.FindCommand; import bagpacker.commands.ByeCommand; + /** * Ui class contains methods to print messages to user interface on Command Line Interface */ @@ -78,8 +80,9 @@ public static void helpMessage() { System.out.println("5. " + UnpackCommand.HELP_MSG); System.out.println("6. " + DeleteListCommand.HELP_MSG); System.out.println("7. " + PackAllCommand.HELP_MSG); - System.out.println("8. " + FindCommand.HELP_MSG); - System.out.println("8. " + ByeCommand.HELP_MSG); + System.out.println("8. " + UnpackAllCommand.HELP_MSG); + System.out.println("9. " + FindCommand.HELP_MSG); + System.out.println("10. " + ByeCommand.HELP_MSG); printLine(); } From a2f4f304087250076e62495ae5a8637327cf744c Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 5 Apr 2023 23:43:05 +0800 Subject: [PATCH 109/207] Edit UG to include listunpacked and the max integer value supported --- docs/UserGuide.md | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 129b25f42e..162579a3f0 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -23,8 +23,10 @@ ## Introduction -Meant for travellers, BagPacker is an application to help travellers manage their packing list. -Users can add items of multiple quantities to their packing list, delete items, and view their packing lists. +BagPacker is an application to help travellers manage their packing list. +Users can add items of varying quantities to their packing list, delete items, view their packing list and much more. +With BagPacker, you never need to worry about miss-packing again simply use BagPacker to remind you of what +is unpacked and travel with ease of mind. --- @@ -48,6 +50,10 @@ Users can add items of multiple quantities to their packing list, delete items, > * `NAME` is a case-sensitive input. > * Additional parameters will be ignored for commands that do not need them. > * For example, `deletelist abc123` will be interpreted as `deletelist`. +> * BagPacker is limited to tracking integer values of up to 1000000: +> * for total number of items in a packing list +> * for total quantity of any single item in a packing list +> * any tracking above this value will result in undefined outputs ### Adding a new item: `add` Adds a new item and its quantity to the packing list. @@ -99,7 +105,7 @@ BagPacker will remove the second item from the packing list [0/2] water bottles removed from the list ``` -### Packing some items: `pack` +### Packing an item: `pack` Packs the given amount of that item in the packing list. Format: `pack QUANTITY /of INDEX` @@ -114,7 +120,7 @@ Format: `pack QUANTITY /of INDEX` Examples of usage: * `pack 3 /of 1` -### Marking total quantity of item as packed: `packall` +### Fully pack an item: `packall` Packs the total quantity of that item in the packing list. Format: `packall /of INDEX` @@ -135,7 +141,7 @@ BagPacker will mark all of the quantities of the third item in the packing list Item packed: [20/20] socks ``` -### Unpacking some items: `unpack` +### Unpacking an item: `unpack` Unpacks the given amount of that item in the packing list. Format: `unpack QUANTITY /of INDEX` @@ -183,10 +189,33 @@ Here are the items in your list 1. [1000000/1000000] jackets 2. [0/5] water bottles ``` -Format explanation: +List Format explanation: `ITEM_INDEX. [CURRENTLY_PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME` +### Listing all unpacked items: `listunpacked` +Lists all the items in the packing list that are not fully packed yet. +* Fully packed meaning an item's current quantity packed is the same as the total quantity to be packed +* Includes the current packed quantity, the total quantity to be packed, and the name of the item. + +Format: `listunpacked` +* This command is not expecting any parameters. Any additional parameters will be ignored. + +Examples of usage: +* `listunpacked` +* `listunpacked 123` + +Example output: +``` +Here are the unpacked items in your list +1. [19317/1000000] jackets +2. [0/5] water bottles +``` +List Format explanation: + +`ITEM_INDEX. [CURRENTLY_PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME` + + ### Deleting the entire list: `deletelist` Deletes the whole packing list. From 95906212bd6a62cb6fbe61db32e9d704e9e06d9c Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 5 Apr 2023 23:43:57 +0800 Subject: [PATCH 110/207] Update UG --- docs/UserGuide.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 162579a3f0..9750778ce9 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -50,10 +50,10 @@ is unpacked and travel with ease of mind. > * `NAME` is a case-sensitive input. > * Additional parameters will be ignored for commands that do not need them. > * For example, `deletelist abc123` will be interpreted as `deletelist`. -> * BagPacker is limited to tracking integer values of up to 1000000: +> * BagPacker supports the tracking of integer values up to 1000000: > * for total number of items in a packing list -> * for total quantity of any single item in a packing list -> * any tracking above this value will result in undefined outputs +> * for total / packed / unpacked quantity of any single item in a packing list +> * any form of list tracking above 1000000 integer size is not supported and may result in undefined outputs ### Adding a new item: `add` Adds a new item and its quantity to the packing list. From 7176bd5ceb9239a9d95a1bcaf3cd99aee2fdcde5 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Wed, 5 Apr 2023 23:59:18 +0800 Subject: [PATCH 111/207] Update help messages --- src/main/java/bagpacker/commands/AddCommand.java | 4 ++-- src/main/java/bagpacker/commands/ByeCommand.java | 2 +- src/main/java/bagpacker/commands/DeleteCommand.java | 4 ++-- .../java/bagpacker/commands/DeleteListCommand.java | 2 +- .../java/bagpacker/commands/EditQuantityCommand.java | 6 +++--- src/main/java/bagpacker/commands/FindCommand.java | 4 ++-- src/main/java/bagpacker/commands/ListCommand.java | 2 +- .../java/bagpacker/commands/ListUnpackedCommand.java | 4 ++-- src/main/java/bagpacker/commands/PackAllCommand.java | 5 ++--- src/main/java/bagpacker/commands/PackCommand.java | 4 ++-- .../java/bagpacker/commands/UnpackAllCommand.java | 6 ++---- src/main/java/bagpacker/commands/UnpackCommand.java | 4 ++-- src/main/java/bagpacker/iohandler/Ui.java | 12 ++++++++---- 13 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index b8f2cfdd61..ddafd3b63e 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -8,9 +8,9 @@ public class AddCommand extends Command { public static final String MSG_SUCCESS_ADD = "New item added: %s"; public static final String MSG_SUCCESS_ADD_EXISTING = "Add to quantity of existing item: %s"; - public static final String HELP_MSG = "add : Adds quantity and name of item to the packing list.\n" + + public static final String HELP_MSG = "add: Adds quantity and name of item to the packing list.\n" + "\tExample: add 3 /of toothbrush\n" + - "\tMeaning: add quantity of 3 toothbrushes to the packing list"; + "\tMeaning: Add quantity of 3 toothbrushes to the packing list"; private final Item item; diff --git a/src/main/java/bagpacker/commands/ByeCommand.java b/src/main/java/bagpacker/commands/ByeCommand.java index b5616f236e..db2b238aed 100644 --- a/src/main/java/bagpacker/commands/ByeCommand.java +++ b/src/main/java/bagpacker/commands/ByeCommand.java @@ -7,7 +7,7 @@ */ public class ByeCommand extends Command { public static boolean isBagPackerRunning = true; - public static final String HELP_MSG = "bye : Stops the BagPacker Application\n" + + public static final String HELP_MSG = "bye: Stops the BagPacker Application\n" + "\tExample: bye"; public void execute(PackingList packingList) { diff --git a/src/main/java/bagpacker/commands/DeleteCommand.java b/src/main/java/bagpacker/commands/DeleteCommand.java index 8a5cbd8db8..0821901ce1 100644 --- a/src/main/java/bagpacker/commands/DeleteCommand.java +++ b/src/main/java/bagpacker/commands/DeleteCommand.java @@ -9,9 +9,9 @@ public class DeleteCommand extends Command { public static final String MSG_SUCCESS_DELETE = "%s removed from the list"; - public static final String HELP_MSG = "delete : Deletes an item from the packing list.\n" + + public static final String HELP_MSG = "delete: Deletes an item from the packing list.\n" + "\tExample: delete 1\n" + - "\tMeaning: removes the first item in the packing list"; + "\tMeaning: Removes the first item in the packing list"; public DeleteCommand(int targetIndex) { diff --git a/src/main/java/bagpacker/commands/DeleteListCommand.java b/src/main/java/bagpacker/commands/DeleteListCommand.java index dfb84c0241..2088b49da9 100644 --- a/src/main/java/bagpacker/commands/DeleteListCommand.java +++ b/src/main/java/bagpacker/commands/DeleteListCommand.java @@ -10,7 +10,7 @@ public class DeleteListCommand extends Command { public static final String MSG_SUCCESS_DELETE_LIST = "Packing list deleted"; public static final String HELP_MSG = - "deletelist : Deletes all items in the packing list.\n" + + "deletelist: Deletes all items in the packing list.\n" + "\tExample: deletelist"; @Override diff --git a/src/main/java/bagpacker/commands/EditQuantityCommand.java b/src/main/java/bagpacker/commands/EditQuantityCommand.java index bdae277bac..bab4ea6c51 100644 --- a/src/main/java/bagpacker/commands/EditQuantityCommand.java +++ b/src/main/java/bagpacker/commands/EditQuantityCommand.java @@ -7,9 +7,9 @@ public class EditQuantityCommand extends Command{ public static final String MSG_SUCCESS_EDITQUANTITY = "Item total quantity edited: %s"; - public static final String HELP_MSG = "editquantity: edit the total quantity of an item to be packed." + - "\tExample: editquantity 3 /of 2" + - "\tMeaning: change the total quantity of the second item to 3"; + public static final String HELP_MSG = "editquantity: Edit the total quantity of an item to be packed.\n" + + "\tExample: editquantity 3 /of 2\n" + + "\tMeaning: Change the total quantity of the second item to 3"; private static int totalQuantity; diff --git a/src/main/java/bagpacker/commands/FindCommand.java b/src/main/java/bagpacker/commands/FindCommand.java index 0273ffb292..aac791a9e1 100644 --- a/src/main/java/bagpacker/commands/FindCommand.java +++ b/src/main/java/bagpacker/commands/FindCommand.java @@ -9,8 +9,8 @@ public class FindCommand extends Command { public static final String HELP_MSG = - "find: Displays all items in the packingList as a list that contains tha keyword used in the command.\n" - + "Example: find jacket"; + "find: Displays all items in the packingList as a list that contains the keyword used in the command.\n" + + "\tExample: find jacket"; private static final String MSG_FIND_HEADER = "There are %d items(s) in your list containing %s: "; private static final String MSG_NO_FOUND_ITEM = "An item containing the description %s does not exist. Please try again."; diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index 1645142e62..8288ab1591 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -4,7 +4,7 @@ import bagpacker.packingfunc.PackingList; public class ListCommand extends Command { - public static final String HELP_MSG = "list : List all items and their total quantities packed in packing list.\n" + + public static final String HELP_MSG = "list: List all items and their total quantities packed in packing list.\n" + "\tExample: list"; @Override diff --git a/src/main/java/bagpacker/commands/ListUnpackedCommand.java b/src/main/java/bagpacker/commands/ListUnpackedCommand.java index 4558bb4ec6..d24c7e0cec 100644 --- a/src/main/java/bagpacker/commands/ListUnpackedCommand.java +++ b/src/main/java/bagpacker/commands/ListUnpackedCommand.java @@ -8,8 +8,8 @@ public class ListUnpackedCommand extends Command{ public static final String HELP_MSG = - "listunpack : List all items and their total quantities if they are not fully " + "packed yet.\n" - + "\tExample: listunpack"; + "listunpacked: List all items and their total quantities if they are not fully packed yet.\n" + + "\tExample: listunpacked"; @Override public void execute(PackingList packingList) { diff --git a/src/main/java/bagpacker/commands/PackAllCommand.java b/src/main/java/bagpacker/commands/PackAllCommand.java index 04698521e6..943f915496 100644 --- a/src/main/java/bagpacker/commands/PackAllCommand.java +++ b/src/main/java/bagpacker/commands/PackAllCommand.java @@ -8,10 +8,9 @@ public class PackAllCommand extends Command { public static final String MSG_SUCCESS_PACKALL = "Item packed: %s"; - public static final String HELP_MSG = "packall : Marks all quantity of the specified item as packed in the " + - "packing list.\n" + + public static final String HELP_MSG = "packall: Fully pack an item of choice from the packing list.\n" + "\tExample: packall /of 3\n" + - "\tMeaning: packs all of the quantities of the third item in the packing list"; + "\tMeaning: Set the third item in the packing list as fully packed"; private static int packQuantity; diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 2db2ba0488..831b6d0aa1 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -7,9 +7,9 @@ public class PackCommand extends Command { public static final String MSG_SUCCESS_PACK = "Item packed: %s"; - public static final String HELP_MSG = "pack : Adds to the current quantity of items packed in the packing list.\n" + + public static final String HELP_MSG = "pack: Adds to the current quantity of items packed in the packing list.\n" + "\tExample: pack 2 /of 3\n" + - "\tMeaning: packs 2 more quantities of the third item in the packing list"; + "\tMeaning: Packs 2 more quantities of the third item in the packing list"; private static int packQuantity; diff --git a/src/main/java/bagpacker/commands/UnpackAllCommand.java b/src/main/java/bagpacker/commands/UnpackAllCommand.java index d2b57da77d..3637eb2852 100644 --- a/src/main/java/bagpacker/commands/UnpackAllCommand.java +++ b/src/main/java/bagpacker/commands/UnpackAllCommand.java @@ -8,11 +8,9 @@ public class UnpackAllCommand extends Command { public static final String MSG_SUCCESS_UNPACKALL = "Item unpacked: %s"; - public static final String HELP_MSG = "unpackall : Marks all quantity of the specified item as unpacked in the " + - "packing list.\n" + + public static final String HELP_MSG = "unpackall: Fully unpacks an item of choice from the packing list.\n" + "\tExample: unpackall /of 3\n" + - "\tMeaning: unpacks all of the quantities of the third item in the packing list"; - + "\tMeaning: Set the third item in the packing list as totally not packed yet"; private static int unpackQuantity; public UnpackAllCommand(int targetIndex) { diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index 0f29f04417..9f221cc9b8 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -8,10 +8,10 @@ public class UnpackCommand extends Command { public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; - public static final String HELP_MSG = "unpack : Deducts from the current quantity of items packed in the packing " + + public static final String HELP_MSG = "unpack: Deducts from the current quantity of items packed in the packing " + "list.\n" + "\tExample: unpack 1 /of 2\n" + - "\tMeaning: unpacks 1 quantity of the second item in the packing list"; + "\tMeaning: Unpacks 1 quantity of the second item in the packing list"; private static int unpackQuantity; public UnpackCommand(int quantity, int targetIndex) { diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index b7ab3dc7fe..7b683dd380 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -2,7 +2,9 @@ import bagpacker.commands.AddCommand; import bagpacker.commands.DeleteCommand; +import bagpacker.commands.EditQuantityCommand; import bagpacker.commands.ListCommand; +import bagpacker.commands.ListUnpackedCommand; import bagpacker.commands.PackCommand; import bagpacker.commands.UnpackCommand; import bagpacker.commands.DeleteListCommand; @@ -79,10 +81,12 @@ public static void helpMessage() { System.out.println("4. " + PackCommand.HELP_MSG); System.out.println("5. " + UnpackCommand.HELP_MSG); System.out.println("6. " + DeleteListCommand.HELP_MSG); - System.out.println("7. " + PackAllCommand.HELP_MSG); - System.out.println("8. " + UnpackAllCommand.HELP_MSG); - System.out.println("9. " + FindCommand.HELP_MSG); - System.out.println("10. " + ByeCommand.HELP_MSG); + System.out.println("7. " + ListUnpackedCommand.HELP_MSG); + System.out.println("8. " + EditQuantityCommand.HELP_MSG); + System.out.println("9. " + PackAllCommand.HELP_MSG); + System.out.println("10. " + UnpackAllCommand.HELP_MSG); + System.out.println("11. " + FindCommand.HELP_MSG); + System.out.println("12. " + ByeCommand.HELP_MSG); printLine(); } From 99867b472b16fa2c0f8add6f4950b382bae31d47 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 6 Apr 2023 01:15:58 +0800 Subject: [PATCH 112/207] Update user guide --- docs/UserGuide.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 9750778ce9..0987492a9d 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -41,6 +41,13 @@ is unpacked and travel with ease of mind. * For macOS users: search for Terminal, and launch it. 5. Execute the following command `java -jar Team_Project.jar` +--- +## Limitations +* BagPacker supports the tracking of integer values up to 1000000: +> * for total number of items in a packing list +> * for total / packed / unpacked quantity of any single item in a packing list +> * any form of list tracking above 1000000 integer size is not supported and may result in undefined outputs + --- ## Features @@ -50,10 +57,6 @@ is unpacked and travel with ease of mind. > * `NAME` is a case-sensitive input. > * Additional parameters will be ignored for commands that do not need them. > * For example, `deletelist abc123` will be interpreted as `deletelist`. -> * BagPacker supports the tracking of integer values up to 1000000: -> * for total number of items in a packing list -> * for total / packed / unpacked quantity of any single item in a packing list -> * any form of list tracking above 1000000 integer size is not supported and may result in undefined outputs ### Adding a new item: `add` Adds a new item and its quantity to the packing list. From 4f565bb2585404219c21866384e32f5abc9fd6ba Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 6 Apr 2023 13:43:51 +0800 Subject: [PATCH 113/207] Delete previous md file --- docs/team/LinusPortfolio.md | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 docs/team/LinusPortfolio.md diff --git a/docs/team/LinusPortfolio.md b/docs/team/LinusPortfolio.md deleted file mode 100644 index 425b2536e9..0000000000 --- a/docs/team/LinusPortfolio.md +++ /dev/null @@ -1,11 +0,0 @@ -[LinusPortfolio.md](LinusPortfolio.md) # portfolio - -# Linus Puah Jia He - Project Portfolio Page - -## Overview - -### Summary of Contributions - - - - From 6d154b8464ba4d57e8d19a958e8be0b554e73cd6 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 6 Apr 2023 16:41:31 +0800 Subject: [PATCH 114/207] Add plantuml diagram for overarching app --- docs/DeveloperGuide.md | 118 +++++++++++++++---- docs/umlDiagrams/AddExistingItemDiagram.png | Bin 24246 -> 27918 bytes docs/umlDiagrams/AddExistingItemDiagram.puml | 8 +- docs/umlDiagrams/BagPackerClassDiagram.puml | 71 +++++++++++ 4 files changed, 172 insertions(+), 25 deletions(-) create mode 100644 docs/umlDiagrams/BagPackerClassDiagram.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 2c9a988ede..780da1ec1a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -14,6 +14,8 @@ For all valid commands, the mechanism of implementation are as follows: 3. Execute command object - ```runBagPacker()``` method executes the ```.execute()``` method (overridden by child classes) of the command object which runs the actual command function +--- + #### Add Command Add command is used to add a quantity of item(s) to the packing list. @@ -22,13 +24,13 @@ Mechanism: ```AddCommand.execute()``` calls the ```PackingList.addItem()``` meth It then updates the ```quantity``` variable according to the quantity inputted by the user. -#### Preventing duplicate items +##### Preventing duplicate items -When using the `add` function, we have decided to implement method that checks whether the item with the same name already exists in the packingList. +When using the `add` function, we have decided to implement a method to check whether the item with the same name already exists in the packingList. This is done through the `itemFinder()` method in class `PackingList()`, which is called during `AddCommand.execute()`. -Below is the UML diagram showing what occurs during `add` function when trying to add an item that already exists. +Below is the UML diagram showing what occurs during `add` function when trying to add a duplicate item. ![AddExistingItemDiagram.png](umlDiagrams%2FAddExistingItemDiagram.png) @@ -43,12 +45,16 @@ If `PackingList.itemFinder()` returns false, the item will be added onto `packin In both scenarios, the relevant `ui.printToUser` messages (omitted in the sequence diagram for easier reading) will be called to print a message to the user. +--- + #### Delete Command Delete command is used to delete an item from the packing list. Mechanism: ```DeleteCommand.execute()``` calls the ```PackingList.deleteItem()``` method from the ```PackingList``` class which executes the ```ArrayList.remove()``` method to remove the item from the ```PackingList``` ArrayList. +--- + #### Help Command Help command is used to exit the BagPacker application. @@ -56,37 +62,99 @@ Execute: ```HelpCommand.execute()``` prints the following help message. ``` All Commands: -1. add : Adds quantity and name of item to the packing list. - Example: Example: add 3 /of toothbrush - Meaning: Meaning: add quantity of 3 toothbrushes to the packing list -2. delete : Deletes an item from the packing list. - Example: delete 1 - Meaning: removes the first item in the packing list -3. list : List all items in packing list. - Example: list -4. pack : Adds to the current quantity of items packed in the packing list. - Example: pack 2 /of 3 - Meaning: packs 2 more quantities of the third item in the packing list -5. packkall: Marks all quantity of the specified item as packed in the packing list. - Example: packall /of 3 - Meaning: packs all of the quantities of the third item in the packing list. -6. unpack : Deducts from the current quantity of items packed in the packing list. - Example: unpack 1 /of 2 - Meaning: unpacks 1 quantity of the second item in the packing list -7. deletelist : Deletes all items in the packing list. - Example: deletelist -8. bye : Stops the BagPacker Application - Example: bye +1. add: Adds quantity and name of item to the packing list. + Example: add 3 /of toothbrush + Meaning: Add quantity of 3 toothbrushes to the packing list +2. delete: Deletes an item from the packing list. + Example: delete 1 + Meaning: Removes the first item in the packing list +3. list: List all items and their total quantities packed in packing list. + Example: list +4. pack: Adds to the current quantity of items packed in the packing list. + Example: pack 2 /of 3 + Meaning: Packs 2 more quantities of the third item in the packing list +5. unpack: Deducts from the current quantity of items packed in the packing list. + Example: unpack 1 /of 2 + Meaning: Unpacks 1 quantity of the second item in the packing list +6. deletelist: Deletes all items in the packing list. + Example: deletelist +7. listunpacked: List all items and their total quantities if they are not fully packed yet. + Example: listunpacked +8. editquantity: Edit the total quantity of an item to be packed. + Example: editquantity 3 /of 2 + Meaning: Change the total quantity of the second item to 3 +9. packall: Fully pack an item of choice from the packing list. + Example: packall /of 3 + Meaning: Set the third item in the packing list as fully packed +10. unpackall: Fully unpacks an item of choice from the packing list. + Example: unpackall /of 3 + Meaning: Set the third item in the packing list as totally not packed yet +11. find: Displays all items in the packingList as a list that contains the keyword used in the command. + Example: find jacket +12. bye: Stops the BagPacker Application + Example: bye ____________________________________________________________ + +``` + +--- + +#### List Command + +List command is used to list out all items in the packing list. + +Mechanism: ```ListCommand.execute()``` prints the full list of items in `PackingList` to the CLI. + +List format: `ITEM_INDEX. [CURRENTLY_PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME` + +Example: +``` +____________________________________________________________ +list +____________________________________________________________ +Here are the items in your list +1. [0/1] passport +2. [2/3] shirts +3. [0/2] phones +4. [3/3] pairs of socks +____________________________________________________________ ``` +--- + +#### List Unpacked Command + +`listunpacked` command is used to list out all items in the packing list that are not fully packed. + +Mechanism: ```ListUnpackedCommand.execute()``` calls `getUnpackedList()`, which iterates through every item in `PackingList` to check if it is fully packed. +In each iteration, `Item.checkFullyPacked()` is called which checks `packedQuantity == totalQuantity` for a particular item and returns its packed status (true if fully packed, else false). +Each item that is not fully packed is added to an ArrayList of unpacked items. +Finally, `ListUnpackedCommand.execute()` prints the full list of unpacked items in `unpackedlist` to the CLI. + +Example: +``` +____________________________________________________________ +listunpacked +____________________________________________________________ +Here are the unpacked items in your list +1. [0/1] passport +2. [2/3] shirts +3. [0/2] phones +____________________________________________________________ +``` + +--- + + #### DeleteList Command ```DeleteListCommand``` is used to delete a whole packing list in the BagPacker application. Mechanism: ```DeleteListCommand.execute()``` reassigns the existing ```packingList``` to a new empty ArrayList of Items, thus deleting the ```packingList```. +--- + #### Bye Command ```ByeCommand``` is used to exit the BagPacker application. @@ -119,6 +187,8 @@ BagPacker aims to help busy students simplify their packing process by allowing | v2.0 | user | specify the quantity of an item I need to pack | keep track of individual item quantities being packed | | v2.1 | user | find an item by name | find the pack status of an item without having to go through the entire list | | v2.1 | user | save my packing list | keep track of my packing list even after leaving the app | +| v2.1 | user | see the list of items I have yet to pack | easily track what I am missing | + ## Non-Functional Requirements diff --git a/docs/umlDiagrams/AddExistingItemDiagram.png b/docs/umlDiagrams/AddExistingItemDiagram.png index 2de5da7eeb7167a7160b1038732e879884471138..623b28d56997080842cb0acd6ecd69574c79ce87 100644 GIT binary patch literal 27918 zcmd43WmuJ6)HRAAA!#5js7QBrtGG$&4oT^bO^1Slgmfd)ozjhTN_R+icb&D-$0y$R zyUsa(&UO9>?(KcAnlZ+hbNTVLlqd!&0V*6E90ugob6Gez1VK2sTOKIz;1e|a@DJbz zwe1UKTU`rFsHwhzEu5&nxxV!qTYbI9I?%^&ZEY=WxEUBMP2ZT?+L@Ws>spxE_jHhe zR~#A1E8G6{IovJq9>=)UPz#Fz#=9*uY8?)o;~bgK(J;7do*Dqg)h#oE%8hid%~g4nfTmAmdiYzLH@hbDt>Py@3~JYauZgcxb*v|sIRlC z2eOWMpDg{O9q_Q8wy;o`Y~39nyEovIhHb9?Jx#J;kjpZoBE&1?orh^Je6pu#m(IuM z_be=FvdNXXX`lLF-&2kkrc>#gNs?W1em#?5zJSd3F6P1KgR+;&aCO0|Ujmx8A2JlI zr^chY>Q?mZS_K?8&4oTKI>YO0F)5M4s?rCMKR;k2RsW@XjN8AEiZ`ab|p& zdPSK#i22Fk^_MD^uYOTfDal*!0}6ww7I5fZ@0H4{+fW3UJ6JC#Y`*`N!fzbgBlcYi zWk6lA^jS%jN>|cLH5o*_ppdfmDw+HF)jnwIBG$L(=UKTVuma!MK{4Jy>wk7G5>d~a z`8;k*2{$3Z#vJ`LLR9Otspm=MLNC+XBQPahFF(>xpz+1t)V|6Qg_9dE0fJ0Zl5*P| zcY}yyQqDr!&fvD0K5D3S91*#x6vYBm%5u2wIYGHcfWQy-Uj?NJ{l57 z3^P|aINwG{!p$#mM;Pctu-`nqZy_MVewo#-uZI~S948*5CHv2g@a#~EIsvzfFo&7= z9F71&4rt>$DuIigWS4YKS||RPh*!?Nx3v>pP8S`vYk452=!4aPY=a7nuioF_y z5_t5ufGB4Dmx_w^_D5_}#+&1knVFe;mp`Ls->N>P<9p!osOXKzct?0<2Sozri}cKt zl(D@>w{M=q<1jDU8%m{#=W{k2FERSpL(KXewu{A5WnXKa%m@k6)Yp%FaF}T(yH=Hz z4RNXCB%Ih>Jqmi9JfkH65>n60*^tECq)zt0wDuz&U$Fm2&XTPMr7yr!B(XrI@bP`KoL#Z^HlwZ0~r}=Hxa-#cg zUy?wW8Tktq%1~+AZuQb`t{4d##hi54a_dDT{g0iaQV~l*L|g-P*V&$)LS*6*Ihr+! z)_c_Ybv5my^Bu!|uvHrnaAqewQwUvZ8x_=rrrjq~4~LNBabh4K7?O5XEbK?FB)V(1 zck%K$?i94O5p=NIJahd#iL$sl4^9i4G% zarG8^=3Ww>qiy4%Ea^B--Rr9d6w;c?Wm};h9`#uK%2`A@O3X*)MQjJ)Tt1v41-2g9 zgt!!q-A>k?Wkm0Fa& zB-Q)_JUmwY4qAS1)2tb{s@bhA`h>OPnQK3P=O5kObWgvI8z#D@#~E&p)0NQS$j#2n zm8x^qHF#?Y*sa~Sm@ZjG)0)`}AYhwIPU-K`pNLC_j8`2~ZW@jk+S*bsLC1A#oDS1# zM29MDaQ9_e_VVklhGQ*iN#jrFgUW`pk6HcOx3CD=vs|FpA!Oq0=98w!TUsg!KD`Mw zA28*{ifT#R%1yhX?o3ao#>Z>O$_~ejX>Vi-Bdi)5GRixyWu~WGwhZTo86@1P$GnHf z*>GBFDIL-;SGeX+Hc>6df!oWVQslE_Wk-kqP$99WEa$rn<~z>;M&QMbqhwmtS9?4* zOKYD=4PSo3+drCkppxcvs2WN^@kro`Ztc0h+1xoJ8jpj+FBZkwg<)(x`b0Jlv!M>uygT2 zly`b~LR$l3oqm3Y_Ky~ZR@$w%@3B^!jF=xh|Jo#$e(rvmjr?f0*~!M}GVGsh_;EWuAfi`F2avcfUJ;4zlN*}>w%fHwK48FsdFz*F&Hm|G>J`Q~r+KY} zqr9;k7U|ax{Z!s$M#=qBs~H{Unduml>1YP#qe{h$yB$2M{Zh-gI0NoDsfM>&Osss*p^z$=7<091;v(=-;;^1b>F0D*#Qwu5^*Y%Y zC^;O@cNc`#f)+@B9Ik(%9EU}O-}2b;*DS>Vu;{WdHyNtGLrbUTyVjuV*5=gP{)SyA zk6Bqw&kmrrX`?mgO4F;Wt7KegaV$`ryAq3ATUX18N_yS$@yz--m+7HCdU_YzOMbq- zzF9I4Ov4~I$79eLQ79EOkflJV7((!fyThdpzf&n+(`F=3Vs*hbRi!|i%b$;zw*o6! z98n`cnU;?ztI$}MfY3SXRcxvNf!g2GPnTfEcV3Eh4`Dskp<2mQi@DzG)W}ve%h9U) z;c?45Tp{|e__Q3t;Czpm(=x>U$m`0xZ6@yQY@M&VShFU5tV%mYGPafxHvbpb-eFhB zVIP&!C1VG^nQ-8QCW1A7$dMa2m58Y@jpdCgaUUJQb@ZXlPfQdzx7Cj4K3thCx`?3D z+PgHM6#z#K2{jN~P8SysCGS>IPkw2(s+Mtqi~0)7*ElC8tOa;X5rUcZrI^uDG~CAB zPK>xh!`f2{NGL;uS3+g@so8`ZBNsIxlGFgmr6{417aOfw?`$E&%nKM-B(!IBQW!a6iD^=^8l`&4fTsIp?#6|M=O=uYx$htM ztL*iMb0<8uIdo4+MSI@8S0E5@BN$6g7VYg9VvuVw?2LGnBNmCV8i|*sklnM_-;_j< zO`cj~T;&iTou)2F87ENXq++1a^Risj3y zYsEy8YJx3VH_~P7eW*;1a$%9aYkSR)Z^7X!b#E22fL+G_>|3ybakM?5XN*TbC&svXK~Q~?2e3VO)nafh8L(T4B^BDayG z4xxErzmC^NleR@_N-PCI;B@f6Nq7@~##^nC^bvecf% zo3YY{AA_Ygq2~kGn)Do}HJ{(vL@d%pK*0SB>!(GX2B-Bx7ft>%bb^DJqE@$* z=+4scz%=j^HVvZ2`mv2cj9=L6T{!*e`bhdn)_s@=f~~}XPHo*Fpwh@xns^g z-y}9G6a>R!IgbAwm3fRWirH+(T7Hzgz6mH`&D6hxhGl#2aGyS*=z#Dq zOUL8P{OyYMWCCg;k!D1aXsI_d)SgZ8`n4$d$O}^pjZ!OCx?c&_(=!zH*FYbv=F=#( zR4e-{Y%0Lf0r2<>wC+tipIi@Jo2(5UFY=(gMFfD5$<;|#QLz*tR+7{-^XVde|6f2f z;*~fIh`LKBm9~pOqtqNQogu);; zw*Y|Hx;GH}`Z6e#TvCDm(l(V!ZaR_8ggriI!5JAgbWMTHvJ@2cEjEz}oF7p&y5~1f z&jGZP!Ow2>g-Bo88anSP6M}!`QT*}$^#{^}Ysmk2D*}ugSTbtQ!hXULq2qDh{DO>t zgbDklzQF@F@bldNjI&*`{?E4zpmD~o{J;6&Ghum33RN&)ws@q}a!-8dBQ~3Q3gbhB zKsLA+n3_KI<82s|T`7fF#85#U(Xe_0;f@HjYkZdWFHHo zB__GO$Lt(z#(W3}%i2GYQGR_z2m5OE7Im<1)4yI1dxaiyn+ulje^z3{NQD&~O^j*y z;L<}EL-4bA93aP)T8w3;jQe!i&sx58hC#iyO=X);lI z8pxm|vvXRy_=u-er`@E&cmAhNO$}d_?Z@^@o=~!Ub-vMW>o(@*sm6mDd!4n?VJyX* z+f!pMdKlQx7!vLiYc@1DL-!-}BDyL{>R$N!xVhDm&^t=oeXcrAc_AuVQB{R_J4~yB z8lsphPqk1sQ+sUZpL<5Q1LUwl<(#%h0kK%R1o?*2bMwq{d zBVtbJJtV9%7gKvh9N5ccadnbCf_b=pTy2Z3^vyV&-CR|$Q?1gpaxZ>tM034Zd+s?Z z4t>n?!a}#jMkMqVcB}pmv1LV+ucypq?%Wu0AHos=r+$dPi-N7~;LhA7l>FJV50iw5 z?i!Q0I5=G)o}O+T=ER=^*p`OmLvgRpUPPdy?p0YIK1OtpJJYOgbKgpM&2D_YTJ88UpJM7#x ztu3%IdTmh^@|#LXJw46sb9{`oQ(r^s>+gsO>i#iA$tQT_PejgG%~Y=sN3@orzdROL zvPeP2#C+WJOnfhzVM&kDHH1}B65z&@k!DxyxT}59p%?v)F9V5AjGQ{=y3DdLHpjm? z9u7q&IB($#)iHlTK3R@Vq~r{}EM6;lLDoPe@*181p_RbnDKdkIwizv(C+@SQ0*(Rw2v%g2{yJmb_y`R5+MoaYYBu0@jhOkt5m6%H+Qb?>StUd`FDd?;7# z^3^bA#4{yqTwL+?jEpt}ihdTVIIrg8#LodCc*}TV zF?y0zY-2TD|IKQ^>%)hFFOTa~id)4DXLU$)c$_xG!8VmUZN83W@6IrDU2_>S@)z@x z^Z9a{73oh9i_)Ln&;m}<5xy_8bV%Mng^-vr^mn9~A4SS@IW0=GP;=W?9L|v0wX!Pg zK&pZK^6xMBL=*L?W}4VIIO;_yCY=#K#ta>(2@e2G2O&Wai?h_zThGfA7QheS(BsnN zKOoWb@lCb2ukQB>MB)+)DL~hD7k1}cC(10gS6A@~2r9K3;31KZlFleiTi&DLE>IzA zxt;2pnr_(i@`-v@BZ0T(x8-YsXh-MiNwY#>%wxa7sa@|O70=y{7WDcXKQHv^0_xpR z;B>gQK9X;!uRoNfK*Pm#x~o|wcqlW9uBD{~6%zuq8FNX*v)bUD7qJPPVA4$p-OI*B zj}rlYa+{0{WJ(NF)JoTL_Gm`G#YGqSTr6o!LUz-RFe=_U=i@CT41yh!P2?fbH!Kq7 zt|NIGK&CRV0=e=n2fwCLx?n2-oHoV|^X=i6ZkLYC2y) zz6F>%q(RN1hV4z`?S$U;cB8SP)X2z@{#5ab)7O%UnX-$0Ng^(fcV`~ zdYQ7R{V2y&N1+Wktnj5uL(MeSNR(=L06A8nm?`1Sca}?lOXyK0iAn8TPBA zG2*Hmwy8x6qY$&uBJSV6FRYd{`?J~q&6_v8(wdCi+)gJub3c3P>+69(?-Bdhiu5n; zrmV>WwBOU+t-t%tWCR#o(>Y?4d(JI5MR-_XTTo(9KqzyTR<*SatEy5H6g&;j4pH9I zk$MT-Pg9eaN<7_aAUP&%tz*brql$ldNipkX0CnBQ`8zTOjp>;r5pjZ{Lf!06B}`yM zTD3Yp`4;&76l%Ecg|3KZQ@;`|3!!|ZWO4|u^c}4H$D6Dbrn)rpQe@$4@Hx~CR81Gs zgQXTT)2mk8wk!2wJv}{oL6j#z^@}5p2B)j1x9}rbR7D~<4#(y1H7E+$-H!(sEx^lbom43i&=n5A+ZcUL(5m@aj z;vh-|Ndy_oW}Tei%5k_@p7#`jyx!hasHdZ|U9sPyQMXIeofzEbPZqy7&Fsv7yxoOC zDDcV8k4WIn=*)<_zB|uQ7t)YE&tgsbux}~Zzc<6vlO>eJu;(@+;uJ71L-U#1M|gNq z@$r&O;TfLrXP;xSh8EWI>*z1#i*%tH>kBCdW+rJ(&~CLmT+uf6Xz zLRIby^DgZjLkNM}T)q}%xiiCdX=`fdIdr-UiGH={l+q}@UEg1cGG0ufA5mE$g0S3S z#?_(a6MoUcV5VGa0HLUmuy7;rvG!>UV&2i!&%hHB_+2YqPWMRMFLpr~bh|n=++ziS zNk8@E#PJHhyw>%+==V}}0g?Rl=~K2+{?Yb~*3D8uB(+`Xdt&?wEG;n500JHu|7JoW z;HKUe9Tin>Ho-2Ir&U*L&>cg&`txTIbbkr>O8?zj8LLO~0AQY4luO-L%=SVe$hf4=#n4a6`O%pns@rMLFm7al>{|O18;I=VNJE z!D}&#f?cUqd0zIhFO{Z4QlXvfrNWEyvYGVtSw(&IQ+4ijAfI$Fkf>ML(=juLWMPA7 zL{3Rb$;LLc`Wa0|^8UgE0h{r{(h`W;sSjxscU+{Tq^j&UC#R-#b#Agh8yFxJdr zHjaJoo=|5LpL3~W*qT>rd?bU`)?`JoudnD-rCo7Rk#dMTnq6z)qY^hEis-iTa!#?A zFJA2CKQ6G438RuT`0@3Hi`rC`L;59Ylrab%#RlCvOo$uV4PfOSDoA-o181b7m=~;k zi+~%)|`4=k}Z9i)(9VT`aw{Dn%*gQl~DuhUP*7#3%0N|MLW?+K5c?8I__m`%rZIi`r870uuRZ`+aRbBU<1J;vDn?7h$`LX% z^Xck2hnal2Bi=&PlKU+B0bBtT(cdQmn&OX z^wMkSSYP)nV1N_|b*dEDm+(e&zibT2ivJH!{1~8*@=~L#{p}d@cxR_~X(JDV7T4>% zxZWveihuy){}5IPKd;&TQ(WBT5Hbxy_MH8up!IN?&q(e5>F<1%zFc*yg{Uwu_g~@A z5rCNPRzAx&P4!T`V@Y0vLLo9gYHnT4=b(MKS<6&Qh)1-NZXXl|r2%>_0Nd^HjcKHw zPMLEz-~XJFm_26(&>X$kh!lxOT-J{*R;H@fhfI78dZFp=*SN~E--`d0=1!gcWf4-i zjq5$kA5a98Luvfsr>hM%<03WJp5cYt*&;_vjVl7zYn67Po510E=Jfh_D{-=5w@EBq zSWm%7q9OQ+Yu?O>o!q!EK{Jfx_QVP#5L?%|^@@vTVlG35>|_xnh1~)b?>~IV<C(#A=Bi0yo}G!OP*%b8kk#qVSETORhWVit?LOdKK6pc z;#vc85CepIpX5dgj>Fl$lnGqKX1gdRN~}S0x%YpM>biKFX_9V+`v?W>fWs3bBc3ubkeO&Zw6!H7A|s=4$Fk=NSTEE|56EE}n#+CT%u1#_{Y_k1 zOs=Zfjl3Qb$RwwcN737+N(78pAw88_ z-7Y?Bzf*_hw;jO=T40aXV-O6^&nESn&v2DeLal9Wu`OOnY{Z{CEOn(Y<<|_0_N{Ji zRxs$Uhi4-L5!6$9{pZh%#C_-6$@lL&1rT3SlObbmwZ9C&V|r{fJn>Uux3_*MPh)d* zH(xo#f|a?b|7`HoVLM)L#^80{^C8b&$CbX?(DZ66x?@Y13;!&s&I{3W?mAlbzYYfO z;H4+VBtR8B4(6M4bBbl=homYzjtFB^VzM831HRbIry<_E_eMy_t=J%Faln3idb&F| zOnVTRJE*z8Om4F-lnJNt-PBcr;RCOyRO%6pX1M?NmyDLu8GDPJ zZnb8o-D)byFPmGNo2d!?p8v5jEgiUFB&4l7;iXU+Wo66ukUToImxhT`nWmI~y=DXB zg5aLE8ER|2ko{9UPFHvYWRDuq-vCqKVBz*}mj^0onD*?!9nb`EgoI86Q|@B!qsQ@k zdLqmZ5Eh}I66^~jg1X1gXUze8V6*G7PS+Dw}H2|wsvoDKFXA_ z{Xve{OHYFgrTpmzZ{*ZyVJONsNXx#^ph zRbNPnjUYN%>pIcYBof2q+h~m-%^1}Fgq%=9rxPEf^`UYrU6uZext1^ZIJC+;01$|? zggDLhr9eUf?CUJ%MglP}w$U9Qf#Fi``Zdm5;ll9xlqV!@;q!gdiJkZcc$`>aMS19rBb58#xjI zECB>4o;cq&GizUf^$^a++FG^L6x4OU*{;flq5;fnAJ1(^NepNsVB^q)OEpTYxvR@_ z3<6e8yEW|I0>MMd*tpkr_%=&jNr%OFyze{_hD9$YZ?k&L7G3tq17m)#GrJ`_wBL=n7Pj&vdBqVijntXU1wo+13f_-%%?Clq)`&!PMY!P!1oW3{? z^T}7@;-nAiLs+p6wW{oMwd&mZrEp%&K?tfW=Y*M`0x=>-J~JeTTEwmgyhz``V7kg7 z2nWRPSJQ$fUs|OG02r5yV)RtcvCWhUYBCHp7e0kUM#p0Wd=@NUrk*E&&VzWQ8BB%$ z>MGOL4TqPN-@Dyc@Y-#^o1<6Yx|(&ruT6%XD`|}xFrXj@nbcWv^!o9P#48V^yXvJR zFvP~b1geR1?}~ty`A0MeZ5z&P@tHoZFKM7zu!eF z<)xMZv`s%D5|Q~k7USc`v*1{;NZdVsBHsO_KrBL4cKQa<$w`FO)hEkl+-SNjQ$)uW z-eq+@=Fv=(z{f#=GxfO8M`!i^>wqHgIH7CzBIz|^SdH#$?184Awh480^%VL5p`op* zDu5gp!7hZ6>wB`MLAPe=q#FdTFOtXG=OBBi-7#!5GGE_SRXM+W=>t0hDJ3PPbkRQE zYEOZuL#a4#AMo1S+mnkQ?Cc`HwZ6sbhff+2iHOx5B{ZHB=Q*hdILh1J{ZDJZw)gE~ ziQ6?+7l@MkW?ToL`@n3nG1Sl*Cs-$hJ}i%lP2c3wwGe%$=;wlJ{-+rNZHoY z6G7gLwgZT{C|M`&mIxk;L098@H0aAi%515p0Sb|yLqp~A)VWmd!)fzfT{quh_4#Yl zh8Zn^CWnuY4-?>K>I5vrB_t+G%_ib`9ES6?w2BQRBlL!@ua4`09`(@uoqsD(0zt=t z81QQsmuh1QUkXxEQaL%f?WwBP+V1)g>^K4UtLrL~22lv%Z+fljVr>m@K}pVla!zHI z?@I#5xZq$$r-QfS!?O+E(EbJZwUPWfprWbNT9Py#u8)`uWi_*8iK^J$H_E9*SA~Mj zb!35qS!(P*ER_Jsd>~Eo9-y>BLdAx?OJ=sILH_>xJ3Alz{A8WJ0sH&@{d-$T7UnEa zHM?UuIPlPck1cFhaZv?hj@39j0KG9Y8XW`58L=^4Qw1UmNe{dcty#ItsWp%rjdt}| z0VmdrZ_zQ5^)p5Y%GanGPLm`Ych=*E&DjTwgx_SCR;9L&q!Co*9slgL5RE(VH)ydz zx#e7A44cWQC_CEi+V5~V0cRC=-oiELpC@I4Y??4y|B%aZMzRCgV7f+H8eN3cXFqJ5PpHX z!F9J}33L;66chZc+OB26L-+Lb{6*M4a&auck^+DMf2BQN7E2&$V4|VXs1)e|5w|yi zkA`7A3RLyKf&<^nnG!LXu63>A&8BN>LR=omkVyt{JM@2h4IJmwuBOxF2M-@AWGm7& zU~u7aYMcFI&M5#-C?j|`2wp4Zsh>_*)P;{=w`rBZDc@w}M27DG1}u`Oj;ZyWRKX6)pV*de3!(z>$i$fmkl@Y6y$?r^!!!Tr;_6D0 zkBvuIPD5x4zjCuKOIcuQH=FPOmCZ83nY7c8@goNNEnCe0@dhFeK46OWR#sHN6oIr3 z6g^R+!ynEG*Xv!~-2uS0kB+wbQ#)teue*7aa+K#{dxt^Zx0oTmdspy*`B>2l?(h&G zeLJl5HFS1n>$V0e<*C1c7!?mbr~g%l;5Gxw7%+096A%#s%-}s50WKWHiyH)vb#s)B z<4A$(KS1Q%o~f&|nr{&cr*6-ZwO}>mxxIL>NJSeld)1 zU?FRuzyGc3^yBxv5&tbMaO@)y%Q5P;-CYZl;sMnnNGLf_+x+2IDdBQ%{bv)tVW>+; zNB{+{?rbd^YzB3?4@_$Pyqnf*8SUB&`b!+ z+uGU&2M58f7h15iWrcCMU-9}Q-zc_80A@X-pb!-m?c@$7Vb*{U?}WJ6l{OFX+f#y#IHmUA0HnL4N(9U zldYwt7FY$vVQX@%sVN!AfGR2~MN+zjOb+3pp#ymuJPr=Wqoc}xphPN}BoWQ*k3%OL z@7W6Ka3&xhy?%YSLi&FltFK<8#>ox>95~aGrtPTQ2j;?`x@nce65hD9v#hYJ_`@Jo_pe=!@{03U5bZ3 ze)(xMWb_%K3&Huga?u2$PJ=*FK# zfrZ<`7Z1RaVKeBdaXuy|CkH7Z+Eg8s+U7u$O1%&)Wb62ogWw7l(>lws0Hy#6d%!Db zR1o0mh3&T{sibec&VapZQD4mu#CCr#0#3}TC%zUeaIaSif?98B^TDR~7t8_74evx8 z9S)oO-;DA-(3-&m|4*qWERFx0w*KF;NH{nr1XvFFKXd3Kq<_6OJ~TQydgZmFlT%Oh z{P(bgt%E6tp!U{QLrl2(QrpdOg@hvUqT=F3L&4d{e{H56rpi+aKwxj}FLj3|-tzQ@ zgOP9?N%bMFu6nzbzBgGSOqR2Psz;L*QXqatxwyET1;wKX1=9_2mew#EDLGZzfsQHP zn`}oHQ=VlL5uOU@dyaWLcvRj2+Lrfe;vM^)Dwd83+X#N?Zv~u z$h{u#r?Of?AfbljHE0jR&kom*w%rr2uEjr7!47fs>&I;FRxy}^)Bw&EG=dfiPP>%d ztF?pJhyw9}fLQjGt**ZJ=}*E%8=S8vaf&e{UM0`i5I9yFngqUl?Vr%~MSnCt{o6=e z^_~d5{O398>FL?oCZJT!ZZX}p*Y$G8f|JE&DR8|{SOXj zr~)e4$c6y^KyJDcK8ftWkw(OJ*FyX~yEU$=@{_RR^~07?LvCBU|#eKfsJVeL{xoT0`+Pi$AxtTl`X9ROt2R zwtIEo;SiKco+5}|$8692*}3IA=<1+Sg-fS;ka&Hu44_wPA;=et(E+bph9C3SqICnX zgoDq?kXVG>^=jg3tKSY=K2t+lH5}9EvQZpcTC-SR)tDPGKxcf{=X<72NU2NnPbG?; zxWo1l?BL#c45E%;=j7RMt2Rd1hzoO{asv?Wgc|;MN%bXFw#a;65gRMu%(|a!^+_=wrx}M)Tr6z=- zzDeFqMY**hn{I?wB$j#HK50?(MAF`CiRJhA@B!AR-_?l%K5UW9)4LWrUm9WY+`Q z&sPW12Z8~@*d8tPRzZ&7z`>;liQ9(x=QOJEY@4&Baz&Cx{uRI5RTz_e*3(=u-*V?g zu5>nh3W**gQ>0bih3R49lK`*&+C?ZKKAW{cmM-+7ZqE10!_#|1jM4J75E+{#R@ctI z%&TW=D&8lq-S^jcPZ54<*)eay#(Vm8O>W12&-kb|-9j+9M75u8`%T{HAx%Z9LHyp< zDTbrrUP=(VTzzeP2TwqA|1&v%dgvC*Hr*gqG1bZ_Lqf>3zAIJ2*=~B1fy)=}h*s$` zzf|p&^LK+8zJi0#N!TDAMnY08of&y?(EMbYdd*=Rmsj^);ja zo2`J2(w7pdj}E5KQ#&JQwl;*_Xs*T4Yg{faG{h^0 zOnx}6N+Sn!Qw5|#(!frs@?Sqazb|smpPwV(5))$4rJ+77P@nxt`g|HezIBiDbVBRt z+91v1Tsyybx~a#Pr}sdld?+u5a4fj;FZ-SZwON|S3kneOX2Z3Hz5;2m|nDz;CjvYC;c!on`gv!SB;wbMS?{xNSP_c zAC=4{3<71r`FwKbgrWMLj7#i)jWEN-AW5Y2m`so?YN2A!nwuxU(!QC?@EaA@%IF z(qY6;4WmfXTOvAzj?5`;*BZvtnSj?Jr9 z#}PB-+UA!~LoF387^ zHOoDOqTS+=lG3kMQcZF4{T9y;ofG25d;&;-6c(7sxUsz+Waczl;O5IxHdW(b4e1#C zOo|NVee!MOY_c5soLkK94FZyFET_?Tpsr)@;J-!LdAld&%d_0NWf@y{-n4x7D#NZfgZnq&m!hhm5_GNJ>JoclRfX zYM9M8W#>YeAyQ%WGlCXf1qVN-mJxi(LQAX6McCXC>z;*%cGC|*k9x&<$hZCJqtQ6% zfMKXpmBb0|HA>T-wS9M!-VE0UGY_0hCbF-;55;ashK{&><-ONbFBDt@5l8B2O+Nq& zxDaI~(eH39RvrSg>JexqSvY^T>iX@P|3rgbY$+fNk_lQVC#w>d^H#KmChW)!Uu$@? zrb+&4t`tf)4YPg&x+JeFoW0=3A6AFDyeT%29_ZTIGCyZ7-OKE{haMMr_r~VBqC<~G zxz2;)Gk6!r(zRzFw@s&zA&iuo*r{Gw-ZYU%Z z9m(B3d0lnujevlb%6@YkdMHbVxfB7cFg2p^MJ5X^IrFccfQa1X;mu@m*|a_9Py^6> zF8bjHcYwiAie9TSTMAr-fqKkkPBKp$l!*60C6xTIbX&PyEKBiY2(S&CYXC`Em%u?& z@+idP1Zk+pUE8G?DDos^N6?7# zqCGS@IXSF26PUL0uLgqDOe9c<;vpra$(4?GKc0phnIZ9qbAdA3Js1{U127xKi#9Bx z_Pd~JmASd2<9l!|aAgK`KsioFd5XszmiqdtE%)T+FA^)-`(dabZ*5LZia{v!Dx*Sw zs{avUXC1NN{L-&Tg+0iT&%k)s0bg>$;b@0m z(s-DOezDcNTCe9~J|aJVpyY*WQl4KL!P%9I%F8iDd0CB5tf$|rO6)_IN(928W^GPL zm_(R2sTeR<|D*&|@*>hxUR zRi%G{GW07xQef=a#h0Z1Per*IDV2B$C6bGn&0M`xBPYL1Xwfy@qI&Ql+8r(=6AWX6b%9`ZEIt zvhe)@dX0laVpJTLiq5;5(PR_H#C_MB*L)UeRtkd!OzWnpF?ORkrwc|e6DY_jl>q#BwNQ zjeMo>fQ08GG3I6jJHuh<;j7q*W2pX7`iyB?N1E$U#kKadAXcen*{S%wrP%X8ps9RhHD*05Q@>S$dmgqU_F zno9ia=g zFDxH#?n-8pN9zehV4)gtOt-~{9byH8ZRtcLX#4WIKxZW1t>HplE2!tca zsZBl`ZHY_xz!5TCgSCd6w<|?42a@S4$on378XTueX{RdNbAu%QE*mwjH7n=3AY*E?8${Bwl&k;FXgnm#mqhB!4uj6*b}C;X`}&)zBK>RK@iy zQ+u|7`x%DCJ_d@q`$>uQ{Yqm@S9iB!sb2BWB0++4q}!jLBzy2C8mC*MJTP+wZgM5W zH}u56ZX)vd@VzLmHhV{U^~}$0=Kej4D;W_twdurK1B@&P`B;$tCBl^hGX4DX)uKf` zzJ7z4(C9mv^2a``J?GyqKa{CVGNzd=-@0=-O+W$|uk|a{E2gzRhc5>vrJDLKZSHL` zbXwu8__)`q7bix%$!EMW@y`je|GC!whgCtriJ?btUoH`ri$@*km`kWS=GZ~Z4jX+8=HWv_YAF47T$2#!G8^}sf0#G9T@(5U>ra24Mk^6M5( znprAsw{uLp;?wws(JX^*VzqRs6w_JIlu~8y+S8pYA3&hsHg$feC-rv>oz3Qf}>sWCsiRM1uiVDvXPpduW1FAxm>-N9xh$()Q!w}V!^6oZ~ZE~ zI>>V$!v2U47e__z;ubA&**4#7>RfU=LbL69>UbuRPKNwq09QL ziRQLm5R4#V{4((!LTWzU@l_BMOTq5r(8j?o+7!wBeZ8rKZqKqPQ(j3nS2Z;t7H6{3 zHEd~l`$BA4>5;zat%$!fGq7-r9_c$dcw6(!GZqK8r(fd!c*(RWR#~C+DJSW`cs{~a zy~>J3MYi$|@vawytDYts#=*cGh$%V%(=K zImHd(Ps6lKyUz8s!?Rw8du13Vq_)1W4+a|_Ce`^(=lFAFw^~Jnb@o6B;&p0kH8=nT z=OF$m>WHI<6~53!*ZjC{WeK;h&}DaM1pU0+bdag}Oj*m1@v!~$MQ1buO4sE|-MSMu zi_7g~rT693V^WT0XS@kAt_c}871}2zOR`h%)}F{orm2*Q8@U(dvzSN&^M|!fH@~p& zzG<6whP6#UMizlVM(DKiV}B80ueY>_dJc_^UMkGLE?iNb%nu&-8!V##RA|S>TXC3Q zx~D6bnfGozv5F!k=zVWKcgH9^Ex2v+8|$yM)<3LZy||Kp;ulxQ3{gEB5W3RPPNP~c zRm^*sx?zhAGg%2$k)`c^zoD#SyfbnY5&h!iP8WpbHPxTfm%Qo1uomV^(A3Pk)GaoX zrs^6jkUKys7H0Vd0&91RqAUj&xQvRekwUXW{0PFJtMVP;3pcm9ez(R!(_tRg@6!nS zj(*RozFtKQNEWU1D*L-havGWtkOid1;GzdBz3W<=>&Pz`DV<6@xe}RzrDc8Y1h_Ojol_Z-Cb6)59o0cYCy=ajPDFC_ymqi?^;2{GRqB7DBDMbLOC)iJIbkSKE`LY_LAT0$|S zQ5ooEv|fsYkACacEw*(wJZ7%;I6`X}2n4RMCmnmZN!S|FVjA7Q4p{s(xCf@s`}TE^ zw=aJc=x+YH&<=VQX`_StOb%9*sJI+0r4?Adhr*@|E)?{Z(WM&+XbRLBbfc&guZdOv z^RgHvNm${3Ll{t9qd`$uDMK(njr#Kt&AWFo)lbsN5FD5&lEDozKnn{CyD1GI3IpT; z(7qaHXO1%2j+6ey%Xpr$qaDj^wX(C%Ige|e-Ac}jux1dTqRvQCT(`Zxco{nxJG}+f%6dVA zHuQ#u@az|uL_D9TJUgB7^X!<(d0g-te?NFbyg}s_Y($hZ8VWi(3JMA{UQF5cvvYJJ zFuuYcqI5&FWIsEz+*W$LPF}M}{@{Opt-f(w|81r3#l<%{JkGYPzvm9)jZqQXyu441 zJlE(rz<-qRIQwr%0wcWC8UOodpV~8n-O4sk(VU^`$~N4=|42ZXV5O)?JyEEgrl)5S zGUSJUYZ*UcJjge8Mujl~ZfwMd|^$ zfp7&BudYZRj7i`p|4yOcA_PFE)TsP3rPUw{(?TBnM}jKSK29hBR~rGx_3+rEQ6k$l z-up>4H}_CoJ&wZy!alrufHD^MM~*_yo!bjX@Zx%;@yC;rp$Nx6YUf4BDTZ=JJTArh zfuB$>zk8e^*k9lYTAyM4$)F8XJ%rhAq0N&v+Rj!qp8Io|IZ3Vx%g>XK`6?mg8~kQ z{U5UYqrg+QY?AujJH?MVQm3=14`-(zXS_~%gMfSg{&P@{t)t&ULql7FGDH4qBaYem zr4unN!E_@12Uj-7?+!F$_B7)Qr4p8{-e!1CId)$13~28xD>TGmg4_GQdHIh7&-t>+ z#%y_vOuVH;tVzP#55KaS&i=U-n;>AdN7xa^eTmT97vyloC3Op*-)-GrEdw;4Qb-Zp z!^KrA)M1ns!x(;G+dsZF)yoojkZbdR(8r# z*|)4?n?(OrwIG3E-Ba#oN@1xkQ zwvy0vBY>I%aJ%?BIv+piSaJ(psqyp21%28paYQI48|GgZCjyAispSL2M+%XQ-Kc+^ z-A8f?9-u&E?tvP32BsjbpZ{RtV?v#WF3cXz|M)p@t`m(UNI{9|w-$khHz*97%gwz4 za=3tn7;Lgsg8-|EOd$w2tyGHb_2&M0RV7dVZ_Y3Uod~jhd33nEG$PDV zx3wuDtNcLZp?U1-z=Usp5s5ys3qYL#PlnAJu4E78gHE1S5U_3{{$rbHh^>x*u(d^3 z;#n_}3nwYc^ic_a?Sx=|=9}Q)+%1T1ONlN7KVr4I2fuzo)O>k^Tq?NG?9pxoY&>*Bp2|!rHM_4!; z5rC^)xQJk1G6hutzQIY?N)_`w+45su&8jHgx-@7&?SXRT@ILi~7lPtBbl;^&&^6Zu zYA!!lY*%H&SEiIEHGcM+33UMO<@$0mkSm6f)WW@~RxMpyEK7R`xy-YkaAs&=gtnhQ5sBEJ0isKXS2OB zzz5UXjkqFN-mizc-*ZPn5Di2lm~CZ1_~M-g!2BMa*DMK`1KnBrs0$bWdJ7Tybw-da z#j|0}F@V_mM)I7*u7|$C*WC>!ASN;&6IJk0zHAf8lJ{Pl)Z> z*o|2Jm=n&<&TiaMyz%`-_J|%ihTL;EiAH*|4B4pxx*2AU3t(8_QvdZ9ctW-cRpTm= zjiW6=6|`?l=hEZlGyTWhs~rX(eTlu_Xfx&gEHUb3e6+ww+RlZD`fd5 z(=wxHtY`Ree1_r&a{v+DJ3@R`Jv~IC^x)}ae4c;h#10@`hof00XNg)=jRb_j^u-;6 z8=<%a2Lb{>K-gcDU(kq@3qe56YH^3}MyL@1mV6Ep|A!f_JG3I=cN4Ko$eBC8c@lqs zX38^I$;;8jSUkBAD6jUFV#ns~@ey={JO63q!BTJ*zrE`>)8hbL7v!ZDk=rNr9pwVL zD~=iR;Gq*(-trNb;D1E1UqaIU7Zf{g($|I4)O=)Z(=oc}7H5SSc6{4&tcS*)KHe)` z5x(D6qhFBaD8K6}v0^oe(aaE@CD=H*?h>(jhoy90lCB5Lb=m?CWi3Os(WLI0XT^r8 zpECPz53RwqCzKTOyWTZR7_)*}1VG90+YrYQW+Xn;H%_0vHk5gM<>%@;LJrm^>0@Z( zpF43I7cr#4sB}M`{v161%M%eRWEoNF`&7<#ENc9>Il8iZ!F(tN>1Hhn=w|*?u}vL? z(g^mMpFx_ZU|08(J6>4RoRR0Xb=70zhXFY1#wi{ky-&i0DK%iU6RM{TR zb7Dhg-3`N4KYey>RJbjZ1isG_GsNNM$F3*Y`OwXrSr|Id7E>uYCCr8?m zeHu;~zwHY{6)3#Svh@Ozr z43c}u>I(?{u73BF*lshErlH^%B*5W!)?jldV1c1Gd3Ch1yrg$8e=!QXn_HqNTK$@V zI0af|hD_mSj5sS8+LomMC0h^UC+&jk{sNZdf*ecE^96Z&u!xdx6-@d-D=N@eNMVe} z$T|Qi2DRR@M#7Os18Kl|&2${!i@vt=s72MYnssNZ>p#?7E3UqU1rd8B79%z1bM{t< z;Z&c)CoM102{yZv6}}#RQLyC4lmeDDai}telJ5hoqC`NeyPyG*6%E6`5_O*W*SiAh zu^Q)~0(35V9iug&tYF{WDnTNJ2h>P^EuvR#Q_MHxmPfq5znO%Cz7Hry9FaWb2U?=yk#`*!^m$;9y+7G1S2*`$|8w-T_>4_5HntN-d?M!3PmFvUW1PQ zGH#MGHNKM^uv0{MO-Cr5P?I&^O)dS}O|wO?uM_5SnV}0fofuZv*g5I&q(D;g`1%wE zQXb&VGQCB|*3eY0_rS*f@_rsjqC6dJVuEMLvkp3J=x7=%t+H0SjDS%c74T9w-0o89 zJzk{p6sh!k4x3i_vCxRNeVRPiHagU@@hrjT?Fw`V*C3dTROjVXJO73GP5L@;b~vs; z7s7MW?K|C9_swhX=An_kTD?j`8s=_s&_H@5nj42Aec;@(qv|)sLt|R73X4_nr z6=5OEzD}8;)+W}YE~!49c%yeMHc;*gH)Bu^*Rv-_lCeX!*?$6v5};2sf+wp*b5v#W zpUC#Xz&-j8@Svg1S*X!BVH4z=<9;8th=oP(sg@l-X&s&W7Q*J{iyc=UDz2n_$U^?2 zG1+}4n_pS(5X(=ZB|SOeM;PGa<1>H9F;G#Nep5jO)9u1*XZEaS01>-)%alkR91!dOWX9jL0-_Ia8ut10f1Cz9ir>7_ zqo=4!0m_vnsAYTT<6?<}`;I%^p8&v3z!qfYu3a*#1w$Z$82}UH$L^ENfD1ADR^$YA z3xsF$Lxt{ZJz;G00M5u?_W*$v_8!KM)Hc(~7K_6^RZ4{d%<1p90zujUcQNV=69p$c z)#FL1Y6;{t2l?^a0Hf?g(xHX@nFb^ou;*p|+xg$IwLg9}#PdJJ)`vdKSKb0FkqAWm zSb(OMELE;IjpoAn=4@tw2QnELlmM=b#`$%pA6&=$px=S4wzDe}n}|rGzE7Y(;{vGO z^_Mq>1uVWoCL2G~`1wyvFs5~aK0ctT?oXG8V>NbDqoE61Cw|A62QrWY`(da>Saz84 zPjfgNhR44L9Tp+m>mM6DWdfhF(|JdJ(gRm5RKJN&%I>~W{|6_h2Rg%6bQU))Ml55C zTKNivn{H}yu%9D+tivT!C#0wL>Qifzya3&}Mkv7-a=lKEiMh7XtN}@X?;*Xo*!%|f z(wWj9zjT%{qbm=pdMiQAgcCIHpEdiL(`@cI=A=}weLt}%3^Z4y$xe)4doRajKnp|1E zqRr%*dw?U15^ip8esLdX1g4J~Na7vdx`W~ds#sf~8)Y2%*OmIH>m|OvMnP4U3v#~2 zfOuYGRa4_@i;LSp={eZ<@`Mdm2s;c!w|_2s_T$G7AXL(;bVG{ZjGV&CYkvWGZP9E? zk!eA0u3h^(Q9#$<+}y0^L*2%zach7Y7u&qHf(Zuas zLQ(qxL(fowqIZ8E038lY!iTjS_(%ZZlfC6=nN?HRds$iLYcLZN_=5)sJK2gC@yRsL ze=VIv-4GKKQ2F{C)u&B02eU z3C~#FOc$YStJ4WvCP4G{)abi3WH!At1F78X6AvW5$j?KH0tM=&C#NV13JYUM-grBF ztwYbxn|~{FA(Igxw;Lj;c>;rd2yiD$5`=4(w3b}=ISWYMxh{6TXa}^?`}gnb9amYN znm#qmC-XVW&c-HeBRZb(@#DbZg}z}bhU+AknWCAVw<+WBJmv~=Z9xMT!V6zt`_r#? zaFX+a9|o`qi~mzXN-YBae{r0Fwq&%N#RXagGFRYiJJ?>U9{E%--}#tHJiUe?nXuyY2{B7 z(}Z21pon-YT9#p+jCLz-nqQ&NF93a-Yliw1eWiS{;BqEi*47iZpCN+IXKHKsKnZWA z#n&FLGC4Zv<;kX&^=WQu(MPY*{NidV+iwNpftFh3EkDvjOLZ>4KKS{;vzx+K;`zR< zZZB{9??2sSZ!ljkg!*)_xDeNA*53x_2hjrKP30FQXl$KeKnK6z6E>Mt>q_h*!On z%LDm|+{K(4d8Ck2Xi+>+QDdIj84O#pF6S-;h4l^FtF0wUP4&t2-ife7{!oxF} zY4?;>c|JH8l&&4L+ui+~Mu6VNdiMo?d*iF*4|z4fAZl7j6J&eu&{o1D9v&Csw^}DO>Td7QmeAb$s7U4bT~^R3DzRd* z!snkvbYm{RY)yEYqqR6J`6N{tsw7w?&j71ns z-7YHdi|Kr17)B7+wWKAgIxA!7O{6f)`z{VB?T8&Ih{>NNaZjI~&bvL`GRqzsAQMCX ziI~Bfa>;6VEUG~h+VP;>L&_2JjCFbzQT8q5MbBh;cJ=kv_2qK++0t;efY}s=4Bd2= zyh`^4B7rnR^`a%2@W`OJtS<=ax$54?vm$OA11i@-}<(2)R z?B#?gMc;Vz==sB*CAkm}+7e0=^Oj;9q*7A#^@uX~te@w0NONMsp^Zc1^-YLyya*2_Ip@V+wzYnX?CPoD)5Mux zpzd|f%1slN?~?$=4grBbz58OvhDUll2S5L9QwDZgP@0XQlCar2FJG^E_mP*M^=qo0 z{B#3+xMg!u?8EGPckTP{|7?_0bH{91B`Mu0cbFSb@|^FbpgEDbJ3BiYM776^;7@a2 zxrM%GX`VKr>Rrw~o*UkSU&*MS3r|a|iu?U0q}%w)q#;+#Wc|hfV9i<$X!r^l5%OPW&D-`owiOz7{4r-C9WppRhZXY-(@?w z65evKuuL~ctPoQ5JT#cF*yxlm78Js)v_%XI4DbX;PY0gKWgm7*5;f~yao6dv@piAK zRtqMU)yj^6dz(&oEG(#GgsZ>TDx6p93JG4~^rVhBlW{XCDRn_hTR0q728 zhgzf$6j7Gx3}YzSB~_F6`Y}i~iAxC`j)=PZiXcHc)9b6_RP+2`{*1bEqR#cHo_5!w z==mp9x*sxzZecPtD&M~1>%Q6nY?O+4IZ)+EQW*4H1JoPoB6&~sHnvhzjG&E#0?Z8m zo8eqhJ13r#b8Bm8D5HjouRpTav$DdJRqam3I`67sEux?>+?n`U*VTk(Fj?TiHADi* z1?pm>hCsvD%>i4?0p~9B%U08d@C@H~%CO4JGCb|jc{t;5&EmJ4&kU=CNs+V!r&a9zVpkJD;CQyT1(3y*xNF|bqU--Ez??eV2SqtUEO{aTiR z*X|?7(GOd6w93$p&d&v$Ny*6#FXJ`ul`9b65t(lH1hxD?$qy2j@3m%Yxnmy-TbFpm zkwr)izLP`k3y`N+k444^RW>qXs1mI-rU|r)jr$s zahdpp1Wo`jJt%sv*VoIT~ zGUB7169--|U6t*T+;_rO9|K0Wp5awas;?Z2S%#xlq3o)Fpd|PQt6GyNr7eCU$!f@w#c**}~aD z5Gg_Fa|p0~G=d@tG11y>bRB`fw}hPp-Z@xc2dei_sY*7$6;f0NrQB6ItA$lsV&kWDbgw32qN9xu<8C5>N)zp z_q+FgzyH4T&pz(`?B`i)%{j*$W306al$92}cjxgPI5@a_Vy|Av!@(hxz`?6$%yRnC>JlIF85u8Kx^_9J2#Nf3k6_4&2=jNDe{{zvA()kVtE3s)kEU`hKSogPQOTKEm`oV401fa56rNnBzn$+=a*Ex8NH=;!fm z{W7Irwc;G9?F*t6=V$n)kI#=2SI)scZq@mU$vC%4X{;TEXPyKT0Y&~Cn1!s zE0voaEV{m5cWc@h{h-`OW^iif3~r8nOOBbJO@Xxb%ql|_+BU-AW2{i?wTSvSWZLPL ze*X8tutw43iiD?398nh|V_1*vzbtq2;Tu?ecJiguLh@nJeC`O>+{`=Ce~hkcA zB$KhSPyL;}5<$quDm$K+HO@tk=4h>Te;c_gr-aHBWIw7xcJ zU%zlwP1UEg=EKZ}kRs|-Ghr(;>7u6(Gfwok#Be<8h-!^&c^BSYf*ork&UeAw`JxRtgFPyY;LM5dk&#KEm4l=cs;LVblIlu
    + + + +

    Coverage Summary for Package: bagpacker

    + + + + + + + + + + + + + +
    Package + Class, % + + Method, % + + Line, % +
    bagpacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    +
    + + + + + + + + + + + + + + +
    +Class + Class, % + + Method, % + + Line, % +
    BagPacker + + 0% + + + (0/1) + + + + 0% + + + (0/3) + + + + 0% + + + (0/15) + +
    + +
    Qsbv6tB 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 J*~icM{vAo?*(U%1 diff --git a/docs/umlDiagrams/AddExistingItemDiagram.puml b/docs/umlDiagrams/AddExistingItemDiagram.puml index 2b9f8f4352..e963ab8181 100644 --- a/docs/umlDiagrams/AddExistingItemDiagram.puml +++ b/docs/umlDiagrams/AddExistingItemDiagram.puml @@ -17,19 +17,25 @@ activate ":PackingList" #orange ":AddCommand" <-- ":PackingList": isItemFound deactivate ":PackingList" + Alt #lightblue isItemFound ":AddCommand" -> ":PackingList": PackingList.AddToItemQty(itemName, addQty) activate ":PackingList" #orange ":AddCommand" <-- ":PackingList": deactivate ":PackingList" - else !isItemFound ":AddCommand" -> ":PackingList": PackingList.AddItem(Item) activate ":PackingList" #orange ":AddCommand" <-- ":PackingList": deactivate ":PackingList" end +note right +Ui print out methods +omitted for clearer +explanation +end note ":BagPacker" <-- ":AddCommand" +deactivate ":AddCommand" @enduml \ No newline at end of file diff --git a/docs/umlDiagrams/BagPackerClassDiagram.puml b/docs/umlDiagrams/BagPackerClassDiagram.puml new file mode 100644 index 0000000000..aaa24b48c3 --- /dev/null +++ b/docs/umlDiagrams/BagPackerClassDiagram.puml @@ -0,0 +1,71 @@ +@startuml +'https://plantuml.com/sequence-diagram +### Command Mechanisms: +For all valid commands, the mechanism of implementation are as follows: +1. Read input - ```runBagPacker()``` method in ```BagPacker``` calls the ```Parser``` class to read user input command +2. Create command object - The ```Parser``` class creates a corresponding command object of the relevant command +3. Execute command object - ```runBagPacker()``` method executes the ```.execute()``` method (overridden by child classes) of the command object + which runs the actual command function +autonumber + +@startuml +skinparam linetype polyline +hide circle +namespace packingfunc #DDDDDD { + class Item{ + packedQuantity: int + totalQuantity: int + itemName: String + } + class "<>\nPackingList" as PackingList{ + itemList: ArrayList + } +} +class BagPacker{ +runBagPacker():void +} +namespace iohandler #DDDAAA { + class Parser{ + parse():void + } + class Storage{ + save():void + load():void + } + class Ui{ + initialMessage():void + errorMessage():void + helpMessage():void + printToUser():void + } +} +note "Ui class is associated with all child classes \nof Command class these association lines \nare omitted to reduce mess" as uiNote +uiNote .[Hidden] Ui +namespace commands { + class "{Abstract}\nCommand" as Command{ + execute(<> PackingList):void + } + note right + Omitted some child commands to avoid clutter + (DeleteList, Help, UnpackAll, ListUnpacked, + and Incorrect Command) + end note + skinparam groupInheritance 2 + + class AddCommand extends Command + class DeleteCommand extends Command + class ListCommand extends Command + class ByeCommand extends Command + class EditQuantity extends Command + class FindCommand extends Command + class HelpCommand extends Command + class PackCommand extends Command + class UnpackCommand extends Command +} +BagPacker "App 1" --> "1..*" Parser : Parse user \ninput > +BagPacker "1" --> "1" Storage : Manage saved data upon \ninitialisation and closing > +BagPacker "1" --> "*" Ui : Send message \nto CLI using > +PackingList "1" *-- "*" Item : packing list composed of items > +Parser "Parser 1" --> "1" Command : Parser creates relevant Command > + +@enduml \ No newline at end of file From cf2396bb04d58ab58748d835f10eca6e1f7a4cfc Mon Sep 17 00:00:00 2001 From: linuspuah Date: Thu, 6 Apr 2023 16:41:48 +0800 Subject: [PATCH 115/207] Add linus' PPP --- docs/team/linuspuah.md | 71 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 docs/team/linuspuah.md diff --git a/docs/team/linuspuah.md b/docs/team/linuspuah.md new file mode 100644 index 0000000000..5b7a2309f9 --- /dev/null +++ b/docs/team/linuspuah.md @@ -0,0 +1,71 @@ +[LinusPortfolio.md](linuspuah.md) # portfolio + +# Linus Puah Jia He - Project Portfolio Page + +## Overview + +### Summary of Contributions + +--- + +##### Code contributed +1242 LOC contributed ([tP Code Dashboard](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=linuspuah&tabRepo=AY2223S2-CS2113-T14-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)) + - 71 lines documentation + - 483 function-code + - 534 test-code + +--- + +##### Enhancements implemented +1. Added `ioHandler` package + - Reading in from CLI in `Parser` class ([#8](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/8/commits)) + - Printing out to CLI in `Ui` class ([#8](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/8/commits)) +2. Enhance `AddCommand` function + - Create feature to deal with adding of repeated items ([#137](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/137)) +3. Error catching and Bug Handling + - Added various Exceptions in `exception` package ([#37](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/37/commits/ed24adb50654c55001ebe477d860c36cb6a6b9d5)) + - Added try-catch statements to deal with functional errors ([#79](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/79/commits)) + - Bug Handling ([#36](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/36/files), ) +4. Refactor packing list to use `ArrayList<>` instead of `String[]` ([#23](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/23/files#diff-215cdbb994affff07183e82ab3ac790e169e38469c4ec7d920f6ede6d2957f45)) +5. Add J-unit Test for the majority of code base + - Command Class J-unit tests ([#140](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/140), [#151](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/151)) +6. Create feature + - `listunpacked` ([#151](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/151)) + - `deletelist` ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) +--- + +##### Contributions to the [UG](../UserGuide.md) +1. Update UG to include max integer supported by BagPacker ([#154](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/154)) +--- +##### Contribution to the [DG](../DeveloperGuide.md) +1. Update User Stories ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) +2. Add explanation of overall command mechanism for the whole application ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) +3. Add explanation and [sequence diagram](#contributions-to-the-developer-guide--extracts--) for feature of adding repeated items in `AddCommand` ([#138](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/138)) +--- +##### Contributions to team-based tasks +Plan and create the framework for BagPacker application +- `exception`, `iohandler`, `packingfunc` and the relevant j-unit test packages ([#7](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/7/files), [#8](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/8/commits)) + +Issues tracking IC +- Labelled, assigned and set milestones for most of the issues +- Regularly update the [issues](https://github.com/AY2223S2-CS2113-T14-2/tp/issues/created_by/linuspuah) tracker on GitHub +- Managed the issues from PE-Dry run to resolve any repeated issues + +Managed internal deadlines for group tasking + +--- +##### Review/mentoring contributions +- Maintain code standard before merging ([#139](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/139)) +- Suggest improvements to code ([#22](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/22)) +--- +##### Contributions beyond the project team + +--- + +##### Contributions to the Developer Guide (Extracts): + +![AddExistingItemDiagram.png](..%2FumlDiagrams%2FAddExistingItemDiagram.png) +--- + +##### Contributions to the User Guide (Extracts): + From 85bb9a1ca5af0d77c2d6873e95586c56e0050144 Mon Sep 17 00:00:00 2001 From: coregano Date: Thu, 6 Apr 2023 19:09:16 +0800 Subject: [PATCH 116/207] feature - Storage J-Unit test completed --- src/main/java/bagpacker/BagPacker.java | 1 + .../java/bagpacker/iohandler/Storage.java | 10 ++-- src/test/data/properSaveDirectory.txt | 2 + .../bagpacker/iohandlertest/StorageTest.java | 48 ++++++++++++++++++- 4 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 src/test/data/properSaveDirectory.txt diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index 957f9a2db9..88587a1a81 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -19,6 +19,7 @@ public static void main(String[] args) { // Initialise variables BagPacker.packingList = new PackingList(); Ui.initialMessage(); + Storage storage = new Storage("./packing_list.txt"); // load save file if possible try { diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java index 2c0d6e8bbe..94c13a5970 100644 --- a/src/main/java/bagpacker/iohandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -14,14 +14,18 @@ */ public class Storage { - private static final String FILE_PATH = "packing_list.txt"; + private static String filePath; + + public Storage(String filePATH) { + filePath = filePATH; + } /** * Loads packingList with items saved in save file * @throws FileNotFoundException when no save file in directory FILE_PATH is found */ public static void load() throws FileNotFoundException { - Scanner reader = new Scanner(new File(FILE_PATH)); + Scanner reader = new Scanner(new File(filePath)); String line; while (reader.hasNext()) { line = reader.nextLine(); @@ -63,7 +67,7 @@ public static void save(PackingList packingList) { } public static void writeToFile(PackingList packingList) throws IOException { - FileWriter fw = new FileWriter(FILE_PATH); + FileWriter fw = new FileWriter(filePath); for (int i = 0; i < packingList.size(); i++) { fw.write(PackingList.get(i).toString() + "\n"); } diff --git a/src/test/data/properSaveDirectory.txt b/src/test/data/properSaveDirectory.txt new file mode 100644 index 0000000000..e1085a7158 --- /dev/null +++ b/src/test/data/properSaveDirectory.txt @@ -0,0 +1,2 @@ +[1/2] cats +[0/4] dogs diff --git a/src/test/java/bagpacker/iohandlertest/StorageTest.java b/src/test/java/bagpacker/iohandlertest/StorageTest.java index b98926bd9b..3680910a89 100644 --- a/src/test/java/bagpacker/iohandlertest/StorageTest.java +++ b/src/test/java/bagpacker/iohandlertest/StorageTest.java @@ -1,6 +1,15 @@ package bagpacker.iohandlertest; +import bagpacker.commands.*; +import bagpacker.iohandler.Storage; +import bagpacker.iohandler.Ui; import org.junit.jupiter.api.Test; +import bagpacker.packingfunc.PackingList; +import bagpacker.packingfunc.Item; + +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.PrintStream; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -8,8 +17,43 @@ * StorageTest class test Storage methods */ public class StorageTest { + //@@author sunilphua + + private static final String properSave = "./src/test/data/properSaveDirectory.txt"; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + private Ui ui; + private final PrintStream standardOut = System.out; + + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + public void tearDown() { + System.setOut(standardOut); + } + //@@author coregano + @Test - public void sampleTest() { - assertTrue(true); + public void sampleTest() throws FileNotFoundException { + Storage storage = new Storage(properSave); + PackingList packingList1 = new PackingList(); + AddCommand add1 = new AddCommand(new Item(2, 1, "cats")); + add1.execute(packingList1); + Command add2 = new AddCommand(new Item(4, 0, "dogs")); + add2.execute(packingList1); + setUp(); + storage.save(packingList1); + DeleteListCommand cleanList = new DeleteListCommand(); + cleanList.execute(packingList1); + storage.load(); + ListCommand listCmd = new ListCommand(); + listCmd.execute(packingList1); + String listLine1 = "Here are the items in your list"; + String listLine2 = "[1/2] cats"; + String listLine3 = "[0/4] dogs"; + assert(outputStreamCaptor.toString().trim().contains(listLine1) + & outputStreamCaptor.toString().trim().contains(listLine2) + & outputStreamCaptor.toString().trim().contains(listLine3)); + tearDown(); + cleanList.execute(packingList1); } } From d130f5ce387423fa22d381983e3bb4897b23e13a Mon Sep 17 00:00:00 2001 From: coregano Date: Thu, 6 Apr 2023 19:15:14 +0800 Subject: [PATCH 117/207] fix - imports for storage test --- src/test/java/bagpacker/iohandlertest/StorageTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/java/bagpacker/iohandlertest/StorageTest.java b/src/test/java/bagpacker/iohandlertest/StorageTest.java index 3680910a89..45023cf34c 100644 --- a/src/test/java/bagpacker/iohandlertest/StorageTest.java +++ b/src/test/java/bagpacker/iohandlertest/StorageTest.java @@ -1,6 +1,9 @@ package bagpacker.iohandlertest; -import bagpacker.commands.*; +import import bagpacker.commands.Command; +import bagpacker.commands.ListCommand; +import bagpacker.commands.DeleteListCommand; +import bagpacker.commands.AddCommand; import bagpacker.iohandler.Storage; import bagpacker.iohandler.Ui; import org.junit.jupiter.api.Test; @@ -11,8 +14,6 @@ import java.io.FileNotFoundException; import java.io.PrintStream; -import static org.junit.jupiter.api.Assertions.assertTrue; - /** * StorageTest class test Storage methods */ From ff1659c1e61d755a6b930253a8ed657ef6987834 Mon Sep 17 00:00:00 2001 From: coregano Date: Thu, 6 Apr 2023 19:16:55 +0800 Subject: [PATCH 118/207] fix - bug fix --- src/test/java/bagpacker/iohandlertest/StorageTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/bagpacker/iohandlertest/StorageTest.java b/src/test/java/bagpacker/iohandlertest/StorageTest.java index 45023cf34c..0f7a5b6473 100644 --- a/src/test/java/bagpacker/iohandlertest/StorageTest.java +++ b/src/test/java/bagpacker/iohandlertest/StorageTest.java @@ -1,6 +1,6 @@ package bagpacker.iohandlertest; -import import bagpacker.commands.Command; +import bagpacker.commands.Command; import bagpacker.commands.ListCommand; import bagpacker.commands.DeleteListCommand; import bagpacker.commands.AddCommand; From 4af30612c3ce8c0de54df60764cbdb8a62334437 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Fri, 7 Apr 2023 00:21:36 +0800 Subject: [PATCH 119/207] Add developer guide main class diagram --- docs/DeveloperGuide.md | 34 ++++++++++++++++++++ docs/umlDiagrams/BagPackerClassDiagram.png | Bin 0 -> 86610 bytes docs/umlDiagrams/BagPackerClassDiagram.puml | 27 +++++++++------- 3 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 docs/umlDiagrams/BagPackerClassDiagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 780da1ec1a..671938f107 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -6,6 +6,40 @@ This project is based on the AddressBook-Level3 project created by the SE-EDU initiative. ## Design & implementation +#### BagPacker Class is the main entry point for the BagPacker Program, below are the Packages and every class contained within each Package +1. commands + - Command + - AddCommand + - ByeCommand + - DeleteCommand + - DeleteListCommand + - EditQuantityCommand + - FindCommand + - HelpCommand + - IncorrectCommand + - ListCommand + - ListUnpackedCommand + - PackAllCommand + - PackCommand + - UnpackAllCommand + - UnpackCommand +2. exception + - EmptyInputException + - InvalidIndexException + - InvalidVariablesException +3. iohandler + - Parser + - Storage + - Ui +4. packingfunc + - Parser + - Storage + - Ui + +The class diagram below shows the overall structure of BagPacker application, many methods, variables and associations are omitted for improved clarity + +![BagPackerClassDiagram.png](umlDiagrams%2FBagPackerClassDiagram.png) + ### Command Mechanisms: For all valid commands, the mechanism of implementation are as follows: diff --git a/docs/umlDiagrams/BagPackerClassDiagram.png b/docs/umlDiagrams/BagPackerClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..4b6ce2d2eaaf02e17f496caff8535a4aa1042c96 GIT binary patch literal 86610 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 literal 0 HcmV?d00001 diff --git a/docs/umlDiagrams/BagPackerClassDiagram.puml b/docs/umlDiagrams/BagPackerClassDiagram.puml index aaa24b48c3..32c6fab4e4 100644 --- a/docs/umlDiagrams/BagPackerClassDiagram.puml +++ b/docs/umlDiagrams/BagPackerClassDiagram.puml @@ -1,17 +1,14 @@ @startuml 'https://plantuml.com/sequence-diagram -### Command Mechanisms: -For all valid commands, the mechanism of implementation are as follows: -1. Read input - ```runBagPacker()``` method in ```BagPacker``` calls the ```Parser``` class to read user input command -2. Create command object - The ```Parser``` class creates a corresponding command object of the relevant command -3. Execute command object - ```runBagPacker()``` method executes the ```.execute()``` method (overridden by child classes) of the command object - which runs the actual command function + autonumber @startuml + skinparam linetype polyline hide circle namespace packingfunc #DDDDDD { + note "associations \nto PackingList \nomitted for \nclarity of diagram" as PackingListNote class Item{ packedQuantity: int totalQuantity: int @@ -39,9 +36,15 @@ namespace iohandler #DDDAAA { printToUser():void } } +namespace exceptions #AAADDD { + class EmptyInputException{} + class InvalidIndexException{} + class InvalidVariablesException{} +} note "Ui class is associated with all child classes \nof Command class these association lines \nare omitted to reduce mess" as uiNote uiNote .[Hidden] Ui -namespace commands { +skinparam groupInheritance 2 +namespace commands #AAAAAA { class "{Abstract}\nCommand" as Command{ execute(<> PackingList):void } @@ -50,21 +53,21 @@ namespace commands { (DeleteList, Help, UnpackAll, ListUnpacked, and Incorrect Command) end note - skinparam groupInheritance 2 + class AddCommand extends Command class DeleteCommand extends Command class ListCommand extends Command class ByeCommand extends Command - class EditQuantity extends Command + class EditQuantityCommand extends Command class FindCommand extends Command class HelpCommand extends Command class PackCommand extends Command class UnpackCommand extends Command } -BagPacker "App 1" --> "1..*" Parser : Parse user \ninput > -BagPacker "1" --> "1" Storage : Manage saved data upon \ninitialisation and closing > -BagPacker "1" --> "*" Ui : Send message \nto CLI using > +BagPacker "App 1" --> "1..*" Parser : > Parse user \ninput +BagPacker "1" --> "1" Storage : > Manage saved data upon \ninitialisation and closing +BagPacker "1" --> "*" Ui : > Send message \nto CLI using PackingList "1" *-- "*" Item : packing list composed of items > Parser "Parser 1" --> "1" Command : Parser creates relevant Command > From f623b7dcd334cb31b638f23d3705273fb89e4523 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Fri, 7 Apr 2023 01:58:53 +0800 Subject: [PATCH 120/207] Split Class diagrams into 2 for better readability --- docs/DeveloperGuide.md | 2 +- docs/umlDiagrams/BagPackerClassDiagram.png | Bin 86610 -> 75369 bytes docs/umlDiagrams/BagPackerClassDiagram.puml | 28 ++++++++------------ docs/umlDiagrams/ExceptionClassDiagram.png | Bin 0 -> 10175 bytes docs/umlDiagrams/ExceptionClassDiagram.puml | 22 +++++++++++++++ 5 files changed, 34 insertions(+), 18 deletions(-) create mode 100644 docs/umlDiagrams/ExceptionClassDiagram.png create mode 100644 docs/umlDiagrams/ExceptionClassDiagram.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 671938f107..b1750a88e7 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -39,7 +39,7 @@ This project is based on the AddressBook-Level3 project created by the SE-EDU in The class diagram below shows the overall structure of BagPacker application, many methods, variables and associations are omitted for improved clarity ![BagPackerClassDiagram.png](umlDiagrams%2FBagPackerClassDiagram.png) - +![ExceptionClassDiagram.png](umlDiagrams%2FExceptionClassDiagram.png) ### Command Mechanisms: For all valid commands, the mechanism of implementation are as follows: diff --git a/docs/umlDiagrams/BagPackerClassDiagram.png b/docs/umlDiagrams/BagPackerClassDiagram.png index 4b6ce2d2eaaf02e17f496caff8535a4aa1042c96..618af68cfc22c22c441da998246977e4d10880a2 100644 GIT binary patch literal 75369 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

    GH>XtfSPnr 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 PDv6$!k!GcaL&Sdo`9Pb( literal 86610 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 diff --git a/docs/umlDiagrams/BagPackerClassDiagram.puml b/docs/umlDiagrams/BagPackerClassDiagram.puml index 32c6fab4e4..b3769a444d 100644 --- a/docs/umlDiagrams/BagPackerClassDiagram.puml +++ b/docs/umlDiagrams/BagPackerClassDiagram.puml @@ -7,17 +7,6 @@ autonumber skinparam linetype polyline hide circle -namespace packingfunc #DDDDDD { - note "associations \nto PackingList \nomitted for \nclarity of diagram" as PackingListNote - class Item{ - packedQuantity: int - totalQuantity: int - itemName: String - } - class "<>\nPackingList" as PackingList{ - itemList: ArrayList - } -} class BagPacker{ runBagPacker():void } @@ -36,14 +25,19 @@ namespace iohandler #DDDAAA { printToUser():void } } -namespace exceptions #AAADDD { - class EmptyInputException{} - class InvalidIndexException{} - class InvalidVariablesException{} -} note "Ui class is associated with all child classes \nof Command class these association lines \nare omitted to reduce mess" as uiNote uiNote .[Hidden] Ui skinparam groupInheritance 2 +namespace packingfunc #DDDDDD { + class Item{ + packedQuantity: int + totalQuantity: int + itemName: String + } + class "<>\nPackingList" as PackingList{ + itemList: ArrayList + } +} namespace commands #AAAAAA { class "{Abstract}\nCommand" as Command{ execute(<> PackingList):void @@ -68,7 +62,7 @@ namespace commands #AAAAAA { BagPacker "App 1" --> "1..*" Parser : > Parse user \ninput BagPacker "1" --> "1" Storage : > Manage saved data upon \ninitialisation and closing BagPacker "1" --> "*" Ui : > Send message \nto CLI using -PackingList "1" *-- "*" Item : packing list composed of items > +PackingList "1" *-- "*" Item : > packing list \ncomposed \nof items Parser "Parser 1" --> "1" Command : Parser creates relevant Command > @enduml \ No newline at end of file diff --git a/docs/umlDiagrams/ExceptionClassDiagram.png b/docs/umlDiagrams/ExceptionClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..4dce8c880ba7e5698247953a5d9b11d5ea5f9c58 GIT binary patch literal 10175 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 Date: Fri, 7 Apr 2023 01:59:25 +0800 Subject: [PATCH 121/207] Fix bug where wrong error message will be shown when integer overflow --- src/main/java/bagpacker/iohandler/Parser.java | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 375f2b8d7c..020df38388 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -225,7 +225,7 @@ public static String getItemDescrip() { * Attempts to create AddCommand object to be executed where it is called from * * @return AddCommand the command to be executed to add an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createAddObj() { try { @@ -249,10 +249,10 @@ public static Command createAddObj() { } public static String[] getAddVariables() throws InvalidVariablesException, StringIndexOutOfBoundsException { - String[] inputVariables= new String[3]; + String[] inputVariables = new String[3]; String inputWOCommand = fullInput.substring(3).trim(); int ofIndex = inputWOCommand.indexOf("/of"); - inputVariables[0] = inputWOCommand.substring(0,ofIndex).trim(); + inputVariables[0] = inputWOCommand.substring(0, ofIndex).trim(); inputVariables[1] = inputWOCommand.substring(ofIndex + 3).trim(); if (!inputWOCommand.contains("/of") | inputVariables[1].equals("")) { throw new InvalidVariablesException(); @@ -264,7 +264,7 @@ public static String[] getAddVariables() throws InvalidVariablesException, Strin * Attempts to create DeleteCommand object to be executed where it is called from * * @return DeleteCommand the command to be executed to delete an item to the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createDeleteObj() { try { @@ -302,7 +302,7 @@ public static int[] getQuantityAndIndex() throws InvalidVariablesException, Inva * Attempts to create PackCommand object to be executed where it is called from * * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createPackObj() { int quantityNotPacked = 0; @@ -315,7 +315,10 @@ public static Command createPackObj() { throw new InvalidVariablesException(); } return new PackCommand(itemQuantity, itemIndex); - } catch (NumberFormatException | InvalidIndexException e) { + } catch (NumberFormatException e) { + return new IncorrectCommand("Invalid Integer detected", + "Pack only supports the use of positive integers of at most 1000000"); + } catch (InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to pack"); @@ -332,7 +335,7 @@ public static Command createPackObj() { return new IncorrectCommand("Invalid Pack Usage", "This item is fully packed"); } - return new IncorrectCommand("Invalid Input Quantity", + return new IncorrectCommand("Invalid Pack Quantity", "Try to input a positive quantity that is at most " + quantityNotPacked + " to be packed"); } @@ -344,14 +347,14 @@ public static Command createPackObj() { * Will check whether changing the total quantity will cause packed * * @return EditQuantityCommand the command to be executed to edit the total quantity of an item in the packing list, - * else an IncorrectCommand objected is created to be executed + * else an IncorrectCommand objected is created to be executed */ public static Command createEditQuantityObj() { try { String[] quantityAndIndex = getEditQuantityVariables(); int newTotalQuantity = Integer.parseInt(quantityAndIndex[0]); - if (newTotalQuantity < 1) { - throw new InvalidIndexException(); + if (newTotalQuantity < 1 | newTotalQuantity > 1000000) { + throw new InvalidVariablesException(); } int index = Integer.parseInt(quantityAndIndex[1]); if (index < 1 || index > PackingList.getItemList().size()) { @@ -362,11 +365,17 @@ public static Command createEditQuantityObj() { throw new InvalidIndexException(); } return new EditQuantityCommand(newTotalQuantity, index); - } catch (NumberFormatException | InvalidIndexException e) { + } catch (NumberFormatException e) { + return new IncorrectCommand("Invalid Integer detected", + "BagPacker only supports the use of positive integers of at most 1000000"); + } catch (InvalidIndexException e) { return new IncorrectCommand("Invalid item quantity or index", "For QUANTITY, try to input a positive integer that is at least the quantity packed.\n" - + "For INDEX, try to input a positive integer that is at most " - + PackingList.getItemList().size()); + + "For INDEX, try to input a positive integer that is at most " + + PackingList.getItemList().size()); + } catch (InvalidVariablesException e) { + return new IncorrectCommand("Invalid Quantity detected", + "editquantity only supports the use of positive integers of at most 1000000"); } catch (ArrayIndexOutOfBoundsException e) { return new IncorrectCommand("Missing or additional inputs", "A valid quantity and index are required."); @@ -386,7 +395,7 @@ public static String[] getEditQuantityVariables() throws InvalidIndexException { * Attempts to create PackCommand object to be executed where it is called from * * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static String[] getPackVariables() throws InvalidIndexException { @@ -436,7 +445,7 @@ public static Command createPackAllObj() { * Attempts to create UnpackCommand object to be executed where it is called from * * @return UnpackCommand the command to be executed to unpack an item in the packing list, else - * an IncorrectCommand is created to be executed + * an IncorrectCommand is created to be executed */ public static Command createUnpackObj() { int quantityPacked = 0; @@ -444,7 +453,7 @@ public static Command createUnpackObj() { String[] quantityAndIndex = getPackVariables(); int itemQuantity = Integer.parseInt(quantityAndIndex[0]); if (itemQuantity <= 0) { - return new IncorrectCommand("Invalid Item Quantity", "Your item quantity should " + + return new IncorrectCommand("Invalid Unpack Quantity", "Your item quantity should " + "be greater than 0"); } @@ -455,15 +464,16 @@ public static Command createUnpackObj() { "Try to input a positive integer number that does not exceed " + PackingList.getItemList().size()); } - - quantityPacked = PackingList.get(itemIndex - 1).getPackedQuantity(); if (itemQuantity < 1 | itemQuantity > quantityPacked) { throw new InvalidVariablesException(); } return new UnpackCommand(itemQuantity, itemIndex); - } catch (NumberFormatException | InvalidIndexException e) { + } catch (NumberFormatException e) { + return new IncorrectCommand("Invalid Integer detected", + "Unpack only supports the use of positive integers of at most 1000000"); + } catch (InvalidIndexException e) { if (PackingList.getItemList().size() == 0) { return new IncorrectCommand("Invalid Item Index", "Your packing list is empty, there is nothing to unpack"); @@ -480,7 +490,7 @@ public static Command createUnpackObj() { return new IncorrectCommand("Invalid Unpack Usage", "This item is not even packed yet"); } - return new IncorrectCommand("Invalid Input Quantity", + return new IncorrectCommand("Invalid Unpack Quantity", "Try to input a positive quantity that does not exceed " + quantityPacked); } } @@ -524,10 +534,9 @@ public static Command createUnpackAllObj() { } - - /** * Attempts to create a FindCommand object with the given keyword. + * * @return FindCommand */ public static Command createFindObj() { From fc44af9390dc376ebdf56215c5e96b7c6c86dbd9 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Fri, 7 Apr 2023 02:20:11 +0800 Subject: [PATCH 122/207] Refactor code to pass checkstyle --- src/main/java/bagpacker/iohandler/Parser.java | 42 ++++++++++--------- src/main/java/bagpacker/iohandler/Ui.java | 6 ++- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 020df38388..1f12b65ddf 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.NoSuchElementException; import java.util.Scanner; /** @@ -62,6 +63,11 @@ public static Command parse() { } catch (EmptyInputException e) { Ui.errorMessage("Empty input received", "try to input a command, to view all commands input 'help'"); + } catch (NoSuchElementException e) { + Ui.errorMessage("Unrecognised Input Element", + "BagPacker is unable to parse in that command, application force closed, " + + "new data not saved."); + return new ByeCommand(); } } setFullInput(inputLine); @@ -101,8 +107,8 @@ public static Command parse() { } /** - * Reads and returns the full user input from the command line interface - * - trims the leading and trailing white spaces + * Reads and returns the full user input from the command line interface - trims the leading and trailing white + * spaces * * @return inputLine the String input of the user * @throws EmptyInputException when user input empty line @@ -171,9 +177,8 @@ public static String getItemIndex() throws InvalidIndexException { } /** - * Returns a string which represents the relevant variable depending on the command - * - "add" will return the item name - * - "delete", "pack", "unpack" will return item index + * Returns a string which represents the relevant variable depending on the command - "add" will return the item + * name - "delete", "pack", "unpack" will return item index * * @param command used to determine the type of variable to return * @return itemVariable which is the index OR name of the item in packing list @@ -224,8 +229,8 @@ public static String getItemDescrip() { /** * Attempts to create AddCommand object to be executed where it is called from * - * @return AddCommand the command to be executed to add an item to the packing list, else - * an IncorrectCommand is created to be executed + * @return AddCommand the command to be executed to add an item to the packing list, else an IncorrectCommand is + * created to be executed */ public static Command createAddObj() { try { @@ -263,8 +268,8 @@ public static String[] getAddVariables() throws InvalidVariablesException, Strin /** * Attempts to create DeleteCommand object to be executed where it is called from * - * @return DeleteCommand the command to be executed to delete an item to the packing list, else - * an IncorrectCommand is created to be executed + * @return DeleteCommand the command to be executed to delete an item to the packing list, else an IncorrectCommand + * is created to be executed */ public static Command createDeleteObj() { try { @@ -301,8 +306,8 @@ public static int[] getQuantityAndIndex() throws InvalidVariablesException, Inva /** * Attempts to create PackCommand object to be executed where it is called from * - * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * @return PackCommand the command to be executed to Pack an item in the packing list, else an IncorrectCommand is + * created to be executed */ public static Command createPackObj() { int quantityNotPacked = 0; @@ -342,12 +347,11 @@ public static Command createPackObj() { } /** - * Attempts to create EditQuantityCommand object to be executed where it is called from - * Will check whether QUANTITY and INDEX are positive integers - * Will check whether changing the total quantity will cause packed + * Attempts to create EditQuantityCommand object to be executed where it is called from Will check whether QUANTITY + * and INDEX are positive integers Will check whether changing the total quantity will cause packed * * @return EditQuantityCommand the command to be executed to edit the total quantity of an item in the packing list, - * else an IncorrectCommand objected is created to be executed + * else an IncorrectCommand objected is created to be executed */ public static Command createEditQuantityObj() { try { @@ -394,8 +398,8 @@ public static String[] getEditQuantityVariables() throws InvalidIndexException { /** * Attempts to create PackCommand object to be executed where it is called from * - * @return PackCommand the command to be executed to Pack an item in the packing list, else - * an IncorrectCommand is created to be executed + * @return PackCommand the command to be executed to Pack an item in the packing list, else an IncorrectCommand is + * created to be executed */ public static String[] getPackVariables() throws InvalidIndexException { @@ -444,8 +448,8 @@ public static Command createPackAllObj() { /** * Attempts to create UnpackCommand object to be executed where it is called from * - * @return UnpackCommand the command to be executed to unpack an item in the packing list, else - * an IncorrectCommand is created to be executed + * @return UnpackCommand the command to be executed to unpack an item in the packing list, else an IncorrectCommand + * is created to be executed */ public static Command createUnpackObj() { int quantityPacked = 0; diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index 7b683dd380..81fe6d1c15 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -30,11 +30,13 @@ public class Ui { private static final String NEW_USER_GREET = "No save files detected. Hello new user!"; public static void printErrorLine() { - System.out.println("/////////////////////////////////////////////////////////////"); + System.out.println("///////////////////////////////////////////////////////////////////////////" + + "///////////////////////////////////////////////"); } public static void printLine() { - System.out.println("____________________________________________________________"); + System.out.println("___________________________________________________________________________" + + "_____________________________________________"); } /** From c509128befe6c0a5f2210696981f87b88d5cff50 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Fri, 7 Apr 2023 02:24:04 +0800 Subject: [PATCH 123/207] Delete old java -jar file --- src/Team_Project_jar/Team_Project.jar | Bin 626470 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/Team_Project_jar/Team_Project.jar diff --git a/src/Team_Project_jar/Team_Project.jar b/src/Team_Project_jar/Team_Project.jar deleted file mode 100644 index 1a09665217c76f972371247ffc794c76dfde23be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626470 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

    7Ql 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 Date: Fri, 7 Apr 2023 04:08:26 +0800 Subject: [PATCH 124/207] docs - add Javadocs for methods in ListUnpacked, parser and item --- .../java/bagpacker/commands/ListUnpackedCommand.java | 5 +++++ src/main/java/bagpacker/iohandler/Parser.java | 10 ++++++++++ src/main/java/bagpacker/packingfunc/Item.java | 12 ++++++++++-- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/bagpacker/commands/ListUnpackedCommand.java b/src/main/java/bagpacker/commands/ListUnpackedCommand.java index 4558bb4ec6..7cf3310652 100644 --- a/src/main/java/bagpacker/commands/ListUnpackedCommand.java +++ b/src/main/java/bagpacker/commands/ListUnpackedCommand.java @@ -35,6 +35,11 @@ public void execute(PackingList packingList) { Ui.printLine(); } + /** + * Returns ArrayList of Item {@link Item} that are not yet packed by using + * checkFullyPacked: {@link Item#checkFullyPacked()} + * @return list of items that are unpacked + */ private ArrayList getUnpackedList(){ Item currItem; ArrayList unpackedList = new ArrayList<>(); diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index d84d141911..b11db21ad4 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -54,6 +54,11 @@ public static String getFullInput() { return fullInput; } + /** + * Takes in user's input and parses it into the relevant commands and arguments to create an object of type Command: + * {@link Command} + * @return command to execute in bagPacker + */ public static Command parse() { String inputLine = ""; while (inputLine.isEmpty()) { @@ -246,6 +251,11 @@ public static Command createAddObj() { } } + /** + * Returns the relevant components of an add command from the user input + * @return String array of quantity and itemName + * @throws InvalidVariablesException not enough variables + */ public static String[] getAddVariables() throws InvalidVariablesException { String[] inputStringList = fullInput.trim().split(" ", 2); String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); diff --git a/src/main/java/bagpacker/packingfunc/Item.java b/src/main/java/bagpacker/packingfunc/Item.java index 2870f88d89..e7864a4008 100644 --- a/src/main/java/bagpacker/packingfunc/Item.java +++ b/src/main/java/bagpacker/packingfunc/Item.java @@ -12,7 +12,7 @@ public class Item { private int totalQuantity; /** - * Constructor of an Item class used in @AddCommand + * Constructor of an Item class used after set-up of program * @param quantity no. of items user wants to pack * @param description name of the item */ @@ -23,7 +23,7 @@ public Item(int quantity, String description) { } /** - * Constructor of an Item class used in @Storage + * Constructor of an Item class used during set-up of program * @param totalQuantity total no. of items needed to pack shown in save file * @param packedQuantity no. of items currently packed shown in the save file * @param description name of item to be packed shown in save file @@ -34,6 +34,10 @@ public Item(int totalQuantity, int packedQuantity, String description) { this.totalQuantity = totalQuantity; } + /** + * Returns whether the item is packed by comparing packedQuantity to totalQuantity + * @return true if item is packed, false otherwise + */ public boolean checkFullyPacked(){ boolean isFullyPacked = totalQuantity == packedQuantity; return isFullyPacked; @@ -60,10 +64,14 @@ public String getItemName() { public void setPacked(int quantity) { this.packedQuantity += quantity; + assert (packedQuantity <= totalQuantity) : + "The packed quantity of an item is greater than its total quantity."; } public void setUnpacked(int quantity) { this.packedQuantity -= quantity; + assert (packedQuantity >= 0) : + "The packed quantity of an item is smaller than 0."; } public String toString() { From d5e3e992668e67df876f6708a657326af7d388f9 Mon Sep 17 00:00:00 2001 From: Sophie Date: Fri, 7 Apr 2023 22:09:00 +0800 Subject: [PATCH 125/207] Add author tags for a segment of test code for add command --- docs/team/tangphi.md | 0 src/test/java/bagpacker/commands/AddCommandTest.java | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 docs/team/tangphi.md diff --git a/docs/team/tangphi.md b/docs/team/tangphi.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/java/bagpacker/commands/AddCommandTest.java b/src/test/java/bagpacker/commands/AddCommandTest.java index bdc9164c13..78cf397885 100644 --- a/src/test/java/bagpacker/commands/AddCommandTest.java +++ b/src/test/java/bagpacker/commands/AddCommandTest.java @@ -14,6 +14,7 @@ public class AddCommandTest { @Test public void testAddCommand() { + //@@author tangphi PackingList packingList = new PackingList(); Item item = new Item(1, "toothbrush"); Command addCommand = new AddCommand(item); @@ -30,7 +31,7 @@ public void testAddCommand() { assertEquals("toothpaste", PackingList.get(1).getItemName()); Assertions.assertNotEquals("toothbrush", PackingList.get(1).getItemName()); - + //@@author linuspuah DeleteListCommand delList = new DeleteListCommand(); delList.execute(packingList); } From 1ce08ba99b2ada2ec4d0499970d139aac7c715e2 Mon Sep 17 00:00:00 2001 From: Sophie Date: Fri, 7 Apr 2023 22:25:56 +0800 Subject: [PATCH 126/207] Create and edit PPP --- docs/team/tangphi.md | 52 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/docs/team/tangphi.md b/docs/team/tangphi.md index e69de29bb2..ae266f6ff7 100644 --- a/docs/team/tangphi.md +++ b/docs/team/tangphi.md @@ -0,0 +1,52 @@ +[Yinxuan(Sophie).md](tangphi.md) # portfolio + +# Yinxuan (Sophie) Tang - Project Portfolio Page + +## Overview + +### Summary of Contributions + +--- + +##### Code contributed +[tP Code Dashboard](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&zFR=false&tabAuthor=tangphi&tabRepo=AY2223S2-CS2113-T14-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) + +--- + +V1.0: [PR](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/22) +1. Create initial add command feature [#3](https://github.com/AY2223S2-CS2113-T14-2/tp/issues/3) +2. Create initial delete command feature [#4](https://github.com/AY2223S2-CS2113-T14-2/tp/issues/4) +3. Create initial pack command feature [#5](https://github.com/AY2223S2-CS2113-T14-2/tp/issues/5) +4. Create initial unpack command feature [#6](https://github.com/AY2223S2-CS2113-T14-2/tp/issues/6) + +V2.1 +5. Create packall command feature +6. Create unpackall command feature + +--- +##### Enhancements implemented + + +##### Contributions to the [UG](../UserGuide.md) + +--- +##### Contribution to the [DG](../DeveloperGuide.md) + +--- +##### Contributions to team-based tasks + + +--- +##### Review/mentoring contributions + +--- +##### Contributions beyond the project team + +--- + +##### Contributions to the Developer Guide (Extracts): + +--- + +##### Contributions to the User Guide (Extracts): + From 7bb6246b0a0c3cbdbae444800c05cd98283a1ac8 Mon Sep 17 00:00:00 2001 From: Sophie Date: Fri, 7 Apr 2023 22:36:42 +0800 Subject: [PATCH 127/207] Update UG for unpackall --- docs/AboutUs.md | 4 ++-- docs/UserGuide.md | 49 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 79002cb604..6fae69a636 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -2,9 +2,9 @@ Display | Name | Github Profile | Portfolio --------|:----------:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | Yinxuan (Sophie) Tang | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johnroe.md) ![](https://i.ibb.co/FHBJtW7/myface.png) | Linus Puah | [Github](https://github.com/linuspuah) | [Portfolio](docs/team/LinusPortfolio.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Yinxuan (Sophie) Tang | [Github](https://github.com/tangphi) | [Portfolio](docs/team/tangphi.md) ![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 0987492a9d..1fb65906b6 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -9,8 +9,9 @@ * [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) * [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) * [Packing some items](#span-stylecolor6495ed-packing-some-items--span-pack) - * [Packing all quantity of items](#span-stylecolor6495ed-marking-total-quantity-of-item-as-packed--span-packall) + * [Packing all quantity of items](#span-stylecolor6495ed-fully-pack-an-item--span-packall) * [Unpacking some items](#span-stylecolor6495ed-unpacking-some-items--span-unpack) + * [Unpacking all quantity of items](#span-stylecolor6495ed-fully-unpack-an-item--span-unpackall) * [Editing item quantity](#span-stylecolor6495ed-editing-item-quantity--span-editquantity) * [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) * [Deleting the entire list](#span-stylecolor6495ed-deleting-the-entire-list--span-deletelist) @@ -138,7 +139,7 @@ Format: `packall /of INDEX`
    Expected outcome:
    -BagPacker will mark all of the quantities of the third item in the packing list as 'packed' +BagPacker will mark all the quantities of the third item in the packing list as 'packed' ``` Item packed: [20/20] socks @@ -159,6 +160,27 @@ Format: `unpack QUANTITY /of INDEX` Example of usage: * `unpack 2 /of 5` +### Fully unpack an item: `unpackall` +Unpacks the total quantity of that item in the packing list. + +Format: `unpackall /of INDEX` + +* `INDEX` is the index of the item that is being packed. + * It must be a positive integer that is more than 0, but no more than the number of items in the list. + * An invalid `INDEX` will result in an error message. + +
    Example of usage:
    + +`unpackall /of 3` + +
    Expected outcome:
    + +BagPacker will mark all the quantities of the third item in the packing list as 'unpacked' + +``` +Item unpacked: [0/20] socks +``` + ### Editing item quantity: `editquantity` Edits the total quantity of an item to be packed. @@ -264,16 +286,17 @@ Examples of usage: ## Command Summary -| Action description | Syntax | Remarks | -|:-----------------------------------------|:----------------------------|:---------------------------------------------------------------------------------------------------------------------------------| -| Add an item | `add QUANTITY /of NAME` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000 | -| Delete an item | `delete INDEX` | `INDEX` must be a valid list index | -| Pack some of an item | `pack QUANTITY /of INDEX` |
  • Adding `QUANTITY` should not cause the quantity to exceed the total quantity
  • `INDEX` must be a valid list index
  • | -| Marking total quantity of item as packed | `packall /of INDEX` | `INDEX` must be a valid list index | -| Unpack some item | `unpack QUANTITY /of INDEX` |
  • Subtracting `QUANTITY` should not cause the quantity to be less than 0
  • `INDEX` must be a valid list index
  • | -| List all items | `list` | Additional parameters will be ignored | -| Delete the whole list | `deletelist` | Additional parameters will be ignored | -| Help message | `help` | Additional parameters will be ignored | -| Exit | `bye` | Additional parameters will be ignored | +| Action description | Syntax | Remarks | +|:-------------------------------------------|:----------------------------|:---------------------------------------------------------------------------------------------------------------------------------| +| Add an item | `add QUANTITY /of NAME` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000 | +| Delete an item | `delete INDEX` | `INDEX` must be a valid list index | +| Pack some of an item | `pack QUANTITY /of INDEX` |
  • Adding `QUANTITY` should not cause the quantity to exceed the total quantity
  • `INDEX` must be a valid list index
  • | +| Marking total quantity of item as packed | `packall /of INDEX` | `INDEX` must be a valid list index | +| Unpack some item | `unpack QUANTITY /of INDEX` |
  • Subtracting `QUANTITY` should not cause the quantity to be less than 0
  • `INDEX` must be a valid list index
  • | +| Marking total quantity of item as unpacked | `unpackall /of INDEX` | `INDEX` must be a valid list index | +| List all items | `list` | Additional parameters will be ignored | +| Delete the whole list | `deletelist` | Additional parameters will be ignored | +| Help message | `help` | Additional parameters will be ignored | +| Exit | `bye` | Additional parameters will be ignored | [⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [⏫ Go to Features](#span-stylecolor00a36c-table-of-contents-span) \ No newline at end of file From e0cc13390ea830f1fbf6d87b116b8c701be60b9e Mon Sep 17 00:00:00 2001 From: Sophie Date: Fri, 7 Apr 2023 23:02:01 +0800 Subject: [PATCH 128/207] Add JUnit tests for packall and unpackall commands --- .../bagpacker/commands/AddCommandTest.java | 2 +- .../commands/PackAllCommandTest.java | 17 ++++++++ .../commands/UnpackAllCommandTest.java | 42 +++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/test/java/bagpacker/commands/UnpackAllCommandTest.java diff --git a/src/test/java/bagpacker/commands/AddCommandTest.java b/src/test/java/bagpacker/commands/AddCommandTest.java index 78cf397885..0cd3f05263 100644 --- a/src/test/java/bagpacker/commands/AddCommandTest.java +++ b/src/test/java/bagpacker/commands/AddCommandTest.java @@ -8,7 +8,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; /** - * CommandsTest to test methods in Commands class + * AddCommandTest to test methods in AddCommand class */ public class AddCommandTest { diff --git a/src/test/java/bagpacker/commands/PackAllCommandTest.java b/src/test/java/bagpacker/commands/PackAllCommandTest.java index cfcf3ecc97..7ac8dde701 100644 --- a/src/test/java/bagpacker/commands/PackAllCommandTest.java +++ b/src/test/java/bagpacker/commands/PackAllCommandTest.java @@ -11,6 +11,23 @@ * PackAll CommandTest to test HelpCommand class */ public class PackAllCommandTest { + + @Test + public void testPackAllCommand() { + PackingList dummyPackingList = new PackingList(); + Item firstItem = new Item(2000, "pens"); + dummyPackingList.addItem(firstItem); + PackAllCommand packAllCmd = new PackAllCommand(1); + packAllCmd.execute(dummyPackingList); + firstItem = PackingList.getItemList().get(0); + + // Expect packed quantity to be 2000 + assertEquals(2000, firstItem.getPackedQuantity()); + // Expect packed quantity to be the same as total quantity + assertEquals(firstItem.getPackedQuantity(), firstItem.getTotalQuantity()); + + } + @Test public void testListCommand() { PackingList dummyPackingList = new PackingList(); diff --git a/src/test/java/bagpacker/commands/UnpackAllCommandTest.java b/src/test/java/bagpacker/commands/UnpackAllCommandTest.java new file mode 100644 index 0000000000..fab9d964f9 --- /dev/null +++ b/src/test/java/bagpacker/commands/UnpackAllCommandTest.java @@ -0,0 +1,42 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * UnpackAllCommandTest to test methods in UnpackAllCommand class + */ +public class UnpackAllCommandTest { + + + @Test + public void testUnpackAllCommand() { + PackingList dummyPackingList = new PackingList(); + Item firstItem = new Item(2000, "pens"); + dummyPackingList.addItem(firstItem); + PackAllCommand packAllCmd = new PackAllCommand(1); + packAllCmd.execute(dummyPackingList); + firstItem = PackingList.getItemList().get(0); + + // Expect packed quantity to be 2000 + assertEquals(2000, firstItem.getPackedQuantity()); + + UnpackAllCommand unpackAllCmd = new UnpackAllCommand(1); + unpackAllCmd.execute(dummyPackingList); + + // Expect packed quantity to be 0 + assertEquals(0, firstItem.getPackedQuantity()); + + // Expect unpacked quantity to be 2000 + assertEquals(2000, firstItem.getUnpackedQuantity()); + + // Expect unpacked quantity to be same as total quantity + assertEquals(firstItem.getUnpackedQuantity(), firstItem.getTotalQuantity()); + + } +} + + From a24dd5037ec384fa8d45aaa89b49f904b57a2781 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sat, 8 Apr 2023 00:32:12 +0800 Subject: [PATCH 129/207] Add all JavaDocs for classes in commands package --- .../java/bagpacker/commands/AddCommand.java | 19 +++++++++++++++--- .../java/bagpacker/commands/ByeCommand.java | 7 ++++++- .../bagpacker/commands/DeleteCommand.java | 16 ++++++++++++--- .../bagpacker/commands/DeleteListCommand.java | 11 ++++++++-- .../commands/EditQuantityCommand.java | 17 +++++++++++++--- .../java/bagpacker/commands/FindCommand.java | 15 ++++++++++++-- .../java/bagpacker/commands/HelpCommand.java | 9 ++++++++- .../bagpacker/commands/IncorrectCommand.java | 17 +++++++++++++--- .../java/bagpacker/commands/ListCommand.java | 10 ++++++++-- .../commands/ListUnpackedCommand.java | 13 +++++++++--- .../bagpacker/commands/PackAllCommand.java | 20 ++++++++++++++----- .../java/bagpacker/commands/PackCommand.java | 17 +++++++++++++--- .../bagpacker/commands/UnpackAllCommand.java | 19 ++++++++++++++---- .../bagpacker/commands/UnpackCommand.java | 17 +++++++++++++--- 14 files changed, 169 insertions(+), 38 deletions(-) diff --git a/src/main/java/bagpacker/commands/AddCommand.java b/src/main/java/bagpacker/commands/AddCommand.java index ddafd3b63e..9867073d1c 100644 --- a/src/main/java/bagpacker/commands/AddCommand.java +++ b/src/main/java/bagpacker/commands/AddCommand.java @@ -4,6 +4,10 @@ import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; +/** + * AddCommand class adds an item to the packing list, however if the item already exists in the packing list, the + * new input quantity will be added to the total quantity of that item + */ public class AddCommand extends Command { public static final String MSG_SUCCESS_ADD = "New item added: %s"; public static final String MSG_SUCCESS_ADD_EXISTING = "Add to quantity of existing item: %s"; @@ -13,14 +17,23 @@ public class AddCommand extends Command { "\tMeaning: Add quantity of 3 toothbrushes to the packing list"; private final Item item; - + /** + * Constructor for AddCommand + * @param item item to be added to list + */ public AddCommand(Item item) { this.item = item; } - + /** + * Either adds a new item or if the item already exists, changes the total quantity of an existing item + * - item is an AddCommand object level variable + * - once successfully completed, Ui message will be printed + * + * @param packingList item list to add new item or to change current quantity of existing item + */ @Override public void execute(PackingList packingList) { - if(PackingList.itemFinder(item.getItemName())){ + if (PackingList.itemFinder(item.getItemName())) { PackingList.addToItemQuantity(item.getItemName(), item.getTotalQuantity()); Ui.printToUser(String.format(MSG_SUCCESS_ADD_EXISTING, PackingList.getExistingItem(item.getItemName()))); return; diff --git a/src/main/java/bagpacker/commands/ByeCommand.java b/src/main/java/bagpacker/commands/ByeCommand.java index db2b238aed..38bf6e107a 100644 --- a/src/main/java/bagpacker/commands/ByeCommand.java +++ b/src/main/java/bagpacker/commands/ByeCommand.java @@ -9,7 +9,12 @@ public class ByeCommand extends Command { public static boolean isBagPackerRunning = true; public static final String HELP_MSG = "bye: Stops the BagPacker Application\n" + "\tExample: bye"; - + /** + * Stops the BagPacker app from running by setting the isBagPackerRunning boolean to false + * + * @param packingList list of all items in packing list + */ + @Override public void execute(PackingList packingList) { this.isBagPackerRunning = false; } diff --git a/src/main/java/bagpacker/commands/DeleteCommand.java b/src/main/java/bagpacker/commands/DeleteCommand.java index 0821901ce1..93d71cd124 100644 --- a/src/main/java/bagpacker/commands/DeleteCommand.java +++ b/src/main/java/bagpacker/commands/DeleteCommand.java @@ -4,7 +4,9 @@ import bagpacker.packingfunc.PackingList; import bagpacker.iohandler.Ui; - +/** + * DeleteCommand class deletes an item in the packing list + */ public class DeleteCommand extends Command { public static final String MSG_SUCCESS_DELETE = "%s removed from the list"; @@ -13,11 +15,19 @@ public class DeleteCommand extends Command { "\tExample: delete 1\n" + "\tMeaning: Removes the first item in the packing list"; - + /** + * Constructor for DeleteCommand + * @param targetIndex item index in packing list of the item to be deleted + */ public DeleteCommand(int targetIndex) { super(targetIndex); } - + /** + * Deletes a given item in the packing list by its packing list index, and prints a successfully deleted message + * when done + * + * @param packingList list containing the item to be deleted + */ @Override public void execute(PackingList packingList) { Item item = getTargetItem(); diff --git a/src/main/java/bagpacker/commands/DeleteListCommand.java b/src/main/java/bagpacker/commands/DeleteListCommand.java index 2088b49da9..109dc23795 100644 --- a/src/main/java/bagpacker/commands/DeleteListCommand.java +++ b/src/main/java/bagpacker/commands/DeleteListCommand.java @@ -5,14 +5,21 @@ import bagpacker.packingfunc.PackingList; import java.util.ArrayList; - +/** + * DeleteListCommand class is used to delete all items in the packing list + */ public class DeleteListCommand extends Command { public static final String MSG_SUCCESS_DELETE_LIST = "Packing list deleted"; public static final String HELP_MSG = "deletelist: Deletes all items in the packing list.\n" + "\tExample: deletelist"; - + /** + * Deletes all items in a given PackingList and prints a successfully deleted list message when + * done + * + * @param packingList list to be emptied + */ @Override public void execute(PackingList packingList) { ArrayList emptyList = new ArrayList<>(); diff --git a/src/main/java/bagpacker/commands/EditQuantityCommand.java b/src/main/java/bagpacker/commands/EditQuantityCommand.java index bab4ea6c51..c3ee734de5 100644 --- a/src/main/java/bagpacker/commands/EditQuantityCommand.java +++ b/src/main/java/bagpacker/commands/EditQuantityCommand.java @@ -3,7 +3,9 @@ import bagpacker.iohandler.Ui; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; - +/** + * EditQuantityCommand class is used to edit the total quantity of an item in the packing list + */ public class EditQuantityCommand extends Command{ public static final String MSG_SUCCESS_EDITQUANTITY = "Item total quantity edited: %s"; @@ -12,12 +14,21 @@ public class EditQuantityCommand extends Command{ "\tMeaning: Change the total quantity of the second item to 3"; private static int totalQuantity; - + /** + * Constructor for EditQuantityCommand + * @param newTotalQuantity total quantity of the edited item to be set to + * @param targetIndex item index in packing list of the item to be edited + */ public EditQuantityCommand(int newTotalQuantity, int targetIndex) { super(targetIndex); totalQuantity = newTotalQuantity; } - + /** + * Changed the total quantity of an item and prints a successfully edited message when + * done + * + * @param packingList list containing the item to be edited + */ @Override public void execute(PackingList packingList) { this.packingList = packingList; diff --git a/src/main/java/bagpacker/commands/FindCommand.java b/src/main/java/bagpacker/commands/FindCommand.java index aac791a9e1..9b31f2942b 100644 --- a/src/main/java/bagpacker/commands/FindCommand.java +++ b/src/main/java/bagpacker/commands/FindCommand.java @@ -6,7 +6,9 @@ import java.util.ArrayList; import static bagpacker.iohandler.Ui.printToUser; - +/** + * FindCommand class is used to find an item from the packing list which containing a given keyword + */ public class FindCommand extends Command { public static final String HELP_MSG = "find: Displays all items in the packingList as a list that contains the keyword used in the command.\n" @@ -15,10 +17,19 @@ public class FindCommand extends Command { private static final String MSG_NO_FOUND_ITEM = "An item containing the description %s does not exist. Please try again."; private static String keyword; - + /** + * Constructor for FindCommand + * @param keyword the String to search for in each item in the packing list + */ public FindCommand(String keyword) { FindCommand.keyword = keyword; } + /** + * Finds all items in packing list that contains a given keyword and prints them out as a separate list + * (the index used in this list comes from the full "list" command packing list) + * + * @param packingList list containing the items to search through + */ @Override public void execute(PackingList packingList) { if (PackingList.keywordFinder(keyword)) { diff --git a/src/main/java/bagpacker/commands/HelpCommand.java b/src/main/java/bagpacker/commands/HelpCommand.java index 610fb00041..f478eb4998 100644 --- a/src/main/java/bagpacker/commands/HelpCommand.java +++ b/src/main/java/bagpacker/commands/HelpCommand.java @@ -2,8 +2,15 @@ import bagpacker.iohandler.Ui; import bagpacker.packingfunc.PackingList; - +/** + * HelpCommand class is used print a help message to users + */ public class HelpCommand extends Command { + /** + * Calls the Ui class to print helpMessage + * + * @param packingList list containing all items + */ @Override public void execute(PackingList packingList) { Ui.helpMessage(); diff --git a/src/main/java/bagpacker/commands/IncorrectCommand.java b/src/main/java/bagpacker/commands/IncorrectCommand.java index 038cec642a..ef618c0157 100644 --- a/src/main/java/bagpacker/commands/IncorrectCommand.java +++ b/src/main/java/bagpacker/commands/IncorrectCommand.java @@ -2,16 +2,27 @@ import bagpacker.iohandler.Ui; import bagpacker.packingfunc.PackingList; - +/** + * IncorrectCommand class is used to signal an incorrect command being typed into the CLI - it is a form of error + * handling + */ public class IncorrectCommand extends Command { private final String errorType; private final String helpMessage; - + /** + * Constructor for IncorrectCommand + * @param errorType the name of the type of error + * @param helpMessage the message to hint to the user as to how to avoid given error + */ public IncorrectCommand(String errorType, String helpMessage) { this.helpMessage = helpMessage; this.errorType = errorType; } - + /** + * Calls the Ui class to print errorMessage + * + * @param packingList list containing all items + */ @Override public void execute(PackingList packingList) { Ui.errorMessage(errorType, helpMessage); diff --git a/src/main/java/bagpacker/commands/ListCommand.java b/src/main/java/bagpacker/commands/ListCommand.java index 8288ab1591..fefda743f5 100644 --- a/src/main/java/bagpacker/commands/ListCommand.java +++ b/src/main/java/bagpacker/commands/ListCommand.java @@ -2,11 +2,17 @@ import bagpacker.iohandler.Ui; import bagpacker.packingfunc.PackingList; - +/** + * ListCommand class is used to print out all items from the packing list (respective names, packed & total quantities) + */ public class ListCommand extends Command { public static final String HELP_MSG = "list: List all items and their total quantities packed in packing list.\n" + "\tExample: list"; - + /** + * Prints out all items in the packing list + * + * @param packingList list containing all items + */ @Override public void execute(PackingList packingList) { diff --git a/src/main/java/bagpacker/commands/ListUnpackedCommand.java b/src/main/java/bagpacker/commands/ListUnpackedCommand.java index c6e4bae71e..1087bcaaae 100644 --- a/src/main/java/bagpacker/commands/ListUnpackedCommand.java +++ b/src/main/java/bagpacker/commands/ListUnpackedCommand.java @@ -5,12 +5,19 @@ import bagpacker.packingfunc.PackingList; import java.util.ArrayList; - +/** + * ListUnpackedCommand class is used to print out all items from the packing list that have not been fully packed + * (respective names, packed & total quantities) + */ public class ListUnpackedCommand extends Command{ public static final String HELP_MSG = "listunpacked: List all items and their total quantities if they are not fully packed yet.\n" + "\tExample: listunpacked"; - + /** + * Prints all the unpacked items in the packing list + * + * @param packingList list containing all items + */ @Override public void execute(PackingList packingList) { ArrayList unpackedList = getUnpackedList(); @@ -36,7 +43,7 @@ public void execute(PackingList packingList) { } /** - * Returns ArrayList of Item {@link Item} that are not yet packed by using + * Returns ArrayList of {@link Item} that are not yet packed by using * checkFullyPacked: {@link Item#checkFullyPacked()} * @return list of items that are unpacked */ diff --git a/src/main/java/bagpacker/commands/PackAllCommand.java b/src/main/java/bagpacker/commands/PackAllCommand.java index 943f915496..5ae1d60e18 100644 --- a/src/main/java/bagpacker/commands/PackAllCommand.java +++ b/src/main/java/bagpacker/commands/PackAllCommand.java @@ -3,7 +3,10 @@ import bagpacker.iohandler.Ui; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; - +/** + * PackAllCommand class is used to set an item as fully packed by setting the packed quantity of that item to equal the + * total quantity of the item + */ public class PackAllCommand extends Command { public static final String MSG_SUCCESS_PACKALL = "Item packed: %s"; @@ -12,20 +15,27 @@ public class PackAllCommand extends Command { "\tExample: packall /of 3\n" + "\tMeaning: Set the third item in the packing list as fully packed"; - private static int packQuantity; - + /*** + * Constructor for PackAllCommand + * @param targetIndex item index in packing list of the item to set as fully packed + */ public PackAllCommand(int targetIndex) { super(targetIndex); assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : "Packall Command Target index is out of bounds"; } - + /** + * Fully packs a given item in the packing list and prints a successfully PackAll message when + * done + * + * @param packingList list containing all items + */ @Override public void execute(PackingList packingList) { this.packingList = packingList; final Item item = getTargetItem(); - packQuantity = item.getUnpackedQuantity(); + int packQuantity = item.getUnpackedQuantity(); packingList.packItem(item, packQuantity); Ui.printToUser(String.format(MSG_SUCCESS_PACKALL, item)); } diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 831b6d0aa1..49fdce7236 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -3,7 +3,9 @@ import bagpacker.iohandler.Ui; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; - +/** + * PackCommand class is used to pack an item in the packing list by adding to the packed quantity of that item + */ public class PackCommand extends Command { public static final String MSG_SUCCESS_PACK = "Item packed: %s"; @@ -12,14 +14,23 @@ public class PackCommand extends Command { "\tMeaning: Packs 2 more quantities of the third item in the packing list"; private static int packQuantity; - + /*** + * Constructor for PackCommand + * @param quantity amount to add to the current packed quantity of the given item + * @param targetIndex item index in packing list of the item to pack to + */ public PackCommand(int quantity, int targetIndex) { super(targetIndex); packQuantity = quantity; assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : "Pack Command Target index is out of bounds"; } - + /** + * Adds to the total packed quantity of an item in the packing list and prints a successfully packed message when + * done + * + * @param packingList list containing all items + */ @Override public void execute(PackingList packingList) { this.packingList = packingList; diff --git a/src/main/java/bagpacker/commands/UnpackAllCommand.java b/src/main/java/bagpacker/commands/UnpackAllCommand.java index 3637eb2852..111992ad1c 100644 --- a/src/main/java/bagpacker/commands/UnpackAllCommand.java +++ b/src/main/java/bagpacker/commands/UnpackAllCommand.java @@ -3,7 +3,10 @@ import bagpacker.iohandler.Ui; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; - +/** + * UnpackAllCommand class is used to set an item as fully unpacked by setting the packed quantity of that item to equal + * to 0 + */ public class UnpackAllCommand extends Command { public static final String MSG_SUCCESS_UNPACKALL = "Item unpacked: %s"; @@ -11,20 +14,28 @@ public class UnpackAllCommand extends Command { public static final String HELP_MSG = "unpackall: Fully unpacks an item of choice from the packing list.\n" + "\tExample: unpackall /of 3\n" + "\tMeaning: Set the third item in the packing list as totally not packed yet"; - private static int unpackQuantity; + /** + * Constructor for UnpackAllCommand + * @param targetIndex item index in packing list of the item to set as totally unpacked + */ public UnpackAllCommand(int targetIndex) { super(targetIndex); assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : "Unpackall Command Target index is out of bounds"; } - + /** + * Fully unpacks a given item in the packing list and prints a successfully UnpackAll message when + * done + * + * @param packingList list containing all items + */ @Override public void execute(PackingList packingList) { this.packingList = packingList; final Item item = getTargetItem(); - unpackQuantity = item.getPackedQuantity(); + int unpackQuantity = item.getPackedQuantity(); packingList.unpackItem(item, unpackQuantity); Ui.printToUser(String.format(MSG_SUCCESS_UNPACKALL, item)); } diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index 9f221cc9b8..194a52f0ee 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -3,7 +3,9 @@ import bagpacker.iohandler.Ui; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; - +/** + * UnpackCommand class is used to unpack an item in the packing list by reducing from the packed quantity of that item + */ public class UnpackCommand extends Command { public static final String MSG_SUCCESS_UNPACK = "Item unpacked: %s"; @@ -13,14 +15,23 @@ public class UnpackCommand extends Command { "\tExample: unpack 1 /of 2\n" + "\tMeaning: Unpacks 1 quantity of the second item in the packing list"; private static int unpackQuantity; - + /*** + * Constructor for UnpackCommand + * @param quantity amount to reduce from the current packed quantity of the given item + * @param targetIndex item index in packing list of the item to unpack from + */ public UnpackCommand(int quantity, int targetIndex) { super(targetIndex); unpackQuantity = quantity; assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : "Unpack Command Target index is out of bounds"; } - + /** + * Removes from the total packed quantity of an item in the packing list and prints a successfully unpacked + * message when done + * + * @param packingList list containing all items + */ @Override public void execute(PackingList packingList) { this.packingList = packingList; From cacc835de5bd7e2ee937f3e2e1e5ce0e379a518e Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sat, 8 Apr 2023 01:01:28 +0800 Subject: [PATCH 130/207] Add JavaDocs for Parser Class --- .../bagpacker/commands/PackAllCommand.java | 2 +- .../bagpacker/commands/UnpackCommand.java | 2 +- src/main/java/bagpacker/iohandler/Parser.java | 123 +++++++++++------- 3 files changed, 77 insertions(+), 50 deletions(-) diff --git a/src/main/java/bagpacker/commands/PackAllCommand.java b/src/main/java/bagpacker/commands/PackAllCommand.java index 5ae1d60e18..329e3e0ac3 100644 --- a/src/main/java/bagpacker/commands/PackAllCommand.java +++ b/src/main/java/bagpacker/commands/PackAllCommand.java @@ -15,7 +15,7 @@ public class PackAllCommand extends Command { "\tExample: packall /of 3\n" + "\tMeaning: Set the third item in the packing list as fully packed"; - /*** + /** * Constructor for PackAllCommand * @param targetIndex item index in packing list of the item to set as fully packed */ diff --git a/src/main/java/bagpacker/commands/UnpackCommand.java b/src/main/java/bagpacker/commands/UnpackCommand.java index 194a52f0ee..fe23d23f3c 100644 --- a/src/main/java/bagpacker/commands/UnpackCommand.java +++ b/src/main/java/bagpacker/commands/UnpackCommand.java @@ -15,7 +15,7 @@ public class UnpackCommand extends Command { "\tExample: unpack 1 /of 2\n" + "\tMeaning: Unpacks 1 quantity of the second item in the packing list"; private static int unpackQuantity; - /*** + /** * Constructor for UnpackCommand * @param quantity amount to reduce from the current packed quantity of the given item * @param targetIndex item index in packing list of the item to unpack from diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 2893baecc9..3be9aa9374 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -32,7 +32,10 @@ public class Parser { private static ArrayList inputStringArray; private static String fullInput; - + /** + * Sets the fullInput + * @param fullInput the fullInput to set + */ public static void setFullInput(String fullInput) { Parser.fullInput = fullInput; } @@ -43,7 +46,10 @@ public static void setFullInput(String fullInput) { public static ArrayList getInputStringArray() { return inputStringArray; } - + /** + * Sets the inputStringArray + * @param inputStringArray the inputStringArray to set + */ public static void setInputStringArray(String[] inputStringArray) { Parser.inputStringArray = new ArrayList<>(Arrays.asList(inputStringArray)); } @@ -206,7 +212,10 @@ public static String getVariable(String command) throws InvalidVariablesExceptio } return itemVariable; } - + /** + * Gets the keyword required for {@link FindCommand} constructor + * @return keyword to search for in item name + */ private static String getKeyword() throws InvalidVariablesException { String keyword; if (inputStringArray.size() <= 1) { @@ -221,15 +230,6 @@ private static String getKeyword() throws InvalidVariablesException { return keyword; } - /** - * Returns the user item description - */ - public static String getItemDescrip() { - //String[] itemArray = Arrays.copyOfRange(getInputStringArray(),1,getInputStringArray().length); - int indexItemName = getFullInput().indexOf("i/") + 2; - return getFullInput().substring(indexItemName).trim(); - } - /** * Attempts to create AddCommand object to be executed where it is called from @@ -261,7 +261,8 @@ public static Command createAddObj() { /** * Returns the relevant components of an add command from the user input * @return String array of quantity and itemName - * @throws InvalidVariablesException not enough variables + * @throws InvalidVariablesException not enough variables or /of not found + * @throws StringIndexOutOfBoundsException not enough variables */ public static String[] getAddVariables() throws InvalidVariablesException, StringIndexOutOfBoundsException { String[] inputVariables = new String[3]; @@ -300,19 +301,6 @@ public static Command createDeleteObj() { } } - public static int[] getQuantityAndIndex() throws InvalidVariablesException, InvalidIndexException { - int[] itemQuantityAndIndex = new int[2]; - try { - itemQuantityAndIndex[0] = Integer.parseInt(inputStringArray.get(1).trim()); - itemQuantityAndIndex[1] = Integer.parseInt(inputStringArray.get(3).trim()); - } catch (IndexOutOfBoundsException e) { - throw new InvalidVariablesException(); - } catch (NumberFormatException e) { - throw new InvalidIndexException(); - } - return itemQuantityAndIndex; - } - /** * Attempts to create PackCommand object to be executed where it is called from * @@ -396,6 +384,12 @@ public static Command createEditQuantityObj() { } } + /** + * Parses the input variables to be used by {@link EditQuantityCommand} when constructed in createEditQuantityObj + * @return inputVariables in a String[] where the 0th index represents the new quantity and 1st index represents + * the item index in the packing list + * @throws InvalidIndexException invalid number of variables + */ public static String[] getEditQuantityVariables() throws InvalidIndexException { String[] inputStringList = fullInput.trim().split(" ", 2); String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); @@ -406,12 +400,12 @@ public static String[] getEditQuantityVariables() throws InvalidIndexException { } /** - * Attempts to create PackCommand object to be executed where it is called from + * Parses the input variables to be used by {@link PackCommand} when constructed in createPackObj * - * @return PackCommand the command to be executed to Pack an item in the packing list, else an IncorrectCommand is - * created to be executed + * @return inputVariables in a String[] where the 0th index represents the additional quantity to pack and + * 1st index represents the item index in the packing list + * @throws InvalidIndexException invalid item index given */ - public static String[] getPackVariables() throws InvalidIndexException { String[] inputStringList = fullInput.trim().split(" ", 2); String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); @@ -422,6 +416,11 @@ public static String[] getPackVariables() throws InvalidIndexException { return inputVariables; } + /** + * Parses the input variables to be used by {@link PackAllCommand} when constructed in createPackAllObj + * @return itemIndex of the item to set as fully packed + * @throws InvalidIndexException if item index is not valid + */ public static int getPackAllIndex() throws InvalidIndexException { String[] inputStringList = fullInput.trim().split("/", 2); inputStringList = inputStringList[1].split(" ", 2); @@ -434,6 +433,11 @@ public static int getPackAllIndex() throws InvalidIndexException { return itemIndex; } + /** + * Attempts to create a new PackAllCommand object will check if packing list is empty, or if item index is positive + * and within the range of number of items in packing list ELSE an IncorrectCommand is created to be executed + * @return PackAllCommand if valid PackAll user input is parsed in + */ public static Command createPackAllObj() { try { @@ -458,8 +462,8 @@ public static Command createPackAllObj() { /** * Attempts to create UnpackCommand object to be executed where it is called from * - * @return UnpackCommand the command to be executed to unpack an item in the packing list, else an IncorrectCommand - * is created to be executed + * @return UnpackCommand the command to be executed to unpack an item in the packing list, ELSE an IncorrectCommand + * is created to be executed */ public static Command createUnpackObj() { int quantityPacked = 0; @@ -479,7 +483,7 @@ public static Command createUnpackObj() { PackingList.getItemList().size()); } quantityPacked = PackingList.get(itemIndex - 1).getPackedQuantity(); - if (itemQuantity < 1 | itemQuantity > quantityPacked) { + if (itemQuantity > quantityPacked) { throw new InvalidVariablesException(); } @@ -508,9 +512,14 @@ public static Command createUnpackObj() { "Try to input a positive quantity that does not exceed " + quantityPacked); } } - + /** + * Attempts to create UnpackAllCommand object to be executed where it is called from + * + * @return UnpackAllCommand the command to be executed to unpack an item in the packing list, ELSE an + * IncorrectCommand is created to be executed + */ public static Command createUnpackAllObj() { - int quantityPacked = 0; + int quantityPacked; try { int itemIndex = getPackAllIndex(); if (itemIndex > PackingList.getItemList().size()) { @@ -538,20 +547,18 @@ public static Command createUnpackAllObj() { return new IncorrectCommand("Invalid Input Variables", UnpackAllCommand.HELP_MSG); } catch (InvalidVariablesException e) { - if (quantityPacked == 0) { - return new IncorrectCommand("Invalid Unpackall Usage", - "This item is not even packed yet"); - } - return new IncorrectCommand("Invalid Input Quantity", - "Try to input a positive quantity that does not exceed " + quantityPacked); + return new IncorrectCommand("Invalid Unpackall Usage", + "This item is not even packed yet"); } + } /** - * Attempts to create a FindCommand object with the given keyword. + * Attempts to create a FindCommand object with the given keyword, if keyword is black an IncorrectCommand is + * created to be executed * - * @return FindCommand + * @return FindCommand OR IncorrectCommand */ public static Command createFindObj() { try { @@ -561,23 +568,43 @@ public static Command createFindObj() { "Try to input a keyword to be searched in the list"); } } - + /** + * Create a ListCommand object + * + * @return ListCommand + */ public static Command createListObj() { return new ListCommand(); } - + /** + * Create a ListUnpackedCommand object + * + * @return ListUnpackedCommand + */ private static Command createListUnpackedObj() { return new ListUnpackedCommand(); } - + /** + * Create a DeleteListCommand object + * + * @return DeleteListCommand + */ public static Command createDeleteListObj() { return new DeleteListCommand(); } - + /** + * Create a HelpCommand object + * + * @return HelpCommand + */ private static Command createHelpObj() { return new HelpCommand(); } - + /** + * Create a ByeCommand object + * + * @return ByeCommand + */ private static Command createByeObj() { return new ByeCommand(); } From bb05a19c8602c853985487d4dfb536d89c78a1f1 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sat, 8 Apr 2023 14:02:02 +0800 Subject: [PATCH 131/207] Remove getVariable method --- src/main/java/bagpacker/iohandler/Parser.java | 60 ++++++++++++------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 3be9aa9374..029868dbb7 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -32,8 +32,10 @@ public class Parser { private static ArrayList inputStringArray; private static String fullInput; + /** * Sets the fullInput + * * @param fullInput the fullInput to set */ public static void setFullInput(String fullInput) { @@ -46,8 +48,10 @@ public static void setFullInput(String fullInput) { public static ArrayList getInputStringArray() { return inputStringArray; } + /** * Sets the inputStringArray + * * @param inputStringArray the inputStringArray to set */ public static void setInputStringArray(String[] inputStringArray) { @@ -63,7 +67,8 @@ public static String getFullInput() { /** * Takes in user's input and parses it into the relevant commands and arguments to create an object of type Command: - * {@link Command} + * {@link Command} + * * @return command to execute in bagPacker */ public static Command parse() { @@ -169,11 +174,11 @@ public static String getItemName() throws InvalidVariablesException { * @return inputIndex which is the item index of the item in packing list * @throws InvalidIndexException when the item index is not valid */ - public static String getItemIndex() throws InvalidIndexException { + public static String getItemIndex() throws InvalidIndexException, InvalidVariablesException { String inputIndex; int itemIndex; if (inputStringArray.size() != 2) { - throw new InvalidIndexException(); + throw new InvalidVariablesException(); } try { inputIndex = inputStringArray.get(1); @@ -182,7 +187,7 @@ public static String getItemIndex() throws InvalidIndexException { throw new InvalidIndexException(); } } catch (IndexOutOfBoundsException | NumberFormatException e) { - throw new InvalidIndexException(); + throw new InvalidVariablesException(); } return inputIndex; } @@ -212,8 +217,10 @@ public static String getVariable(String command) throws InvalidVariablesExceptio } return itemVariable; } + /** * Gets the keyword required for {@link FindCommand} constructor + * * @return keyword to search for in item name */ private static String getKeyword() throws InvalidVariablesException { @@ -260,8 +267,9 @@ public static Command createAddObj() { /** * Returns the relevant components of an add command from the user input + * * @return String array of quantity and itemName - * @throws InvalidVariablesException not enough variables or /of not found + * @throws InvalidVariablesException not enough variables or /of not found * @throws StringIndexOutOfBoundsException not enough variables */ public static String[] getAddVariables() throws InvalidVariablesException, StringIndexOutOfBoundsException { @@ -283,17 +291,18 @@ public static String[] getAddVariables() throws InvalidVariablesException, Strin * is created to be executed */ public static Command createDeleteObj() { - try { - String itemIndex = getVariable("delete"); - return new DeleteCommand(Integer.parseInt(itemIndex)); - } catch (InvalidVariablesException e) { - return new IncorrectCommand("Invalid Item Name", - "Try to input a name (word(s)) to be added into the list"); - } catch (InvalidIndexException e) { - if (PackingList.getItemList().size() == 0) { + if (PackingList.getItemList().size() == 0) { + return new IncorrectCommand("Invalid Item Index", + "Your packing list is empty, there is nothing to delete"); + } else { + try { + String itemIndex = getItemIndex(); + return new DeleteCommand(Integer.parseInt(itemIndex)); + } catch (InvalidVariablesException e) { return new IncorrectCommand("Invalid Item Index", - "Your packing list is empty, there is nothing to delete"); - } else { + "Try to input an item index (positive integer number that is at most " + + PackingList.getItemList().size() + ")"); + } catch (InvalidIndexException e) { return new IncorrectCommand("Invalid Item Index", "Try to input a positive integer number that is at most " + PackingList.getItemList().size()); @@ -386,8 +395,9 @@ public static Command createEditQuantityObj() { /** * Parses the input variables to be used by {@link EditQuantityCommand} when constructed in createEditQuantityObj - * @return inputVariables in a String[] where the 0th index represents the new quantity and 1st index represents - * the item index in the packing list + * + * @return inputVariables in a String[] where the 0th index represents the new quantity and 1st index represents the + * item index in the packing list * @throws InvalidIndexException invalid number of variables */ public static String[] getEditQuantityVariables() throws InvalidIndexException { @@ -402,8 +412,8 @@ public static String[] getEditQuantityVariables() throws InvalidIndexException { /** * Parses the input variables to be used by {@link PackCommand} when constructed in createPackObj * - * @return inputVariables in a String[] where the 0th index represents the additional quantity to pack and - * 1st index represents the item index in the packing list + * @return inputVariables in a String[] where the 0th index represents the additional quantity to pack and 1st index + * represents the item index in the packing list * @throws InvalidIndexException invalid item index given */ public static String[] getPackVariables() throws InvalidIndexException { @@ -418,6 +428,7 @@ public static String[] getPackVariables() throws InvalidIndexException { /** * Parses the input variables to be used by {@link PackAllCommand} when constructed in createPackAllObj + * * @return itemIndex of the item to set as fully packed * @throws InvalidIndexException if item index is not valid */ @@ -436,6 +447,7 @@ public static int getPackAllIndex() throws InvalidIndexException { /** * Attempts to create a new PackAllCommand object will check if packing list is empty, or if item index is positive * and within the range of number of items in packing list ELSE an IncorrectCommand is created to be executed + * * @return PackAllCommand if valid PackAll user input is parsed in */ public static Command createPackAllObj() { @@ -463,7 +475,7 @@ public static Command createPackAllObj() { * Attempts to create UnpackCommand object to be executed where it is called from * * @return UnpackCommand the command to be executed to unpack an item in the packing list, ELSE an IncorrectCommand - * is created to be executed + * is created to be executed */ public static Command createUnpackObj() { int quantityPacked = 0; @@ -512,11 +524,12 @@ public static Command createUnpackObj() { "Try to input a positive quantity that does not exceed " + quantityPacked); } } + /** * Attempts to create UnpackAllCommand object to be executed where it is called from * * @return UnpackAllCommand the command to be executed to unpack an item in the packing list, ELSE an - * IncorrectCommand is created to be executed + * IncorrectCommand is created to be executed */ public static Command createUnpackAllObj() { int quantityPacked; @@ -568,6 +581,7 @@ public static Command createFindObj() { "Try to input a keyword to be searched in the list"); } } + /** * Create a ListCommand object * @@ -576,6 +590,7 @@ public static Command createFindObj() { public static Command createListObj() { return new ListCommand(); } + /** * Create a ListUnpackedCommand object * @@ -584,6 +599,7 @@ public static Command createListObj() { private static Command createListUnpackedObj() { return new ListUnpackedCommand(); } + /** * Create a DeleteListCommand object * @@ -592,6 +608,7 @@ private static Command createListUnpackedObj() { public static Command createDeleteListObj() { return new DeleteListCommand(); } + /** * Create a HelpCommand object * @@ -600,6 +617,7 @@ public static Command createDeleteListObj() { private static Command createHelpObj() { return new HelpCommand(); } + /** * Create a ByeCommand object * From d0da0693752ce10e67b1bdfb71e831923fb43873 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sat, 8 Apr 2023 14:47:58 +0800 Subject: [PATCH 132/207] Fix unpackall and packall bugs --- src/main/java/bagpacker/iohandler/Parser.java | 93 ++++++++----------- 1 file changed, 38 insertions(+), 55 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 029868dbb7..c7f7d51792 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -257,8 +257,8 @@ public static Command createAddObj() { } return new AddCommand(new Item(itemQuantity, itemName)); } catch (InvalidVariablesException | ArrayIndexOutOfBoundsException | StringIndexOutOfBoundsException e) { - return new IncorrectCommand("Invalid input format", - AddCommand.HELP_MSG); + return new IncorrectCommand("Invalid Add Command Input", + "How to use add command:\n" + AddCommand.HELP_MSG); } catch (NumberFormatException | InvalidIndexException e) { return new IncorrectCommand("Invalid Item Quantity", "For item quantity, try to input a positive integer number between 1 and 1000000"); @@ -340,8 +340,8 @@ public static Command createPackObj() { PackingList.getItemList().size()); } } catch (ArrayIndexOutOfBoundsException e) { - return new IncorrectCommand("Invalid Input Variables", - PackCommand.HELP_MSG); + return new IncorrectCommand("Invalid Pack Command Input", + "How to use pack command:\n" +PackCommand.HELP_MSG); } catch (InvalidVariablesException e) { if (quantityNotPacked == 0) { return new IncorrectCommand("Invalid Pack Usage", @@ -432,16 +432,18 @@ public static String[] getPackVariables() throws InvalidIndexException { * @return itemIndex of the item to set as fully packed * @throws InvalidIndexException if item index is not valid */ - public static int getPackAllIndex() throws InvalidIndexException { - String[] inputStringList = fullInput.trim().split("/", 2); - inputStringList = inputStringList[1].split(" ", 2); - int itemIndex = Integer.parseInt(inputStringList[1]); - - if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) { - throw new InvalidIndexException(); + public static int getPackAllIndex() throws InvalidIndexException, InvalidVariablesException { + //String[] inputStringList = fullInput.trim().split(" ", 2); + String[] inputStringList = fullInput.trim().split("\\s+/of\\s+", 2); + try { + int itemIndex = Integer.parseInt(inputStringList[1]); + if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) { + throw new InvalidIndexException(); + } + return itemIndex; + } catch (NumberFormatException e) { + throw new InvalidVariablesException(); } - - return itemIndex; } /** @@ -451,23 +453,21 @@ public static int getPackAllIndex() throws InvalidIndexException { * @return PackAllCommand if valid PackAll user input is parsed in */ public static Command createPackAllObj() { - - try { - int itemIndex = getPackAllIndex(); - - return new PackAllCommand(itemIndex); - } catch (NumberFormatException | InvalidIndexException e) { - if (PackingList.getItemList().size() == 0) { - return new IncorrectCommand("Invalid Item Index", - "Your packing list is empty, there is nothing to pack"); - } else { + if (PackingList.getItemList().size() == 0) { + return new IncorrectCommand("Invalid Item Index", + "Your packing list is empty, there is nothing to pack"); + } else { + try { + int itemIndex = getPackAllIndex(); + return new PackAllCommand(itemIndex); + } catch (InvalidVariablesException | ArrayIndexOutOfBoundsException e) { + return new IncorrectCommand("Invalid Packall Command Input", + "How to use packall command:\n" + PackAllCommand.HELP_MSG); + } catch (InvalidIndexException e) { return new IncorrectCommand("Invalid Item Index", "Try to input a positive integer number that is at most " + PackingList.getItemList().size()); } - } catch (ArrayIndexOutOfBoundsException e) { - return new IncorrectCommand("Invalid Input Variables", - PackAllCommand.HELP_MSG); } } @@ -486,7 +486,6 @@ public static Command createUnpackObj() { return new IncorrectCommand("Invalid Unpack Quantity", "Your item quantity should " + "be greater than 0"); } - int itemIndex = Integer.parseInt(quantityAndIndex[1]); if (itemIndex > PackingList.getItemList().size()) { @@ -498,7 +497,6 @@ public static Command createUnpackObj() { if (itemQuantity > quantityPacked) { throw new InvalidVariablesException(); } - return new UnpackCommand(itemQuantity, itemIndex); } catch (NumberFormatException e) { return new IncorrectCommand("Invalid Integer detected", @@ -532,38 +530,23 @@ public static Command createUnpackObj() { * IncorrectCommand is created to be executed */ public static Command createUnpackAllObj() { - int quantityPacked; - try { - int itemIndex = getPackAllIndex(); - if (itemIndex > PackingList.getItemList().size()) { - return new IncorrectCommand("Invalid Item Index", - "Try to input a positive integer number that does not exceed " + - PackingList.getItemList().size()); - } - quantityPacked = PackingList.get(itemIndex - 1).getPackedQuantity(); - if (quantityPacked == 0) { - throw new InvalidVariablesException(); - } - - return new UnpackAllCommand(itemIndex); - } catch (NumberFormatException | InvalidIndexException e) { - if (PackingList.getItemList().size() == 0) { - return new IncorrectCommand("Invalid Item Index", - "Your packing list is empty, there is nothing to unpack"); - } else { + if (PackingList.getItemList().size() == 0) { + return new IncorrectCommand("Invalid Item Index", + "Your packing list is empty, there is nothing to pack"); + } else { + try { + int itemIndex = getPackAllIndex(); + return new UnpackAllCommand(itemIndex); + } catch (InvalidVariablesException | ArrayIndexOutOfBoundsException e) { + return new IncorrectCommand("Invalid Unpackall Command Input", + "How to use unpackall command:\n" + UnpackAllCommand.HELP_MSG); + } catch (InvalidIndexException e) { return new IncorrectCommand("Invalid Item Index", - "Try to input a positive item index number that is at most " + + "Try to input a positive integer number that is at most " + PackingList.getItemList().size()); } - } catch (ArrayIndexOutOfBoundsException e) { - return new IncorrectCommand("Invalid Input Variables", - UnpackAllCommand.HELP_MSG); - } catch (InvalidVariablesException e) { - return new IncorrectCommand("Invalid Unpackall Usage", - "This item is not even packed yet"); } - } From 96d4ce597c634f11442df4d41fc165cecf9c683e Mon Sep 17 00:00:00 2001 From: coregano Date: Sat, 8 Apr 2023 15:06:31 +0800 Subject: [PATCH 133/207] feature - Update runtest.bash --- text-ui-test/EXPECTED-UNIX.TXT | 73 ++++++++++++++++++++++++++++++++++ text-ui-test/EXPECTED.TXT | 73 ++++++++++++++++++++++++++++++++++ text-ui-test/input.txt | 13 ++++++ 3 files changed, 159 insertions(+) diff --git a/text-ui-test/EXPECTED-UNIX.TXT b/text-ui-test/EXPECTED-UNIX.TXT index 5d12e64eee..e218c47c9f 100644 --- a/text-ui-test/EXPECTED-UNIX.TXT +++ b/text-ui-test/EXPECTED-UNIX.TXT @@ -15,6 +15,79 @@ ____________________________________________________________ No save files detected. Hello new user! ____________________________________________________________ ____________________________________________________________ +All Commands: +1. add : Adds quantity and name of item to the packing list. + Example: add 3 /of toothbrush + Meaning: add quantity of 3 toothbrushes to the packing list +2. delete : Deletes an item from the packing list. + Example: delete 1 + Meaning: removes the first item in the packing list +3. list : List all items and their total quantities packed in packing list. + Example: list +4. pack : Adds to the current quantity of items packed in the packing list. + Example: pack 2 /of 3 + Meaning: packs 2 more quantities of the third item in the packing list +5. unpack : Deducts from the current quantity of items packed in the packing list. + Example: unpack 1 /of 2 + Meaning: unpacks 1 quantity of the second item in the packing list +6. deletelist : Deletes all items in the packing list. + Example: deletelist +7. packall : Marks all quantity of the specified item as packed in the packing list. + Example: packall /of 3 + Meaning: packs all of the quantities of the third item in the packing list +8. find: Displays all items in the packingList as a list that contains tha keyword used in the command. +Example: find jacket +8. bye : Stops the BagPacker Application + Example: bye +____________________________________________________________ +____________________________________________________________ +New item added: [0/4] jackets +____________________________________________________________ +____________________________________________________________ +New item added: [0/3] cats +____________________________________________________________ +____________________________________________________________ +New item added: [0/1] bag +____________________________________________________________ +____________________________________________________________ +Here are the items in your list +1. [0/4] jackets +2. [0/3] cats +3. [0/1] bag +____________________________________________________________ +____________________________________________________________ +Item total quantity edited: [0/2] bag +____________________________________________________________ +____________________________________________________________ +Item packed: [2/3] cats +____________________________________________________________ +____________________________________________________________ +Item packed: [4/4] jackets +____________________________________________________________ +____________________________________________________________ +Here are the items in your list +1. [4/4] jackets +2. [2/3] cats +3. [0/2] bag +____________________________________________________________ +____________________________________________________________ +Item unpacked: [1/3] cats +____________________________________________________________ +____________________________________________________________ +There are 1 items(s) in your list containing cats: +2. [1/3] cats +____________________________________________________________ +///////////////////////////////////////////////////////////// +Error 'hi' is an invalid User Command: +input 'help' to receive all valid commands +///////////////////////////////////////////////////////////// +____________________________________________________________ +Here are the items in your list +1. [4/4] jackets +2. [1/3] cats +3. [0/2] bag +____________________________________________________________ +____________________________________________________________ Bye thanks for using, ____ _____ _ | _ \ | __ \ | | diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 5d12e64eee..e218c47c9f 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -15,6 +15,79 @@ ____________________________________________________________ No save files detected. Hello new user! ____________________________________________________________ ____________________________________________________________ +All Commands: +1. add : Adds quantity and name of item to the packing list. + Example: add 3 /of toothbrush + Meaning: add quantity of 3 toothbrushes to the packing list +2. delete : Deletes an item from the packing list. + Example: delete 1 + Meaning: removes the first item in the packing list +3. list : List all items and their total quantities packed in packing list. + Example: list +4. pack : Adds to the current quantity of items packed in the packing list. + Example: pack 2 /of 3 + Meaning: packs 2 more quantities of the third item in the packing list +5. unpack : Deducts from the current quantity of items packed in the packing list. + Example: unpack 1 /of 2 + Meaning: unpacks 1 quantity of the second item in the packing list +6. deletelist : Deletes all items in the packing list. + Example: deletelist +7. packall : Marks all quantity of the specified item as packed in the packing list. + Example: packall /of 3 + Meaning: packs all of the quantities of the third item in the packing list +8. find: Displays all items in the packingList as a list that contains tha keyword used in the command. +Example: find jacket +8. bye : Stops the BagPacker Application + Example: bye +____________________________________________________________ +____________________________________________________________ +New item added: [0/4] jackets +____________________________________________________________ +____________________________________________________________ +New item added: [0/3] cats +____________________________________________________________ +____________________________________________________________ +New item added: [0/1] bag +____________________________________________________________ +____________________________________________________________ +Here are the items in your list +1. [0/4] jackets +2. [0/3] cats +3. [0/1] bag +____________________________________________________________ +____________________________________________________________ +Item total quantity edited: [0/2] bag +____________________________________________________________ +____________________________________________________________ +Item packed: [2/3] cats +____________________________________________________________ +____________________________________________________________ +Item packed: [4/4] jackets +____________________________________________________________ +____________________________________________________________ +Here are the items in your list +1. [4/4] jackets +2. [2/3] cats +3. [0/2] bag +____________________________________________________________ +____________________________________________________________ +Item unpacked: [1/3] cats +____________________________________________________________ +____________________________________________________________ +There are 1 items(s) in your list containing cats: +2. [1/3] cats +____________________________________________________________ +///////////////////////////////////////////////////////////// +Error 'hi' is an invalid User Command: +input 'help' to receive all valid commands +///////////////////////////////////////////////////////////// +____________________________________________________________ +Here are the items in your list +1. [4/4] jackets +2. [1/3] cats +3. [0/2] bag +____________________________________________________________ +____________________________________________________________ Bye thanks for using, ____ _____ _ | _ \ | __ \ | | diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index b023018cab..24e14ad2c9 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +1,14 @@ +help +add 4 /of jackets +add 3 /of cats +add 1 /of bag +list +editquantity 2 /of 3 +pack 2 /of 2 +list +pack 4 /of 1 +unpack 1 /of 2 +list +find cats +hi bye From e020059320c0d02f87518319b328bce5a01ea530 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sat, 8 Apr 2023 16:05:06 +0800 Subject: [PATCH 134/207] Add InvalidQuantityException and fix EditQuantity errors --- .../exception/InvalidQuantityException.java | 5 ++ src/main/java/bagpacker/iohandler/Parser.java | 63 ++++++------------- .../bagpacker/iohandlertest/ParserTest.java | 9 --- 3 files changed, 24 insertions(+), 53 deletions(-) create mode 100644 src/main/java/bagpacker/exception/InvalidQuantityException.java diff --git a/src/main/java/bagpacker/exception/InvalidQuantityException.java b/src/main/java/bagpacker/exception/InvalidQuantityException.java new file mode 100644 index 0000000000..5583a0e074 --- /dev/null +++ b/src/main/java/bagpacker/exception/InvalidQuantityException.java @@ -0,0 +1,5 @@ +package bagpacker.exception; + + +public class InvalidQuantityException extends Exception { +} diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index c7f7d51792..be668a208b 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -17,6 +17,7 @@ import bagpacker.commands.UnpackAllCommand; import bagpacker.exception.EmptyInputException; import bagpacker.exception.InvalidIndexException; +import bagpacker.exception.InvalidQuantityException; import bagpacker.exception.InvalidVariablesException; import bagpacker.packingfunc.Item; import bagpacker.packingfunc.PackingList; @@ -192,32 +193,6 @@ public static String getItemIndex() throws InvalidIndexException, InvalidVariabl return inputIndex; } - /** - * Returns a string which represents the relevant variable depending on the command - "add" will return the item - * name - "delete", "pack", "unpack" will return item index - * - * @param command used to determine the type of variable to return - * @return itemVariable which is the index OR name of the item in packing list - * @throws InvalidIndexException when the item index is not valid - */ - public static String getVariable(String command) throws InvalidVariablesException, InvalidIndexException { - String itemVariable; - try { - if (command.equals("add")) { - itemVariable = getItemName(); - } else if (command.equals("find")) { - itemVariable = getKeyword(); - } else { - itemVariable = getItemIndex(); - } - } catch (InvalidVariablesException e) { - throw new InvalidVariablesException(); - } catch (InvalidIndexException e) { - throw new InvalidIndexException(); - } - return itemVariable; - } - /** * Gets the keyword required for {@link FindCommand} constructor * @@ -361,38 +336,38 @@ public static Command createPackObj() { * else an IncorrectCommand objected is created to be executed */ public static Command createEditQuantityObj() { + int index = 1; try { String[] quantityAndIndex = getEditQuantityVariables(); int newTotalQuantity = Integer.parseInt(quantityAndIndex[0]); if (newTotalQuantity < 1 | newTotalQuantity > 1000000) { - throw new InvalidVariablesException(); + throw new InvalidQuantityException(); } - int index = Integer.parseInt(quantityAndIndex[1]); - if (index < 1 || index > PackingList.getItemList().size()) { + index = Integer.parseInt(quantityAndIndex[1]); + if (index < 1 | index > PackingList.getItemList().size()) { throw new InvalidIndexException(); } int packedQuantity = PackingList.get(index - 1).getPackedQuantity(); if (newTotalQuantity < packedQuantity) { - throw new InvalidIndexException(); + throw new InvalidQuantityException(); } return new EditQuantityCommand(newTotalQuantity, index); } catch (NumberFormatException e) { - return new IncorrectCommand("Invalid Integer detected", - "BagPacker only supports the use of positive integers of at most 1000000"); + return new IncorrectCommand("Invalid Editquantity Command Input", + "How to use editquantity command:\n" + EditQuantityCommand.HELP_MSG); } catch (InvalidIndexException e) { - return new IncorrectCommand("Invalid item quantity or index", - "For QUANTITY, try to input a positive integer that is at least the quantity packed.\n" - + "For INDEX, try to input a positive integer that is at most " + return new IncorrectCommand("Invalid Item Index", + "Try to input a positive integer that is at most " + PackingList.getItemList().size()); - } catch (InvalidVariablesException e) { - return new IncorrectCommand("Invalid Quantity detected", - "editquantity only supports the use of positive integers of at most 1000000"); - } catch (ArrayIndexOutOfBoundsException e) { - return new IncorrectCommand("Missing or additional inputs", - "A valid quantity and index are required."); + }catch (InvalidQuantityException e){ + return new IncorrectCommand("Invalid Item Quantity", + "Can only change the quantity to something greater than what is currently packed and " + + "less than 1,000,000"); + } catch (ArrayIndexOutOfBoundsException | InvalidVariablesException e) { + return new IncorrectCommand("Invalid Editquantity Command Input", + "How to use editquantity command:\n" + EditQuantityCommand.HELP_MSG); } } - /** * Parses the input variables to be used by {@link EditQuantityCommand} when constructed in createEditQuantityObj * @@ -400,11 +375,11 @@ public static Command createEditQuantityObj() { * item index in the packing list * @throws InvalidIndexException invalid number of variables */ - public static String[] getEditQuantityVariables() throws InvalidIndexException { + public static String[] getEditQuantityVariables() throws InvalidVariablesException { String[] inputStringList = fullInput.trim().split(" ", 2); String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); if (inputVariables.length != 2) { - throw new InvalidIndexException(); + throw new InvalidVariablesException(); } return inputVariables; } diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index 156eacdc51..25ac8d5a01 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -50,15 +50,6 @@ public void emptyInputTest() { assertEquals(EmptyInputException.class, exception.getClass()); } - @Test - public void addVariableTest() throws InvalidIndexException, InvalidVariablesException { - String userInput = " add this item 1 "; - InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); - System.setIn(inStream); - Parser.parse(); - assertEquals("this item 1", Parser.getVariable(Parser.getCommand())); - } - @Test public void deleteCommandTest() { String userInput1 = " add 3 /of this item "; From 9d86a8f1c403abe73094cfe084ea27e80adaa585 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sat, 8 Apr 2023 16:57:19 +0800 Subject: [PATCH 135/207] Fix bugs for pack unpack --- src/main/java/bagpacker/iohandler/Parser.java | 157 ++++++++---------- 1 file changed, 65 insertions(+), 92 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index be668a208b..b5260d99ae 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -149,25 +149,6 @@ public static String getCommand() { return getInputStringArray().get(0).toLowerCase(); } - /** - * Returns a string which represents the name of the item from the user input - * - * @return inputVariables which is the name of the item - * @throws InvalidVariablesException when the item name cannot be found - */ - public static String getItemName() throws InvalidVariablesException { - String itemName; - if (inputStringArray.size() <= 1) { - throw new InvalidVariablesException(); - } - try { - int itemIndStart = fullInput.indexOf(" ") + 1; - itemName = fullInput.substring(itemIndStart).trim(); - } catch (IndexOutOfBoundsException e) { - throw new InvalidVariablesException(); - } - return itemName; - } /** * Returns a string which represents the index of the item from the user input @@ -292,39 +273,38 @@ public static Command createDeleteObj() { * created to be executed */ public static Command createPackObj() { - int quantityNotPacked = 0; + int quantityNotPacked; + if (PackingList.getItemList().size() == 0) { + return new IncorrectCommand("Empty Packing List", + "Your packing list is empty, there is nothing to pack"); + } try { String[] quantityAndIndex = getPackVariables(); int itemQuantity = Integer.parseInt(quantityAndIndex[0]); int itemIndex = Integer.parseInt(quantityAndIndex[1]); quantityNotPacked = PackingList.get(itemIndex - 1).getUnpackedQuantity(); - if (itemQuantity < 1 | itemQuantity > quantityNotPacked) { - throw new InvalidVariablesException(); + if (quantityNotPacked == 0) { + return new IncorrectCommand("Item Fully Packed", + "You are done packing this item"); + } + if (itemQuantity < 1 | itemQuantity > quantityNotPacked | itemQuantity > 1000000) { + throw new InvalidQuantityException(); + } + if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) { + throw new InvalidIndexException(); } return new PackCommand(itemQuantity, itemIndex); - } catch (NumberFormatException e) { - return new IncorrectCommand("Invalid Integer detected", - "Pack only supports the use of positive integers of at most 1000000"); + } catch (NumberFormatException| ArrayIndexOutOfBoundsException | InvalidVariablesException e) { + return new IncorrectCommand("Invalid Pack Command Input", + "How to use pack command:\n" + PackCommand.HELP_MSG); } catch (InvalidIndexException e) { - if (PackingList.getItemList().size() == 0) { - return new IncorrectCommand("Invalid Item Index", - "Your packing list is empty, there is nothing to pack"); - } else { return new IncorrectCommand("Invalid Item Index", "Try to input a positive integer number that is at most " + - PackingList.getItemList().size()); - } - } catch (ArrayIndexOutOfBoundsException e) { - return new IncorrectCommand("Invalid Pack Command Input", - "How to use pack command:\n" +PackCommand.HELP_MSG); - } catch (InvalidVariablesException e) { - if (quantityNotPacked == 0) { - return new IncorrectCommand("Invalid Pack Usage", - "This item is fully packed"); - } - return new IncorrectCommand("Invalid Pack Quantity", - "Try to input a positive quantity that is at most " - + quantityNotPacked + " to be packed"); + PackingList.getItemList().size() + " (Max integer supported is 1,000,000)"); + }catch (InvalidQuantityException e){ + return new IncorrectCommand("Invalid Item Quantity", + "Can only pack a positive quantity that is less than or equal to the unpacked quantity" + + " (Max integer supported is 1,000,000)"); } } @@ -336,26 +316,27 @@ public static Command createPackObj() { * else an IncorrectCommand objected is created to be executed */ public static Command createEditQuantityObj() { - int index = 1; + if (PackingList.getItemList().size() == 0) { + return new IncorrectCommand("Empty Packing List", + "Your packing list is empty, there is nothing to edit"); + } + int itemIndex; try { String[] quantityAndIndex = getEditQuantityVariables(); int newTotalQuantity = Integer.parseInt(quantityAndIndex[0]); - if (newTotalQuantity < 1 | newTotalQuantity > 1000000) { + itemIndex = Integer.parseInt(quantityAndIndex[1]); + int packedQuantity = PackingList.get(itemIndex - 1).getPackedQuantity(); + if (newTotalQuantity < 1 | newTotalQuantity > 1000000 | newTotalQuantity < packedQuantity) { throw new InvalidQuantityException(); } - index = Integer.parseInt(quantityAndIndex[1]); - if (index < 1 | index > PackingList.getItemList().size()) { + if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) { throw new InvalidIndexException(); } - int packedQuantity = PackingList.get(index - 1).getPackedQuantity(); - if (newTotalQuantity < packedQuantity) { - throw new InvalidQuantityException(); - } - return new EditQuantityCommand(newTotalQuantity, index); - } catch (NumberFormatException e) { + return new EditQuantityCommand(newTotalQuantity, itemIndex); + } catch (NumberFormatException | ArrayIndexOutOfBoundsException | InvalidVariablesException e) { return new IncorrectCommand("Invalid Editquantity Command Input", "How to use editquantity command:\n" + EditQuantityCommand.HELP_MSG); - } catch (InvalidIndexException e) { + } catch (InvalidIndexException | IndexOutOfBoundsException e) { return new IncorrectCommand("Invalid Item Index", "Try to input a positive integer that is at most " + PackingList.getItemList().size()); @@ -363,19 +344,17 @@ public static Command createEditQuantityObj() { return new IncorrectCommand("Invalid Item Quantity", "Can only change the quantity to something greater than what is currently packed and " + "less than 1,000,000"); - } catch (ArrayIndexOutOfBoundsException | InvalidVariablesException e) { - return new IncorrectCommand("Invalid Editquantity Command Input", - "How to use editquantity command:\n" + EditQuantityCommand.HELP_MSG); } } + /** * Parses the input variables to be used by {@link EditQuantityCommand} when constructed in createEditQuantityObj * * @return inputVariables in a String[] where the 0th index represents the new quantity and 1st index represents the * item index in the packing list - * @throws InvalidIndexException invalid number of variables + * @throws InvalidVariablesException invalid number of variables */ - public static String[] getEditQuantityVariables() throws InvalidVariablesException { + public static String[] getEditQuantityVariables() throws InvalidVariablesException, IndexOutOfBoundsException { String[] inputStringList = fullInput.trim().split(" ", 2); String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); if (inputVariables.length != 2) { @@ -390,14 +369,18 @@ public static String[] getEditQuantityVariables() throws InvalidVariablesExcepti * @return inputVariables in a String[] where the 0th index represents the additional quantity to pack and 1st index * represents the item index in the packing list * @throws InvalidIndexException invalid item index given + * @throws InvalidVariablesException invalid number of variables */ - public static String[] getPackVariables() throws InvalidIndexException { + public static String[] getPackVariables() throws InvalidIndexException, InvalidVariablesException { String[] inputStringList = fullInput.trim().split(" ", 2); String[] inputVariables = inputStringList[1].trim().split("\\s+/of\\s+"); if (Integer.parseInt(inputVariables[1]) < 1 | Integer.parseInt(inputVariables[1]) > PackingList.getItemList().size()) { throw new InvalidIndexException(); } + if(inputVariables.length != 2) { + throw new InvalidVariablesException(); + } return inputVariables; } @@ -454,48 +437,38 @@ public static Command createPackAllObj() { */ public static Command createUnpackObj() { int quantityPacked = 0; + if (PackingList.getItemList().size() == 0) { + return new IncorrectCommand("Empty Packing List", + "Your packing list is empty, there is nothing to pack"); + } try { String[] quantityAndIndex = getPackVariables(); int itemQuantity = Integer.parseInt(quantityAndIndex[0]); - if (itemQuantity <= 0) { - return new IncorrectCommand("Invalid Unpack Quantity", "Your item quantity should " + - "be greater than 0"); - } int itemIndex = Integer.parseInt(quantityAndIndex[1]); - - if (itemIndex > PackingList.getItemList().size()) { - return new IncorrectCommand("Invalid Item Index", - "Try to input a positive integer number that does not exceed " + - PackingList.getItemList().size()); - } quantityPacked = PackingList.get(itemIndex - 1).getPackedQuantity(); - if (itemQuantity > quantityPacked) { - throw new InvalidVariablesException(); + if (quantityPacked == 0) { + return new IncorrectCommand("Item Not Packed", + "You have not packed this item at all"); + } + if (itemQuantity < 1 | itemQuantity > quantityPacked | itemQuantity > 1000000) { + throw new InvalidQuantityException(); + } + if (itemIndex > PackingList.getItemList().size() | itemIndex < 1) { + throw new InvalidIndexException(); } return new UnpackCommand(itemQuantity, itemIndex); - } catch (NumberFormatException e) { - return new IncorrectCommand("Invalid Integer detected", - "Unpack only supports the use of positive integers of at most 1000000"); + } catch (NumberFormatException| ArrayIndexOutOfBoundsException | InvalidVariablesException e) { + return new IncorrectCommand("Invalid Unpack Command Input", + "How to use unpack command:\n" + UnpackCommand.HELP_MSG); } catch (InvalidIndexException e) { - if (PackingList.getItemList().size() == 0) { - return new IncorrectCommand("Invalid Item Index", - "Your packing list is empty, there is nothing to unpack"); - } else { - return new IncorrectCommand("Invalid Item Index", - "Try to input a positive item index number that is at most " + - PackingList.getItemList().size()); - } - } catch (ArrayIndexOutOfBoundsException e) { - return new IncorrectCommand("Invalid Input Variables", - UnpackCommand.HELP_MSG); - } catch (InvalidVariablesException e) { - if (quantityPacked == 0) { - return new IncorrectCommand("Invalid Unpack Usage", - "This item is not even packed yet"); + return new IncorrectCommand("Invalid Item Index", + "Try to input a positive integer number that is at most " + + PackingList.getItemList().size() + " (Max integer supported is 1,000,000)"); + } catch (InvalidQuantityException e) { + return new IncorrectCommand("Invalid Item Quantity", + "Can only unpack a positive quantity that is less than or equal to the packed quantity" + + " (Max integer supported is 1,000,000)"); } - return new IncorrectCommand("Invalid Unpack Quantity", - "Try to input a positive quantity that does not exceed " + quantityPacked); - } } /** From dac3ed3d8f990b036c28fda3a66e611710615053 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sat, 8 Apr 2023 16:59:07 +0800 Subject: [PATCH 136/207] Refactor code --- src/main/java/bagpacker/iohandler/Parser.java | 22 +++++++++---------- .../bagpacker/iohandlertest/ParserTest.java | 2 -- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index b5260d99ae..7cd3f73db8 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -294,14 +294,14 @@ public static Command createPackObj() { throw new InvalidIndexException(); } return new PackCommand(itemQuantity, itemIndex); - } catch (NumberFormatException| ArrayIndexOutOfBoundsException | InvalidVariablesException e) { + } catch (NumberFormatException | ArrayIndexOutOfBoundsException | InvalidVariablesException e) { return new IncorrectCommand("Invalid Pack Command Input", "How to use pack command:\n" + PackCommand.HELP_MSG); } catch (InvalidIndexException e) { - return new IncorrectCommand("Invalid Item Index", - "Try to input a positive integer number that is at most " + - PackingList.getItemList().size() + " (Max integer supported is 1,000,000)"); - }catch (InvalidQuantityException e){ + return new IncorrectCommand("Invalid Item Index", + "Try to input a positive integer number that is at most " + + PackingList.getItemList().size() + " (Max integer supported is 1,000,000)"); + } catch (InvalidQuantityException e) { return new IncorrectCommand("Invalid Item Quantity", "Can only pack a positive quantity that is less than or equal to the unpacked quantity" + " (Max integer supported is 1,000,000)"); @@ -340,7 +340,7 @@ public static Command createEditQuantityObj() { return new IncorrectCommand("Invalid Item Index", "Try to input a positive integer that is at most " + PackingList.getItemList().size()); - }catch (InvalidQuantityException e){ + } catch (InvalidQuantityException e) { return new IncorrectCommand("Invalid Item Quantity", "Can only change the quantity to something greater than what is currently packed and " + "less than 1,000,000"); @@ -368,7 +368,7 @@ public static String[] getEditQuantityVariables() throws InvalidVariablesExcepti * * @return inputVariables in a String[] where the 0th index represents the additional quantity to pack and 1st index * represents the item index in the packing list - * @throws InvalidIndexException invalid item index given + * @throws InvalidIndexException invalid item index given * @throws InvalidVariablesException invalid number of variables */ public static String[] getPackVariables() throws InvalidIndexException, InvalidVariablesException { @@ -378,8 +378,8 @@ public static String[] getPackVariables() throws InvalidIndexException, InvalidV > PackingList.getItemList().size()) { throw new InvalidIndexException(); } - if(inputVariables.length != 2) { - throw new InvalidVariablesException(); + if (inputVariables.length != 2) { + throw new InvalidVariablesException(); } return inputVariables; } @@ -457,7 +457,7 @@ public static Command createUnpackObj() { throw new InvalidIndexException(); } return new UnpackCommand(itemQuantity, itemIndex); - } catch (NumberFormatException| ArrayIndexOutOfBoundsException | InvalidVariablesException e) { + } catch (NumberFormatException | ArrayIndexOutOfBoundsException | InvalidVariablesException e) { return new IncorrectCommand("Invalid Unpack Command Input", "How to use unpack command:\n" + UnpackCommand.HELP_MSG); } catch (InvalidIndexException e) { @@ -468,7 +468,7 @@ public static Command createUnpackObj() { return new IncorrectCommand("Invalid Item Quantity", "Can only unpack a positive quantity that is less than or equal to the packed quantity" + " (Max integer supported is 1,000,000)"); - } + } } /** diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index 25ac8d5a01..8f10d2c4a6 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -8,8 +8,6 @@ import bagpacker.commands.PackCommand; import bagpacker.commands.UnpackCommand; import bagpacker.exception.EmptyInputException; -import bagpacker.exception.InvalidIndexException; -import bagpacker.exception.InvalidVariablesException; import bagpacker.iohandler.Parser; import bagpacker.packingfunc.PackingList; import org.junit.jupiter.api.Test; From 5a06658a7df33a61d55f8fa636d8468112c3bed8 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Sat, 8 Apr 2023 17:41:56 +0800 Subject: [PATCH 137/207] Update User Guide with information on find command Add some JUnit Tests in ParserTest --- docs/UserGuide.md | 51 +++++---- src/main/java/bagpacker/iohandler/Parser.java | 19 ++-- src/test/data/properSaveDirectory.txt | 1 + .../bagpacker/iohandlertest/ParserTest.java | 107 +++++++++++++++--- 4 files changed, 130 insertions(+), 48 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 0987492a9d..0c259fbd8e 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -8,12 +8,14 @@ * [Features](#span-stylecolor00a36c-features-span) * [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) * [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) - * [Packing some items](#span-stylecolor6495ed-packing-some-items--span-pack) - * [Packing all quantity of items](#span-stylecolor6495ed-marking-total-quantity-of-item-as-packed--span-packall) - * [Unpacking some items](#span-stylecolor6495ed-unpacking-some-items--span-unpack) + * [Packing an items](#span-stylecolor6495ed-packing-some-items--span-pack) + * [Fully pack an item](#span-stylecolor6495ed-marking-total-quantity-of-item-as-packed--span-packall) + * [Unpacking an item](#span-stylecolor6495ed-unpacking-some-items--span-unpack) * [Editing item quantity](#span-stylecolor6495ed-editing-item-quantity--span-editquantity) * [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) + * [Listing all unpacked items](#span-stylecolor6495ed-listing-all-unpacked-items--span-listunpacked) * [Deleting the entire list](#span-stylecolor6495ed-deleting-the-entire-list--span-deletelist) + * [Finding an item](#span-stylecolor6495ed-finding-an-item--span-find) * [Help message](#span-stylecolor6495ed-help-message--span-help) * [Exiting the application](#span-stylecolor6495ed-exiting-the-application--span-bye) * [Frequently Asked Questions (FAQ)](#span-stylecolor00a36c-frequently-asked-questions--faq--span) @@ -41,13 +43,6 @@ is unpacked and travel with ease of mind. * For macOS users: search for Terminal, and launch it. 5. Execute the following command `java -jar Team_Project.jar` ---- -## Limitations -* BagPacker supports the tracking of integer values up to 1000000: -> * for total number of items in a packing list -> * for total / packed / unpacked quantity of any single item in a packing list -> * any form of list tracking above 1000000 integer size is not supported and may result in undefined outputs - --- ## Features @@ -198,7 +193,7 @@ List Format explanation: ### Listing all unpacked items: `listunpacked` Lists all the items in the packing list that are not fully packed yet. -* Fully packed meaning an item's current quantity packed is the same as the total quantity to be packed +* Fully packed meaning an item's current quantity packed is the same as the total quantity to be packed. * Includes the current packed quantity, the total quantity to be packed, and the name of the item. Format: `listunpacked` @@ -230,6 +225,16 @@ Format: `deletelist` Example of usage: * `deletelist` +### Finding an item: `find` +Searches for item names that contain any part of the input keywords. + +Format: `find KEYWORDS` +* `KEYWORDS` should contain a phrase that can be found in the names of at least one list item. + * A `KEYWORD` that cannot be found in the names of at least one list item will result in an error message. + +Example of usage: +* `find shirt` + ### Help message: `help` Displays a help message containing the command summary. @@ -258,22 +263,22 @@ Examples of usage: **A**: Please check that there are no typos in the command. To check the correct spelling of the commands, please type `help` and hit enter. -[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) +[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | --- ## Command Summary -| Action description | Syntax | Remarks | -|:-----------------------------------------|:----------------------------|:---------------------------------------------------------------------------------------------------------------------------------| -| Add an item | `add QUANTITY /of NAME` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000 | -| Delete an item | `delete INDEX` | `INDEX` must be a valid list index | -| Pack some of an item | `pack QUANTITY /of INDEX` |
  • Adding `QUANTITY` should not cause the quantity to exceed the total quantity
  • `INDEX` must be a valid list index
  • | -| Marking total quantity of item as packed | `packall /of INDEX` | `INDEX` must be a valid list index | -| Unpack some item | `unpack QUANTITY /of INDEX` |
  • Subtracting `QUANTITY` should not cause the quantity to be less than 0
  • `INDEX` must be a valid list index
  • | -| List all items | `list` | Additional parameters will be ignored | -| Delete the whole list | `deletelist` | Additional parameters will be ignored | -| Help message | `help` | Additional parameters will be ignored | -| Exit | `bye` | Additional parameters will be ignored | +| Action description | Syntax | Remarks | +|:-----------------------------------------|:----------------------------|:---------------------------------------------------------------------------------------------------------------------| +| Add an item | `add QUANTITY /of NAME` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000 | +| Delete an item | `delete INDEX` | `INDEX` must be a valid list index | +| Pack some of an item | `pack QUANTITY /of INDEX` | Adding `QUANTITY` should not cause the quantity to exceed the total quantity
    `INDEX` must be a valid list index | +| Marking total quantity of item as packed | `packall /of INDEX` | `INDEX` must be a valid list index | +| Unpack some item | `unpack QUANTITY /of INDEX` | Subtracting `QUANTITY` should not cause the quantity to be less than 0
    `INDEX` must be a valid list index | +| List all items | `list` | Additional parameters will be ignored | +| Delete the whole list | `deletelist` | Additional parameters will be ignored | +| Help message | `help` | Additional parameters will be ignored | +| Exit | `bye` | Additional parameters will be ignored | [⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [⏫ Go to Features](#span-stylecolor00a36c-table-of-contents-span) \ No newline at end of file diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 2893baecc9..dca03f9cb7 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -254,7 +254,7 @@ public static Command createAddObj() { AddCommand.HELP_MSG); } catch (NumberFormatException | InvalidIndexException e) { return new IncorrectCommand("Invalid Item Quantity", - "For item quantity, try to input a positive integer number between 1 and 1000000"); + "For QUANTITY, try to input a positive integer number between 1 and 1,000,000."); } } @@ -357,8 +357,9 @@ public static Command createPackObj() { } /** - * Attempts to create EditQuantityCommand object to be executed where it is called from Will check whether QUANTITY - * and INDEX are positive integers Will check whether changing the total quantity will cause packed + * Attempts to create EditQuantityCommand object to be executed where it is called from + * Will check whether QUANTITY and INDEX are positive integers + * Will check whether changing the total quantity will cause packed * * @return EditQuantityCommand the command to be executed to edit the total quantity of an item in the packing list, * else an IncorrectCommand objected is created to be executed @@ -380,19 +381,19 @@ public static Command createEditQuantityObj() { } return new EditQuantityCommand(newTotalQuantity, index); } catch (NumberFormatException e) { - return new IncorrectCommand("Invalid Integer detected", - "BagPacker only supports the use of positive integers of at most 1000000"); + return new IncorrectCommand("Invalid Character detected", + "Please use positive integers between 0 and 1,000,000."); } catch (InvalidIndexException e) { - return new IncorrectCommand("Invalid item quantity or index", + return new IncorrectCommand("Invalid Item Quantity or Index", "For QUANTITY, try to input a positive integer that is at least the quantity packed.\n" + "For INDEX, try to input a positive integer that is at most " + PackingList.getItemList().size()); } catch (InvalidVariablesException e) { return new IncorrectCommand("Invalid Quantity detected", - "editquantity only supports the use of positive integers of at most 1000000"); + "Please use positive integers between 0 and 1,000,000."); } catch (ArrayIndexOutOfBoundsException e) { - return new IncorrectCommand("Missing or additional inputs", - "A valid quantity and index are required."); + return new IncorrectCommand("Missing or Additional inputs", + "Please input only a valid quantity and index."); } } diff --git a/src/test/data/properSaveDirectory.txt b/src/test/data/properSaveDirectory.txt index e1085a7158..cb7a8ea444 100644 --- a/src/test/data/properSaveDirectory.txt +++ b/src/test/data/properSaveDirectory.txt @@ -1,2 +1,3 @@ +[2/12355] this item [1/2] cats [0/4] dogs diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index 156eacdc51..aab966f9f4 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -1,12 +1,5 @@ package bagpacker.iohandlertest; -import bagpacker.commands.AddCommand; -import bagpacker.commands.ByeCommand; -import bagpacker.commands.DeleteCommand; -import bagpacker.commands.HelpCommand; -import bagpacker.commands.IncorrectCommand; -import bagpacker.commands.ListCommand; -import bagpacker.commands.PackCommand; -import bagpacker.commands.UnpackCommand; +import bagpacker.commands.*; import bagpacker.exception.EmptyInputException; import bagpacker.exception.InvalidIndexException; import bagpacker.exception.InvalidVariablesException; @@ -34,7 +27,7 @@ public void fullInputTest() { } @Test - public void addCommandTest() { + public void createAddObjTest() { String userInput = " add 500 /of this item "; InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); System.setIn(inStream); @@ -60,7 +53,7 @@ public void addVariableTest() throws InvalidIndexException, InvalidVariablesExce } @Test - public void deleteCommandTest() { + public void createDeleteObjTest() { String userInput1 = " add 3 /of this item "; String userInput2 = " delete 1 "; InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); @@ -73,7 +66,7 @@ public void deleteCommandTest() { } @Test - public void packCommandTest() { + public void createPackObjTest() { String userInput1 = " add 3 /of this item "; String userInput2 = " pack 1 /of 1"; InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); @@ -86,7 +79,7 @@ public void packCommandTest() { } @Test - public void unpackCommandTest() { + public void createUnpackObjTest() { String userInput1 = " add 3 /of this item "; String userInput2 = " pack 2 /of 1"; String userInput3 = " Unpack 1 /of 1"; @@ -106,7 +99,49 @@ public void unpackCommandTest() { } @Test - public void listCommandTest() { + public void createPackAllObjTest() { + String userInput1 = " add 1357 /of this item "; + String userInput2 = " packall /of 1 "; + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + PackingList dummyPackingList = new PackingList(); + Parser.parse().execute(dummyPackingList); + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + assertEquals(PackAllCommand.class, Parser.parse().getClass()); + + PackAllCommand packallList = new PackAllCommand(1); + packallList.execute(dummyPackingList); + } + + @Test + public void createUnpackAllObjTest() { + String userInput1 = " add 2468 /of this item "; + String userInput2 = " unpackall /of 1 "; + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + PackingList dummyPackingList = new PackingList(); + Parser.parse().execute(dummyPackingList); + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + assertEquals(UnpackAllCommand.class, Parser.parse().getClass()); + } + + @Test + public void createEditQuantityObjTest() { + String userInput1 = " add 12345 /of this item "; + String userInput2 = " editquantity 67890 /of 1 "; + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + PackingList dummyPackingList = new PackingList(); + Parser.parse().execute(dummyPackingList); + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + assertEquals(EditQuantityCommand.class, Parser.parse().getClass()); + } + + @Test + public void createListObjTest() { String userInput1 = " add 1 /of this item "; String userInput2 = " lIST "; PackingList dummyPackingList = new PackingList(); @@ -122,7 +157,47 @@ public void listCommandTest() { } @Test - public void helpCommandTest() { + public void createListUnpackedObjTest() { + String userInput1 = " add 3 /of this item "; + String userInput2 = " listunpacked "; + PackingList dummyPackingList = new PackingList(); + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + Parser.parse().execute(dummyPackingList); + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + assertEquals(ListUnpackedCommand.class, Parser.parse().getClass()); + } + + @Test + public void createFindObjTest() { + String userInput1 = " add 123 /of this item "; + String userInput2 = " find item "; + PackingList dummyPackingList = new PackingList(); + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + Parser.parse().execute(dummyPackingList); + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + assertEquals(FindCommand.class, Parser.parse().getClass()); + } + + @Test + public void createDeleteListObjTest() { + String userInput1 = " add 123 /of this item "; + String userInput2 = " deletelist "; + PackingList dummyPackingList = new PackingList(); + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + Parser.parse().execute(dummyPackingList); + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + assertEquals(DeleteListCommand.class, Parser.parse().getClass()); + + } + + @Test + public void createHelpObjTest() { String userInput1 = " HelP "; InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); @@ -132,7 +207,7 @@ public void helpCommandTest() { } @Test - public void byeCommandTest() { + public void createByeObjTest() { String userInput1 = " byE "; InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); @@ -142,7 +217,7 @@ public void byeCommandTest() { } @Test - public void invalidCommandTest() { + public void createIncorrectCommandTest() { String userInput1 = " thisIsNOTaVALID command "; InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); From af540bf6926a613400892dd613395a6ad1d1f597 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sat, 8 Apr 2023 18:58:55 +0800 Subject: [PATCH 138/207] Fix most bugs in Parser Class --- src/main/java/bagpacker/iohandler/Parser.java | 39 ++++++++++++------- .../bagpacker/packingfunc/PackingList.java | 20 ++++++++-- 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 7cd3f73db8..276c834783 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -208,16 +208,24 @@ public static Command createAddObj() { if (itemName == null) { throw new InvalidVariablesException(); } - if (itemQuantity < 1) { - throw new InvalidIndexException(); + if (PackingList.itemFinder(itemName)) { + assert (PackingList.getItemByName(itemName) != null); + if (1000000 - PackingList.getItemByName(itemName).getTotalQuantity() < itemQuantity) { + throw new InvalidQuantityException(); + } + } else { + if (itemQuantity < 1 | itemQuantity > 1000000) { + throw new InvalidQuantityException(); + } } return new AddCommand(new Item(itemQuantity, itemName)); - } catch (InvalidVariablesException | ArrayIndexOutOfBoundsException | StringIndexOutOfBoundsException e) { + } catch (NumberFormatException | InvalidVariablesException | ArrayIndexOutOfBoundsException | + StringIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid Add Command Input", - "How to use add command:\n" + AddCommand.HELP_MSG); - } catch (NumberFormatException | InvalidIndexException e) { + "How to use add command:\n" + PackCommand.HELP_MSG); + } catch (InvalidQuantityException e) { return new IncorrectCommand("Invalid Item Quantity", - "For item quantity, try to input a positive integer number between 1 and 1000000"); + "Can only add a positive quantity, where the total quantity of an item is at most 1,000,000"); } } @@ -255,9 +263,8 @@ public static Command createDeleteObj() { String itemIndex = getItemIndex(); return new DeleteCommand(Integer.parseInt(itemIndex)); } catch (InvalidVariablesException e) { - return new IncorrectCommand("Invalid Item Index", - "Try to input an item index (positive integer number that is at most " + - PackingList.getItemList().size() + ")"); + return new IncorrectCommand("Invalid Delete Command Input", + "How to use delete command:\n" + DeleteCommand.HELP_MSG); } catch (InvalidIndexException e) { return new IncorrectCommand("Invalid Item Index", "Try to input a positive integer number that is at most " + @@ -391,15 +398,19 @@ public static String[] getPackVariables() throws InvalidIndexException, InvalidV * @throws InvalidIndexException if item index is not valid */ public static int getPackAllIndex() throws InvalidIndexException, InvalidVariablesException { - //String[] inputStringList = fullInput.trim().split(" ", 2); - String[] inputStringList = fullInput.trim().split("\\s+/of\\s+", 2); try { - int itemIndex = Integer.parseInt(inputStringList[1]); + String inputString = fullInput.substring(fullInput.indexOf("packall") + 7).trim(); + int ofIndex = inputString.trim().indexOf("/of"); + String packAllIndex = inputString.substring(ofIndex + 3).trim(); + int itemIndex = Integer.parseInt(packAllIndex); if (itemIndex < 1 | itemIndex > PackingList.getItemList().size()) { throw new InvalidIndexException(); } + if (ofIndex != 0) { + throw new InvalidVariablesException(); + } return itemIndex; - } catch (NumberFormatException e) { + } catch (NumberFormatException | StringIndexOutOfBoundsException e) { throw new InvalidVariablesException(); } } @@ -436,7 +447,7 @@ public static Command createPackAllObj() { * is created to be executed */ public static Command createUnpackObj() { - int quantityPacked = 0; + int quantityPacked; if (PackingList.getItemList().size() == 0) { return new IncorrectCommand("Empty Packing List", "Your packing list is empty, there is nothing to pack"); diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index dc90aceefb..92ba544ea0 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -8,10 +8,10 @@ public class PackingList { private static ArrayList itemList = new ArrayList<>(); /** - * Checks if item of the same name as itemName is found in the current packing list + * Checks if item of the same name as itemName is found in the current packing list and returns that item * - * @param itemName - * @return true if item of same name as itemName is found else false + * @param itemName name of item to return + * @return the Item of same name as itemName if found, else null */ public static boolean itemFinder(String itemName) { for (Item item : itemList) { @@ -120,7 +120,19 @@ public void unpackItem(Item toPack, int quantity) { public static Item get(int targetIndex) { return itemList.get(targetIndex); } - + /** + * Returns the target item. + * @param itemName position of item in packingList + * @return item + */ + public static Item getItemByName(String itemName) { + for (Item item : PackingList.getItemList()) { + if (itemName.equals(item.getItemName())) { + return item; + } + } + return null; + } /** * Returns size of packing list */ From da33a8502a43698a2891ac4279389974fcb9b3d4 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sat, 8 Apr 2023 23:38:10 +0800 Subject: [PATCH 139/207] Remove disfunctional parser test --- src/test/java/bagpacker/iohandlertest/ParserTest.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index 218aed98ce..0defa97e02 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -41,16 +41,6 @@ public void emptyInputTest() { assertEquals(EmptyInputException.class, exception.getClass()); } - @Test - - public void addVariableTest() throws InvalidIndexException, InvalidVariablesException { - String userInput = " add this item 1 "; - InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); - System.setIn(inStream); - Parser.parse(); - assertEquals("this item 1", Parser.getVariable(Parser.getCommand())); - } - @Test public void createDeleteObjTest() { String userInput1 = " add 3 /of this item "; From 993cc4890f2cd8b60aa5e85b2f80b07dade41a4c Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sat, 8 Apr 2023 23:39:48 +0800 Subject: [PATCH 140/207] Refactor code to pass checkstyle --- .../java/bagpacker/iohandlertest/ParserTest.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index 0defa97e02..ff6cf5bd6e 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -1,5 +1,18 @@ package bagpacker.iohandlertest; -import bagpacker.commands.*; +import bagpacker.commands.AddCommand; +import bagpacker.commands.ByeCommand; +import bagpacker.commands.DeleteCommand; +import bagpacker.commands.DeleteListCommand; +import bagpacker.commands.EditQuantityCommand; +import bagpacker.commands.FindCommand; +import bagpacker.commands.HelpCommand; +import bagpacker.commands.IncorrectCommand; +import bagpacker.commands.ListCommand; +import bagpacker.commands.ListUnpackedCommand; +import bagpacker.commands.PackAllCommand; +import bagpacker.commands.PackCommand; +import bagpacker.commands.UnpackAllCommand; +import bagpacker.commands.UnpackCommand; import bagpacker.exception.EmptyInputException; import bagpacker.iohandler.Parser; import bagpacker.packingfunc.PackingList; From 1f3a1d42ea1370108129b5826fa4fddceef9dd0a Mon Sep 17 00:00:00 2001 From: coregano Date: Sat, 8 Apr 2023 23:40:04 +0800 Subject: [PATCH 141/207] feature - update input.txt for io tests feature - edit developer guide: added special cases for listunpacked, other typo corrections --- docs/DeveloperGuide.md | 45 +++++-- .../bagpacker/iohandlertest/StorageTest.java | 4 +- text-ui-test/EXPECTED-UNIX.TXT | 101 --------------- text-ui-test/EXPECTED.TXT | 119 ++++++++++-------- text-ui-test/input.txt | 7 +- text-ui-test/runtest.bat | 1 + text-ui-test/runtest.sh | 6 +- 7 files changed, 107 insertions(+), 176 deletions(-) delete mode 100644 text-ui-test/EXPECTED-UNIX.TXT diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index b1750a88e7..8690dbc4af 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -32,9 +32,8 @@ This project is based on the AddressBook-Level3 project created by the SE-EDU in - Storage - Ui 4. packingfunc - - Parser - - Storage - - Ui + - Item + - PackingList The class diagram below shows the overall structure of BagPacker application, many methods, variables and associations are omitted for improved clarity @@ -60,7 +59,7 @@ It then updates the ```quantity``` variable according to the quantity inputted b ##### Preventing duplicate items -When using the `add` function, we have decided to implement a method to check whether the item with the same name already exists in the packingList. +When using the `add` function, we have decided to implement a method to check whether an item with the same name already exists in the packingList. This is done through the `itemFinder()` method in class `PackingList()`, which is called during `AddCommand.execute()`. @@ -90,7 +89,7 @@ Mechanism: ```DeleteCommand.execute()``` calls the ```PackingList.deleteItem()`` --- #### Help Command -Help command is used to exit the BagPacker application. +Help command is used to display all the possible commands in the BagPacker application for the user. Execute: ```HelpCommand.execute()``` prints the following help message. @@ -128,8 +127,6 @@ All Commands: 12. bye: Stops the BagPacker Application Example: bye ____________________________________________________________ - - ``` --- @@ -138,7 +135,7 @@ ____________________________________________________________ List command is used to list out all items in the packing list. -Mechanism: ```ListCommand.execute()``` prints the full list of items in `PackingList` to the CLI. +Mechanism: `ListCommand.execute()` prints the full list of items in `packingList` to the CLI. List format: `ITEM_INDEX. [CURRENTLY_PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME` @@ -161,7 +158,7 @@ ____________________________________________________________ `listunpacked` command is used to list out all items in the packing list that are not fully packed. -Mechanism: ```ListUnpackedCommand.execute()``` calls `getUnpackedList()`, which iterates through every item in `PackingList` to check if it is fully packed. +Mechanism: `ListUnpackedCommand.execute()` calls `getUnpackedList()`, which iterates through every item in `packingList` to check if it is fully packed. 'Fully packed' here refers to an item that has its current `packedQuantity` to be less than its `totalQuantity`. In each iteration, `Item.checkFullyPacked()` is called which checks `packedQuantity == totalQuantity` for a particular item and returns its packed status (true if fully packed, else false). Each item that is not fully packed is added to an ArrayList of unpacked items. Finally, `ListUnpackedCommand.execute()` prints the full list of unpacked items in `unpackedlist` to the CLI. @@ -176,15 +173,36 @@ Here are the unpacked items in your list 2. [2/3] shirts 3. [0/2] phones ____________________________________________________________ +``` + +In the case where there are no items in the list, or all items are fully packed, the respective messages are shown on the CLI. + +_**No items:**_ +``` +________________________________________________________________________________________________________________________ +listunpacked +________________________________________________________________________________________________________________________ +There are no items in your list. What would you like to add? +________________________________________________________________________________________________________________________ +``` + +**_All items fully packed:_** +``` +________________________________________________________________________________________________________________________ +listunpacked +________________________________________________________________________________________________________________________ +All items in your list are fully packed! +________________________________________________________________________________________________________________________ + ``` --- #### DeleteList Command -```DeleteListCommand``` is used to delete a whole packing list in the BagPacker application. +`DeleteListCommand` is used to delete all items inside `packingList`. -Mechanism: ```DeleteListCommand.execute()``` reassigns the existing ```packingList``` to a new empty ArrayList of Items, thus deleting the ```packingList```. +Mechanism: `DeleteListCommand.execute()` reassigns the existing `packingList` to a new empty ArrayList of Items, thus deleting any items in `packingList`. --- @@ -222,17 +240,18 @@ BagPacker aims to help busy students simplify their packing process by allowing | v2.1 | user | find an item by name | find the pack status of an item without having to go through the entire list | | v2.1 | user | save my packing list | keep track of my packing list even after leaving the app | | v2.1 | user | see the list of items I have yet to pack | easily track what I am missing | +| v2.1 | user | edit the number of items i need to pack | change my mind whenever I want | + ## Non-Functional Requirements - be able to retrieve the user's packing list quickly and accurately - the quantity of each item to be packed should not be unreasonably large -- the total number of items to be packed should not be unreasonably large ## Glossary -* *glossary item* - Definition +* *CLI* - Command Line Interface ## Instructions for manual testing diff --git a/src/test/java/bagpacker/iohandlertest/StorageTest.java b/src/test/java/bagpacker/iohandlertest/StorageTest.java index 0f7a5b6473..26014febc7 100644 --- a/src/test/java/bagpacker/iohandlertest/StorageTest.java +++ b/src/test/java/bagpacker/iohandlertest/StorageTest.java @@ -19,7 +19,6 @@ */ public class StorageTest { //@@author sunilphua - private static final String properSave = "./src/test/data/properSaveDirectory.txt"; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); private Ui ui; @@ -32,7 +31,6 @@ public void tearDown() { System.setOut(standardOut); } //@@author coregano - @Test public void sampleTest() throws FileNotFoundException { Storage storage = new Storage(properSave); @@ -56,5 +54,7 @@ public void sampleTest() throws FileNotFoundException { & outputStreamCaptor.toString().trim().contains(listLine3)); tearDown(); cleanList.execute(packingList1); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(packingList1); } } diff --git a/text-ui-test/EXPECTED-UNIX.TXT b/text-ui-test/EXPECTED-UNIX.TXT deleted file mode 100644 index e218c47c9f..0000000000 --- a/text-ui-test/EXPECTED-UNIX.TXT +++ /dev/null @@ -1,101 +0,0 @@ -____________________________________________________________ -Hi this is, - ____ _____ _ -| _ \ | __ \ | | -| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ -| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| -| |_) | (_| | (_| | | | (_| | (__| < __/ | -|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| - __/ | - |___/ - -Enter "help" to find out how to use BagPacker -____________________________________________________________ -____________________________________________________________ -No save files detected. Hello new user! -____________________________________________________________ -____________________________________________________________ -All Commands: -1. add : Adds quantity and name of item to the packing list. - Example: add 3 /of toothbrush - Meaning: add quantity of 3 toothbrushes to the packing list -2. delete : Deletes an item from the packing list. - Example: delete 1 - Meaning: removes the first item in the packing list -3. list : List all items and their total quantities packed in packing list. - Example: list -4. pack : Adds to the current quantity of items packed in the packing list. - Example: pack 2 /of 3 - Meaning: packs 2 more quantities of the third item in the packing list -5. unpack : Deducts from the current quantity of items packed in the packing list. - Example: unpack 1 /of 2 - Meaning: unpacks 1 quantity of the second item in the packing list -6. deletelist : Deletes all items in the packing list. - Example: deletelist -7. packall : Marks all quantity of the specified item as packed in the packing list. - Example: packall /of 3 - Meaning: packs all of the quantities of the third item in the packing list -8. find: Displays all items in the packingList as a list that contains tha keyword used in the command. -Example: find jacket -8. bye : Stops the BagPacker Application - Example: bye -____________________________________________________________ -____________________________________________________________ -New item added: [0/4] jackets -____________________________________________________________ -____________________________________________________________ -New item added: [0/3] cats -____________________________________________________________ -____________________________________________________________ -New item added: [0/1] bag -____________________________________________________________ -____________________________________________________________ -Here are the items in your list -1. [0/4] jackets -2. [0/3] cats -3. [0/1] bag -____________________________________________________________ -____________________________________________________________ -Item total quantity edited: [0/2] bag -____________________________________________________________ -____________________________________________________________ -Item packed: [2/3] cats -____________________________________________________________ -____________________________________________________________ -Item packed: [4/4] jackets -____________________________________________________________ -____________________________________________________________ -Here are the items in your list -1. [4/4] jackets -2. [2/3] cats -3. [0/2] bag -____________________________________________________________ -____________________________________________________________ -Item unpacked: [1/3] cats -____________________________________________________________ -____________________________________________________________ -There are 1 items(s) in your list containing cats: -2. [1/3] cats -____________________________________________________________ -///////////////////////////////////////////////////////////// -Error 'hi' is an invalid User Command: -input 'help' to receive all valid commands -///////////////////////////////////////////////////////////// -____________________________________________________________ -Here are the items in your list -1. [4/4] jackets -2. [1/3] cats -3. [0/2] bag -____________________________________________________________ -____________________________________________________________ -Bye thanks for using, - ____ _____ _ -| _ \ | __ \ | | -| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ -| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| -| |_) | (_| | (_| | | | (_| | (__| < __/ | -|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| - __/ | - |___/ - -____________________________________________________________ diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index e218c47c9f..f281b8eb91 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,4 +1,4 @@ -____________________________________________________________ +________________________________________________________________________________________________________________________ Hi this is, ____ _____ _ | _ \ | __ \ | | @@ -10,84 +10,93 @@ Hi this is, |___/ Enter "help" to find out how to use BagPacker -____________________________________________________________ -____________________________________________________________ +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ No save files detected. Hello new user! -____________________________________________________________ -____________________________________________________________ +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ All Commands: -1. add : Adds quantity and name of item to the packing list. +1. add: Adds quantity and name of item to the packing list. Example: add 3 /of toothbrush - Meaning: add quantity of 3 toothbrushes to the packing list -2. delete : Deletes an item from the packing list. + Meaning: Add quantity of 3 toothbrushes to the packing list +2. delete: Deletes an item from the packing list. Example: delete 1 - Meaning: removes the first item in the packing list -3. list : List all items and their total quantities packed in packing list. + Meaning: Removes the first item in the packing list +3. list: List all items and their total quantities packed in packing list. Example: list -4. pack : Adds to the current quantity of items packed in the packing list. +4. pack: Adds to the current quantity of items packed in the packing list. Example: pack 2 /of 3 - Meaning: packs 2 more quantities of the third item in the packing list -5. unpack : Deducts from the current quantity of items packed in the packing list. + Meaning: Packs 2 more quantities of the third item in the packing list +5. unpack: Deducts from the current quantity of items packed in the packing list. Example: unpack 1 /of 2 - Meaning: unpacks 1 quantity of the second item in the packing list -6. deletelist : Deletes all items in the packing list. + Meaning: Unpacks 1 quantity of the second item in the packing list +6. deletelist: Deletes all items in the packing list. Example: deletelist -7. packall : Marks all quantity of the specified item as packed in the packing list. +7. listunpacked: List all items and their total quantities if they are not fully packed yet. + Example: listunpacked +8. editquantity: Edit the total quantity of an item to be packed. + Example: editquantity 3 /of 2 + Meaning: Change the total quantity of the second item to 3 +9. packall: Fully pack an item of choice from the packing list. Example: packall /of 3 - Meaning: packs all of the quantities of the third item in the packing list -8. find: Displays all items in the packingList as a list that contains tha keyword used in the command. -Example: find jacket -8. bye : Stops the BagPacker Application + Meaning: Set the third item in the packing list as fully packed +10. unpackall: Fully unpacks an item of choice from the packing list. + Example: unpackall /of 3 + Meaning: Set the third item in the packing list as totally not packed yet +11. find: Displays all items in the packingList as a list that contains the keyword used in the command. + Example: find jacket +12. bye: Stops the BagPacker Application Example: bye -____________________________________________________________ -____________________________________________________________ +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ New item added: [0/4] jackets -____________________________________________________________ -____________________________________________________________ +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ New item added: [0/3] cats -____________________________________________________________ -____________________________________________________________ +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ New item added: [0/1] bag -____________________________________________________________ -____________________________________________________________ +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ Here are the items in your list 1. [0/4] jackets 2. [0/3] cats 3. [0/1] bag -____________________________________________________________ -____________________________________________________________ +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ Item total quantity edited: [0/2] bag -____________________________________________________________ -____________________________________________________________ +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ Item packed: [2/3] cats -____________________________________________________________ -____________________________________________________________ +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ Item packed: [4/4] jackets -____________________________________________________________ -____________________________________________________________ -Here are the items in your list -1. [4/4] jackets -2. [2/3] cats -3. [0/2] bag -____________________________________________________________ -____________________________________________________________ +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ +Here are the unpacked items in your list +1. [2/3] cats +2. [0/2] bag +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ Item unpacked: [1/3] cats -____________________________________________________________ -____________________________________________________________ +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ There are 1 items(s) in your list containing cats: 2. [1/3] cats -____________________________________________________________ -///////////////////////////////////////////////////////////// -Error 'hi' is an invalid User Command: -input 'help' to receive all valid commands -///////////////////////////////////////////////////////////// -____________________________________________________________ +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ +Item packed: [3/3] cats +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ +Item unpacked: [0/4] jackets +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ Here are the items in your list -1. [4/4] jackets -2. [1/3] cats +1. [0/4] jackets +2. [3/3] cats 3. [0/2] bag -____________________________________________________________ -____________________________________________________________ +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ Bye thanks for using, ____ _____ _ | _ \ | __ \ | | @@ -98,4 +107,4 @@ Bye thanks for using, __/ | |___/ -____________________________________________________________ +________________________________________________________________________________________________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 24e14ad2c9..771b3ca56b 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -5,10 +5,11 @@ add 1 /of bag list editquantity 2 /of 3 pack 2 /of 2 -list pack 4 /of 1 +listunpacked unpack 1 /of 2 -list find cats -hi +packall /of 2 +unpackall /of 1 +list bye diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 25ac7a2989..cde3f4c527 100644 --- a/text-ui-test/runtest.bat +++ b/text-ui-test/runtest.bat @@ -17,3 +17,4 @@ java -jar %jarloc% < ..\..\text-ui-test\input.txt > ..\..\text-ui-test\ACTUAL.TX cd ..\..\text-ui-test FC ACTUAL.TXT EXPECTED.TXT >NUL && ECHO Test passed! || Echo Test failed! +pause diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index 276ec340be..8e18a39300 100755 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -10,7 +10,9 @@ cd text-ui-test java -jar $(find ../build/libs/ -mindepth 1 -print -quit) < input.txt > ACTUAL.TXT -diff EXPECTED-UNIX.TXT ACTUAL.TXT +rm data.txt + +diff <(tr -d '\r' Date: Sun, 9 Apr 2023 00:40:25 +0800 Subject: [PATCH 142/207] fix - trial io test --- src/main/java/bagpacker/commands/ByeCommand.java | 2 +- text-ui-test/input.txt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/bagpacker/commands/ByeCommand.java b/src/main/java/bagpacker/commands/ByeCommand.java index 38bf6e107a..43f05415a5 100644 --- a/src/main/java/bagpacker/commands/ByeCommand.java +++ b/src/main/java/bagpacker/commands/ByeCommand.java @@ -10,7 +10,7 @@ public class ByeCommand extends Command { public static final String HELP_MSG = "bye: Stops the BagPacker Application\n" + "\tExample: bye"; /** - * Stops the BagPacker app from running by setting the isBagPackerRunning boolean to false + * Stops the BagPacker app from running when the isBagPackerRunning boolean to false * * @param packingList list of all items in packing list */ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 771b3ca56b..3df0133537 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,5 +1,7 @@ help + add 4 /of jackets + add 3 /of cats add 1 /of bag list From c03c1ad6048348bb26d189493b4d84d372ae29f5 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sun, 9 Apr 2023 00:42:31 +0800 Subject: [PATCH 143/207] Update J-Unit test to increase coverage --- src/test/data/properSaveDirectory.txt | 1 - .../commands/ListUnpackedCommandTest.java | 45 ++++++ .../bagpacker/commands/UnpackCommandTest.java | 1 + .../bagpacker/iohandlertest/ParserTest.java | 141 ++++++++++++++++-- 4 files changed, 178 insertions(+), 10 deletions(-) create mode 100644 src/test/java/bagpacker/commands/ListUnpackedCommandTest.java diff --git a/src/test/data/properSaveDirectory.txt b/src/test/data/properSaveDirectory.txt index cb7a8ea444..e1085a7158 100644 --- a/src/test/data/properSaveDirectory.txt +++ b/src/test/data/properSaveDirectory.txt @@ -1,3 +1,2 @@ -[2/12355] this item [1/2] cats [0/4] dogs diff --git a/src/test/java/bagpacker/commands/ListUnpackedCommandTest.java b/src/test/java/bagpacker/commands/ListUnpackedCommandTest.java new file mode 100644 index 0000000000..19b24eb138 --- /dev/null +++ b/src/test/java/bagpacker/commands/ListUnpackedCommandTest.java @@ -0,0 +1,45 @@ +package bagpacker.commands; + +import bagpacker.packingfunc.Item; +import bagpacker.packingfunc.PackingList; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + + +/** + * IncorrectCommandTest to test HelpCommand class + */ +public class ListUnpackedCommandTest { + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + public void tearDown() { + System.setOut(standardOut); + } + @Test + public void testListUnpackedCommand() { + PackingList dummyPackingList = new PackingList(); + Item item = new Item(1, "toothbrush"); + Command addCommand = new AddCommand(item); + addCommand.execute(dummyPackingList); + addCommand = new AddCommand(new Item(8, "dollars")); + addCommand.execute(dummyPackingList); + PackCommand packCommand = new PackCommand(1, 1); + packCommand.execute(dummyPackingList); + setUp(); + ListUnpackedCommand listunpackedCmd = new ListUnpackedCommand(); + listunpackedCmd.execute(dummyPackingList); + String listCmdMessage1 = "Here are the unpacked items in your list"; + String listCmdMessage2 = "[0/8] dollars"; + assert(outputStreamCaptor.toString().trim().contains(listCmdMessage1) + & outputStreamCaptor.toString().trim().contains(listCmdMessage2)); + tearDown(); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } +} diff --git a/src/test/java/bagpacker/commands/UnpackCommandTest.java b/src/test/java/bagpacker/commands/UnpackCommandTest.java index 40c1c7a71a..2c13f0fd42 100644 --- a/src/test/java/bagpacker/commands/UnpackCommandTest.java +++ b/src/test/java/bagpacker/commands/UnpackCommandTest.java @@ -15,6 +15,7 @@ public void testUnpackCommand() { PackingList dummyPackingList = new PackingList(); Item firstItem = new Item(30, "pairs of socks"); dummyPackingList.addItem(firstItem); + firstItem = PackingList.get(0); PackCommand packCmd = new PackCommand(20, 1); packCmd.execute(dummyPackingList); int initialPackedQty = firstItem.getPackedQuantity(); diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index ff6cf5bd6e..2f1a95bc88 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -19,7 +19,9 @@ import org.junit.jupiter.api.Test; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.InputStream; +import java.io.PrintStream; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -28,6 +30,15 @@ * ParserTest to test Parser Class */ public class ParserTest { + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + public void tearDown() { + System.setOut(standardOut); + } @Test public void fullInputTest() { String userInput = " add this item "; @@ -38,20 +49,51 @@ public void fullInputTest() { } @Test - public void createAddObjTest() { + public void createAddObjTest_Successful() { + PackingList dummyPackingList = new PackingList(); String userInput = " add 500 /of this item "; InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); System.setIn(inStream); assertEquals(AddCommand.class, Parser.parse().getClass()); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); } + @Test + public void createAddObjTest_NoItemName() { + PackingList dummyPackingList = new PackingList(); + String userInput = " add 500 /of "; + InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inStream); + assertEquals(IncorrectCommand.class,Parser.parse().getClass()); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } + @Test + public void createAddObjTest_RepeatItem() { + PackingList dummyPackingList = new PackingList(); + String userInput = " add 500 /of something "; + InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inStream); + Parser.parse().execute(dummyPackingList); + InputStream inStream2 = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inStream2); + Parser.parse().execute(dummyPackingList); + assertEquals(1000, PackingList.get(0).getTotalQuantity()); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } @Test public void emptyInputTest() { String userInput = " "; InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); System.setIn(inStream); - Exception exception = assertThrows(EmptyInputException.class, Parser::readLine); - assertEquals(EmptyInputException.class, exception.getClass()); + setUp(); + PackingList dummyPackingList = new PackingList(); + Parser.parse().execute(dummyPackingList); + assert(outputStreamCaptor.toString().trim().contains("Empty input received") + & outputStreamCaptor.toString().trim().contains("try to input a command, to view all commands input 'help'")); + tearDown(); } @Test @@ -65,6 +107,8 @@ public void createDeleteObjTest() { inStream = new ByteArrayInputStream(userInput2.getBytes()); System.setIn(inStream); assertEquals(DeleteCommand.class, Parser.parse().getClass()); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); } @Test @@ -78,10 +122,12 @@ public void createPackObjTest() { inStream = new ByteArrayInputStream(userInput2.getBytes()); System.setIn(inStream); assertEquals(PackCommand.class, Parser.parse().getClass()); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); } @Test - public void createUnpackObjTest() { + public void createUnpackObjTest_Successful() { String userInput1 = " add 3 /of this item "; String userInput2 = " pack 2 /of 1"; String userInput3 = " Unpack 1 /of 1"; @@ -98,6 +144,35 @@ public void createUnpackObjTest() { inStream = new ByteArrayInputStream(userInput3.getBytes()); System.setIn(inStream); assertEquals(UnpackCommand.class, Parser.parse().getClass()); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } + + @Test + public void createUnpackObjTest_InvalidItemQuantity() { + String userInput1 = " add 3 /of this item "; + String userInput2 = " pack 2 /of 1"; + String userInput3 = " Unpack 10 /of 1"; + PackingList dummyPackingList = new PackingList(); + + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + Parser.parse().execute(dummyPackingList); + + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + Parser.parse().execute(dummyPackingList); + + inStream = new ByteArrayInputStream(userInput3.getBytes()); + System.setIn(inStream); + setUp(); + Parser.parse().execute(dummyPackingList); + assert(outputStreamCaptor.toString().trim().contains("Invalid Item Quantity") + & outputStreamCaptor.toString().trim().contains("Can only unpack a positive quantity that is less " + + "than or")); + tearDown(); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); } @Test @@ -114,10 +189,12 @@ public void createPackAllObjTest() { PackAllCommand packallList = new PackAllCommand(1); packallList.execute(dummyPackingList); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); } @Test - public void createUnpackAllObjTest() { + public void createUnpackAllObjTest_Successful() { String userInput1 = " add 2468 /of this item "; String userInput2 = " unpackall /of 1 "; InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); @@ -127,8 +204,28 @@ public void createUnpackAllObjTest() { inStream = new ByteArrayInputStream(userInput2.getBytes()); System.setIn(inStream); assertEquals(UnpackAllCommand.class, Parser.parse().getClass()); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } + @Test + public void createUnpackAllObjTest_InvalidIndex() { + String userInput1 = " add 2468 /of this item "; + String userInput2 = " unpackall /of 1000 "; + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + PackingList dummyPackingList = new PackingList(); + Parser.parse().execute(dummyPackingList); + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + setUp(); + Parser.parse().execute(dummyPackingList); + assert(outputStreamCaptor.toString().trim().contains("Invalid Item Index") + & outputStreamCaptor.toString().trim().contains("Try to input a positive integer number " + + "that is at most")); + tearDown(); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); } - @Test public void createEditQuantityObjTest() { String userInput1 = " add 12345 /of this item "; @@ -140,6 +237,8 @@ public void createEditQuantityObjTest() { inStream = new ByteArrayInputStream(userInput2.getBytes()); System.setIn(inStream); assertEquals(EditQuantityCommand.class, Parser.parse().getClass()); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); } @Test @@ -156,6 +255,8 @@ public void createListObjTest() { System.setIn(inStream); assertEquals(ListCommand.class, Parser.parse().getClass()); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); } @Test @@ -169,10 +270,12 @@ public void createListUnpackedObjTest() { inStream = new ByteArrayInputStream(userInput2.getBytes()); System.setIn(inStream); assertEquals(ListUnpackedCommand.class, Parser.parse().getClass()); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); } @Test - public void createFindObjTest() { + public void createFindObjTest_Successful() { String userInput1 = " add 123 /of this item "; String userInput2 = " find item "; PackingList dummyPackingList = new PackingList(); @@ -182,8 +285,27 @@ public void createFindObjTest() { inStream = new ByteArrayInputStream(userInput2.getBytes()); System.setIn(inStream); assertEquals(FindCommand.class, Parser.parse().getClass()); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); + } + @Test + public void createFindObjTest_EmptyKeyword() { + String userInput1 = " add 123 /of this item "; + String userInput2 = " find "; + PackingList dummyPackingList = new PackingList(); + InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); + System.setIn(inStream); + Parser.parse().execute(dummyPackingList); + inStream = new ByteArrayInputStream(userInput2.getBytes()); + System.setIn(inStream); + setUp(); + Parser.parse().execute(dummyPackingList); + assert(outputStreamCaptor.toString().trim().contains("Blank keyword") + & outputStreamCaptor.toString().trim().contains("Try to input a keyword to be searched in the list")); + tearDown(); + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); } - @Test public void createDeleteListObjTest() { String userInput1 = " add 123 /of this item "; @@ -195,7 +317,8 @@ public void createDeleteListObjTest() { inStream = new ByteArrayInputStream(userInput2.getBytes()); System.setIn(inStream); assertEquals(DeleteListCommand.class, Parser.parse().getClass()); - + DeleteListCommand delList = new DeleteListCommand(); + delList.execute(dummyPackingList); } @Test From 16dea0fe0466612ac5452fd63112f77156617a3b Mon Sep 17 00:00:00 2001 From: coregano Date: Sun, 9 Apr 2023 02:10:29 +0800 Subject: [PATCH 144/207] docs - add packcommand in developer docs --- docs/DeveloperGuide.md | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8690dbc4af..2a681f20db 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -195,10 +195,38 @@ All items in your list are fully packed! ________________________________________________________________________________________________________________________ ``` - --- +#### Pack Command +`PackCommand` is used to increase the quantity packed of a certain item in the `packingList`. +Mechanism: PackCommand.execute() calls packingList.packItem() with a certain `item` and `itemQuantity`, which then calls the `.setPacked()` method. This method will increase the `packedQuantity` of that specific item by `itemQuantity`. +Example: +``` +________________________________________________________________________________________________________________________ +add 3 /of jackets +________________________________________________________________________________________________________________________ +New item added: [0/3] jackets +________________________________________________________________________________________________________________________ +pack 2 /of 1 +________________________________________________________________________________________________________________________ +Item packed: [2/3] jackets +________________________________________________________________________________________________________________________ +``` +In the case where the user tries to pack an item over its limit, i.e. have an item's `packedQuantity` > `totalQuantity`, there are checks put in place to prevent the command from going through. +During `createPackObj`, `quantityNotPacked` is compared to `itemQuantity`. If `quantityNotPacked` < `itemQuantity`, an `IncorrectCommand` will be returned that prints an error message to the user about the invalid command. + +Example: +``` +________________________________________________________________________________________________________________________ +pack 5 /of 1 +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Error Invalid Item Quantity: +Can only pack a positive quantity that is less than or equal to the unpacked quantity (Max integer supported is 1,000,000) +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +``` + +--- #### DeleteList Command `DeleteListCommand` is used to delete all items inside `packingList`. @@ -241,7 +269,7 @@ BagPacker aims to help busy students simplify their packing process by allowing | v2.1 | user | save my packing list | keep track of my packing list even after leaving the app | | v2.1 | user | see the list of items I have yet to pack | easily track what I am missing | | v2.1 | user | edit the number of items i need to pack | change my mind whenever I want | - +| v2.1 | user | fully pack or unpack an item | don't have to refer to how many of that item I need | ## Non-Functional Requirements From 4a6d141a1e2fa043f3833c7bdbfa1e4ca764620a Mon Sep 17 00:00:00 2001 From: Sophie Date: Sun, 9 Apr 2023 15:20:11 +0800 Subject: [PATCH 145/207] Update PPP --- docs/UserGuide.md | 26 ++++++++++++++------------ docs/team/tangphi.md | 28 +++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a77698e1f1..b13ae848bd 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -9,8 +9,9 @@ * [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) * [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) * [Packing an item](#span-stylecolor6495ed-packing-some-items--span-pack) - * [Fully pack an item](#span-stylecolor6495ed-marking-total-quantity-of-item-as-packed--span-packall) + * [Packing all quantity of items](#span-stylecolor6495ed-fully-pack-an-item--span-packall) * [Unpacking an item](#span-stylecolor6495ed-unpacking-some-items--span-unpack) + * [Unpacking all quantity of items](#span-stylecolor6495ed-fully-unpack-an-item--span-unpackall) * [Editing item quantity](#span-stylecolor6495ed-editing-item-quantity--span-editquantity) * [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) * [Listing all unpacked items](#span-stylecolor6495ed-listing-all-unpacked-items--span-listunpacked) @@ -290,16 +291,17 @@ Examples of usage: ## Command Summary -| Action description | Syntax | Remarks | -|:-----------------------------------------|:----------------------------|:---------------------------------------------------------------------------------------------------------------------| -| Add an item | `add QUANTITY /of NAME` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000 | -| Delete an item | `delete INDEX` | `INDEX` must be a valid list index | -| Pack some of an item | `pack QUANTITY /of INDEX` | Adding `QUANTITY` should not cause the quantity to exceed the total quantity
    `INDEX` must be a valid list index | -| Marking total quantity of item as packed | `packall /of INDEX` | `INDEX` must be a valid list index | -| Unpack some item | `unpack QUANTITY /of INDEX` | Subtracting `QUANTITY` should not cause the quantity to be less than 0
    `INDEX` must be a valid list index | -| List all items | `list` | Additional parameters will be ignored | -| Delete the whole list | `deletelist` | Additional parameters will be ignored | -| Help message | `help` | Additional parameters will be ignored | -| Exit | `bye` | Additional parameters will be ignored | +| Action description | Syntax | Remarks | +|:-------------------------------------------|:----------------------------|:---------------------------------------------------------------------------------------------------------------------| +| Add an item | `add QUANTITY /of NAME` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000 | +| Delete an item | `delete INDEX` | `INDEX` must be a valid list index | +| Pack some of an item | `pack QUANTITY /of INDEX` | Adding `QUANTITY` should not cause the quantity to exceed the total quantity
    `INDEX` must be a valid list index | +| Marking total quantity of item as packed | `packall /of INDEX` | `INDEX` must be a valid list index | +| Unpack some item | `unpack QUANTITY /of INDEX` | Subtracting `QUANTITY` should not cause the quantity to be less than 0
    `INDEX` must be a valid list index | +| Marking total quantity of item as unpacked | `unpackall /of INDEX` | `INDEX` must be a valid list index | +| List all items | `list` | Additional parameters will be ignored | +| Delete the whole list | `deletelist` | Additional parameters will be ignored | +| Help message | `help` | Additional parameters will be ignored | +| Exit | `bye` | Additional parameters will be ignored | [⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [⏫ Go to Features](#span-stylecolor00a36c-table-of-contents-span) \ No newline at end of file diff --git a/docs/team/tangphi.md b/docs/team/tangphi.md index ae266f6ff7..c1bd3eb305 100644 --- a/docs/team/tangphi.md +++ b/docs/team/tangphi.md @@ -20,28 +20,46 @@ V1.0: [PR](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/22) 4. Create initial unpack command feature [#6](https://github.com/AY2223S2-CS2113-T14-2/tp/issues/6) V2.1 -5. Create packall command feature -6. Create unpackall command feature +5. Create packall command feature [#132](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/132) +6. Create unpackall command feature [#153](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/153) --- ##### Enhancements implemented +- Wrote JUnit test for the add command +- Wrote JUnit test for the packall command +- Wrote JUnit test for the unpackall command ##### Contributions to the [UG](../UserGuide.md) +- Contributed to the Table of Contents section +- Contributed to the Quick Start section +- Contributed to the Add feature component +- Contributed to the Delete feature component +- Contributed to the Packall feature component +- Contributed to the Unpackall feature component +- Contributed to the Command Summary section + --- ##### Contribution to the [DG](../DeveloperGuide.md) +- Contributed to the Add command mechanisms component +- Contributed to the Delete command mechanisms component +- Contributed to the Target User Profile section +- Contributed to the Value Proposition section + --- ##### Contributions to team-based tasks - - +- Contributed to the planning of BagPacker by brainstorming features to implement +- Labelled, assigned and set milestones for issues on Github [issues](https://github.com/AY2223S2-CS2113-T14-2/tp/issues?q=is%3Aissue+author%3Atangphi+is%3Aclosed) +- Helped resolve bugs from the PE-Dry run --- ##### Review/mentoring contributions --- ##### Contributions beyond the project team - +- Reported bugs in other teams' program and provided suggestions to improve: [CS2113-F10-2](https://github.com/tangphi/ped/issues) +- Reviewed DG of other teams and provided suggestions to improve: [CS2113-W12-2](https://github.com/nus-cs2113-AY2223S2/tp/pull/5/files#r1152849879) --- ##### Contributions to the Developer Guide (Extracts): From bb645083cb8dd515cbe513b6194ad506a17e5226 Mon Sep 17 00:00:00 2001 From: Sophie Date: Sun, 9 Apr 2023 17:34:06 +0800 Subject: [PATCH 146/207] Update PPP documentation --- docs/team/tangphi.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/docs/team/tangphi.md b/docs/team/tangphi.md index c1bd3eb305..25e983fb3c 100644 --- a/docs/team/tangphi.md +++ b/docs/team/tangphi.md @@ -3,6 +3,9 @@ # Yinxuan (Sophie) Tang - Project Portfolio Page ## Overview +BagPacker is a desktop packing list application used to manage a user's list of items to pack. The user interacts with it using a CLI to add, delete, edit, find, list out the items and many more. It is written in Java, and has about 2kLoC. + +My contributions of the projects are given below. ### Summary of Contributions @@ -53,18 +56,11 @@ V2.1 - Contributed to the planning of BagPacker by brainstorming features to implement - Labelled, assigned and set milestones for issues on Github [issues](https://github.com/AY2223S2-CS2113-T14-2/tp/issues?q=is%3Aissue+author%3Atangphi+is%3Aclosed) - Helped resolve bugs from the PE-Dry run ---- -##### Review/mentoring contributions +- Documenting the target user profile in the developer doc --- ##### Contributions beyond the project team - Reported bugs in other teams' program and provided suggestions to improve: [CS2113-F10-2](https://github.com/tangphi/ped/issues) - Reviewed DG of other teams and provided suggestions to improve: [CS2113-W12-2](https://github.com/nus-cs2113-AY2223S2/tp/pull/5/files#r1152849879) ---- - -##### Contributions to the Developer Guide (Extracts): - ---- -##### Contributions to the User Guide (Extracts): From 0ce0eb458772f32105647ef2f2ac5f2d176d387b Mon Sep 17 00:00:00 2001 From: Sophie Date: Sun, 9 Apr 2023 17:39:09 +0800 Subject: [PATCH 147/207] Edit formating of PPP --- docs/team/tangphi.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/team/tangphi.md b/docs/team/tangphi.md index 25e983fb3c..a3f208b34b 100644 --- a/docs/team/tangphi.md +++ b/docs/team/tangphi.md @@ -23,7 +23,9 @@ V1.0: [PR](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/22) 4. Create initial unpack command feature [#6](https://github.com/AY2223S2-CS2113-T14-2/tp/issues/6) V2.1 + 5. Create packall command feature [#132](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/132) + 6. Create unpackall command feature [#153](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/153) --- From f4802503ba9babd3349b6036384c8e37a59373fb Mon Sep 17 00:00:00 2001 From: Sophie Date: Sun, 9 Apr 2023 17:41:06 +0800 Subject: [PATCH 148/207] Edit PPP spacing --- docs/team/tangphi.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/team/tangphi.md b/docs/team/tangphi.md index a3f208b34b..fddf3fa1cb 100644 --- a/docs/team/tangphi.md +++ b/docs/team/tangphi.md @@ -18,8 +18,11 @@ My contributions of the projects are given below. V1.0: [PR](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/22) 1. Create initial add command feature [#3](https://github.com/AY2223S2-CS2113-T14-2/tp/issues/3) + 2. Create initial delete command feature [#4](https://github.com/AY2223S2-CS2113-T14-2/tp/issues/4) + 3. Create initial pack command feature [#5](https://github.com/AY2223S2-CS2113-T14-2/tp/issues/5) + 4. Create initial unpack command feature [#6](https://github.com/AY2223S2-CS2113-T14-2/tp/issues/6) V2.1 From 4277e978b3e39a1b5f3e87ad2cff04a6ba03f329 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sun, 9 Apr 2023 18:47:24 +0800 Subject: [PATCH 149/207] Create UML sequence diagram for overall application --- docs/umlDiagrams/AddExistingItemDiagram.puml | 2 +- .../umlDiagrams/BagPackerSequenceDiagram.puml | 60 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 docs/umlDiagrams/BagPackerSequenceDiagram.puml diff --git a/docs/umlDiagrams/AddExistingItemDiagram.puml b/docs/umlDiagrams/AddExistingItemDiagram.puml index e963ab8181..22876de67d 100644 --- a/docs/umlDiagrams/AddExistingItemDiagram.puml +++ b/docs/umlDiagrams/AddExistingItemDiagram.puml @@ -33,7 +33,7 @@ end note right Ui print out methods omitted for clearer -explanation +AddExistingItemDiagram.pumlexplanation end note ":BagPacker" <-- ":AddCommand" deactivate ":AddCommand" diff --git a/docs/umlDiagrams/BagPackerSequenceDiagram.puml b/docs/umlDiagrams/BagPackerSequenceDiagram.puml new file mode 100644 index 0000000000..acd878bcde --- /dev/null +++ b/docs/umlDiagrams/BagPackerSequenceDiagram.puml @@ -0,0 +1,60 @@ +@startuml +'https://plantuml.com/sequence-diagram + +autonumber + +@startuml +skinparam sequence { + backgroundColor<<:Command>> #SeaGreen +} +activate ":BagPacker" +":BagPacker" -> ":BagPacker": runBagPacker() +activate ":BagPacker" +loop [[ByeCommand.isBagPackerRunning]] +create ":Parser" +":BagPacker" -> ":Parser": Parser.parse() +activate ":Parser" #yellow +":Parser" -> ":Parser" : parse() +activate ":Parser" #gold +":Parser" -> ":Parser" : readline() & setFullInput() & getCommand() +activate ":Parser" #grey +":Parser" --> ":Parser" +deactivate ":Parser" +":Parser" -> ":Parser" : createCommandObj() +activate ":Parser" #DeepSkyBlue + +create ":Command" +note right #MediumSeaGreen +All details in green activation +bars omitted as it depends +on the type of command input +end note +":Parser" -> ":Command" : constructs Command Object +activate ":Command" #MediumSeaGreen +note right +In actuality the child +class of Command class +will be constructed +end note +":Parser" <-- ":Command" : relevant Command Object +deactivate ":Command" +":Parser" --> ":Parser" : Command Object +deactivate ":Parser" +":Parser" --> ":Parser" +deactivate ":Parser" +":BagPacker" <-- ":Parser" : currentCommand +deactivate ":Parser" +":BagPacker" -> ":Command": currentCommand.execute() +activate ":Command" #MediumSeaGreen +":Command" -> ":Command" : execute() +activate ":Command" #MediumSpringGreen +destroy ":Parser" +":Command" --> ":Command" +deactivate ":Command" +":BagPacker" <-- ":Command": command is done executing +deactivate ":Command" +destroy ":Command" +end +":BagPacker" --> ":BagPacker": +deactivate ":BagPacker" +@enduml \ No newline at end of file From ffd9ee96a8ba321c22c9c3bdab0f915ac3e901cd Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sun, 9 Apr 2023 18:47:40 +0800 Subject: [PATCH 150/207] Refactor command name in BagPacker Class --- src/main/java/bagpacker/BagPacker.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/bagpacker/BagPacker.java b/src/main/java/bagpacker/BagPacker.java index 88587a1a81..ca322e935e 100644 --- a/src/main/java/bagpacker/BagPacker.java +++ b/src/main/java/bagpacker/BagPacker.java @@ -41,8 +41,8 @@ public static void main(String[] args) { public static void runBagPacker() { while (ByeCommand.isBagPackerRunning) { - Command c = Parser.parse(); - c.execute(packingList); + Command currentCommand = Parser.parse(); + currentCommand.execute(packingList); } } } From 0ae5782514e02b5c755b689550d1c595449d1128 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sun, 9 Apr 2023 18:48:07 +0800 Subject: [PATCH 151/207] Create UML image --- docs/umlDiagrams/BagPackerSequenceDiagram.png | Bin 0 -> 41828 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/umlDiagrams/BagPackerSequenceDiagram.png diff --git a/docs/umlDiagrams/BagPackerSequenceDiagram.png b/docs/umlDiagrams/BagPackerSequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..097a01304245602aaaf6d1ecad4b1b67f2b72a56 GIT binary patch literal 41828 zcmce8bzGHO+a?$w0-}VJfJlRc(v2eBUDDkku<1}r=|;c}NOzZ{(jeW9fOL1mtPOfR z=Y8Lq`F``w4F7C)t!F)J-F02}we|;TNg>p`cz5C8;7~<`U&+G3-S`d%ck}U`8{iey z_zFkxKy53aY^!T&H2iTRU?zI$cY1 zNLM=%7$(J7UfK5d>u~U39EVSV3Tjg0447`^5tmlC`fj1+3N{P)-PiGcTOlvM+KfE= zEfDQnLm^`eoqyW-A+&_*ON9JSvbJsZ=|iahdjEv=s!P_5s5)V&^>?|}?Q$Ukk~37C z9>%$CF`dBS*$ztG;NWD&@U++d;TR+FPwGnEb7)=OXx61zoFFz6Ac+^Jytl6SHP)Sh z%{W(3tH$kga&-N+OtaqB76WyG4pIA=`FYi_>dMdUXIh0#`deP()xNc=ep<)RI@*U7&Lj3+VZkJd@yLdcQXp$?-gA@+=HEB0J}c6YhoNxGK$_6>q) zYQ#)ps$A(_Vg7rJv+&`fi_&lu6harcCZUKOMpoT-@>=hAU^I#e)_;z@9pI9fqVe52 zHAlQ}X+njl>Jc@KbQVsPVxA?u>CWoF4M^$zjW1z&%1eF;`lFl5+g$Yfxi}AfJZePS zU42RsFgN{q2vNqeXsJKhtPe4jtG;GUG$g%aO!C#4ai=iUWUVmus9D+3R3=~WnE!rm zn%x7RBShWJO6R;f{lL-kyKIePl^=_1S_*MyI$Y~MheUJ zAS;<>nP&);XH7Pgdk%A1N>RC3KP&i<^yQSj)|-9o6AR@UYD4!-v~~sKJ|3MF!VK{m zfxyg*68BsE--)E@HjAL&+h~6_t5u46k-ENF_>NlpJ@5F_P3Wj(8qPNY^Yzu;xJdZg zt{}SKd5=dxwZ59LQ-#B1jX#qwGA^`Hut|1*IL0DvE2i9_y9AriiDw6%-5Y z9h^6N5Xy8wRAS50v;*bzg@f~e6M6MQ-a%t+5=mKMaEjMTo*eh~11^;3)bDTJNP3>4 zfy(SFUukJ$pd6c&q+a^vX@7O5UX+hq+HgC(OmSW8KBV~Vj6%4W@zhhs;#UtIP<+}s zbNBWBzOHdN>k?eg_lN(y;jrD57SE8;nZT>*rU^!h6T=7U6&L4R=XMjaIYn`gF?HK9mf2KLZqlavTtJ}ieS?V^ zljn%a;`Oj5@4deHB@1<9VqbE&xfs~m8d`s(l88mQM|kGCG2zYc8-(dQIC6E7k~ER} z5W1P7`Lpx{(TPcJTB9cHSflTHnti0&!uXn9?x(qDzC>=$E18A~&Kn9t{h4yZ!y0k!OFapQXcs)X z&HlBu<|>!fj+x@1;u^ zOCbkK+3B$6rs002-MGW!A5G61>_vijFVAv%lUuT+25Vg-jt=KXxxRei?C;yS+#h~E zB!U$OZKiJ@I1mc?TTu9G zVSBt}4sVS|gcm3C`({MZs>zZk$`enT?)+TNRdu|5`}XB-g8z}dg8V~g zUAf*u1hm@mwze;F>3N(G7uv331BrX#QZaEHH#hTXC)3fH1~T5Wt?{{FDI8XdFt+A5cvlgi6&<4) z7*!=C&<+Bzm>i?vJ{P&LA&VNlcK4`{3_02V^BC|SLP~}P(p+k^fj^B!xJgT}(&MZ6 zu@cF!&;_NxFyA8|9Ln#WtadCus|7)X$#Gv42MY_!vijL&>F`2V?7kC*S+QaF`N?Yj zJS&KCa4Rtkc$4MRZZw;)q6JxN66xmVTkv0j_|*++x&8BD2+FV}DFxpDt_MB|9-m^s zZWHb!(LWv%>?lyG`!V3)zCKq`sW%!g%dHlB=}H4W$b@qhA{lspKLn^2gl}za;cz)@ zN%5YO63Jum@E03&8imOu3r0powIdFCL89$r42JX6ZvrD`(1OF-F$V)J$hCN96=oRT z+0Wf?8Q!nEILXe*F>4OMefI2GIa+26(<6C#`KRiYdsEJvk!GwSPz*sAm$M6M`POm} zg+EFWU}rTa#S;&d4<(qX*V!(IrKhKtv|tvAP}9%=7fInx%TTLt{r+7{R8+_A&6_uF zZWrt0;F}$3bjS)MvfcMr)KZPSyV~1VhH~+f5-f_( zHv=EB_cb-8+AMZCAFOFZUBcLH7Pt;4Y;y84GK9s%l6x3+8sCF=w?ofFDWu}7t!7>h zT`t5~_W9<3yVfS5(Y<{iUy^#n%qJ0O?Hbw&ncj?*7`u?x$sW+657k*t^SC76f`cpRx5a2~ z3#V|TU01^WihO|AJZ@P>KtRyxRFSQezoQKg56=|fMGxi5)e# zcO5fyD&25l-CO)>n^l{&_Xs#1aXUrWbFj1HhKXUh=|IA0O3TX)A9zW>AS%KGCcPGr z2Z<8l=FhNo3Nqa&}{MHgg1_t`%Y^eUV)u*h|In$>{M-PM5%KmsW1u72w z6>L8L_PaX%ClnME&!0bk{P-~qjejt&>xpdwkL!(_H(4zvTIbT}#^qLuX{zqu4} z;;&Imyw#;UN%f23%+Jq*dSZ35s=ThwU0S-wFu|3a zNSlW_9@L*6sHW6No;5}f9z5u+bH4-zeG37>(cmX^zPOZQ~0 z7rJ<;^`1C5+l*ZLcc$z^ioTaeS2#|8G5Hk_F7p&Y~dCZERemd9Cr| zj!{ovLTnZ~LN{R<%+79YtbM{XE8;cRN`_8Bng0dk3iguZsX& zVr}`WYKwscRQ2juj`{O1VE4;FLK;2e4emr;`b*a%>id*@{EpF0)Y)gQn!;m<9)ZX z&Gtx|nwpx^z2)8AZr)-y+K*(~m{_=eRhvVHOWKrv{;1GB`oYPn)oy4%@3z-eOG^)- z1E2d&ineKYyie|zFRY6-%V&<~AD^8l=I+(j+K%sI)8lcBzD37CmD)Z(-?v#@A#&+q z@L56QVKDw0&+RjeU}UP5=r-4^R#knJRBNu*P*7@$3Ka@k3J=?hk3T`euuvyxafYme zjJB$-j!J@v+IM-fYOZ!X*+WBcSU!#NrM;oSD#is{<8_4=4Kqs>>QyUs zryFGiiyhA}rFhLVuq@f|V`8&5Cr`@=XlPKq!~4yleX&?Y_^ExyX4$jeN~pE_?{B~r zz@x@8#5-@WXMvz0#wfi#W}2UQSnNvVyjFO;yD0a}Y0qdV-`jewxtF+>DPd8Vm zox7!_TYILt?(eTnYpT<$Db|GaKQU>CQ_bSNeC>Wz@Ht%~POYkEx%b0%*EdhpeP1HH zhXO2oeuq6;)CU`bn-j*APWzRmk<1X*J<%2do(XBW4VBWBA+MYt`P$NFvJ=r31cPd2 zI2Y?f>q9}7b>>Ilg=B|@(binGeKN9g9?~j%{JRHPNShHuIU$pjk&?PsoUIzwQmGA7t_)14PEX>&uBXNxo_+2J9WfGM{8p{(TOp0Q$=f^@5#q=#~to7 z+ZGWRzftv6aXsG29gBdkyR;DID%tuD`K&#hKfRKIk@hZrsNZ;3GUyNmM~m{&qrIDm zctgEKMdM{VRiBkO=+t?zqUjVgAFt}&W_EUN2#N@oKd6CpN;8_t6&v`tAA727`xM9C zqn->c&7f>pC99U>@WB3$TmFcEAd^SI+YdmEEU?{ZO{tE~APjmYQgtMHl>Mx%-K zgM-p_M@gRz=*Of!87*nkE6K}Gd`c2M-0+dyt|B#KpnbX64VF|$+fp+G)1*n#n1INV zlIJADM}4H1N+W{;#qas$Y2ArP_#QmGPyEu-c$w&?kHhPSpN-s}X}7*VEfP3c8C269 zN!y-7^-WIvN;zdUN<89gOFY+%E4kb+Woak-RBM_;doGnTb|kYxVY@yXVZ!MZJlu!} zf&|X`SZQ&1wPNpQenglngPaSn>)W?)bEX4U9@6iX=Oem6wKgA$OR@~OUl=>QkqUHj zJNnkMyVc<1)SI+|{qyty?1v@)gk$>5ZI8ihRJ)cSp9>)(=7G(+e9bR?(&A93@wWkk ze!y*N*uH6~OOJZjgw+{H?BmPmlQ@P(=uv{)af1JBeQdH!!HKnTZpZTBQ_Vbv;)sgP z)=-~!t`q_%>gYRPZ~Dyo)1#EmqDB+Ea~IZr@}xdQJ&1_4TIUsX+D+|zl8%M1GWi44 z@5&s%{$-Ba19DQMB2$(xyq$Q*?LnQe_B6p^7HPY@gEZy>!i;rHX-NZS*<>}4X1Szk4YPpom|I1!`BQ2;~f`bii)1Y_OjY> zmy4VG^lK z^7;|)Y~Ca|xSXH`q-36v;n$A&>;sG%OO|c7^_pC;a(l0P4AKXc`zMV+eh+fh7Lk{kns5AqrJ94 zf$w4lML@;#asbs;58O%^Lk`}ofUC=PQ#7Mtm)m?Kd(^Z+XDp}X)VsT*mJJ}U`p8y! zeRGSoodwiF8P3$y6g5$MkK!@e+ctpArrq7o3v~^1Qwg{n%)Y&2osR~?q9#F*_#aI! zjTKEpjDPau?&l_29ISnrrM8#}>{4;V1s8tY*x}&?-ww;wUu|^^`0C;GVPIE_;~C>) zZI9{n@#>L#59zYde|#ToebO zvC1!BM4WR}H8eD2Wzn<4!^3xXcP*za(Em&ar7MBA8xb25la!piva)i;wsJ6AsaO&( zAu@6>SB*8x#>R%=(IZgT0`z!1sH9m44;TPrW8?VvcoM+?Hv5fF715ac`O1a$lauE` zoEvP8JEW^jbJoA0q+&lsD36|9F02&uSca|9=X7t!scJ_I3Q0X82q=~)DAJ3H-psd0 z^6>DuoQ08zNkTaUm}z(AHS645=b8gS;c3QaU|?Wvy$vgC={0%G$C#|?saD*7h6;7X zbBo!tadSiMVz(>S)JSut$}Ke~Yh`qF>Iu|BcD2Xgh!w3tL|r zg~L`>^UE9WyLS=q-Mg35AJ78Bj)nZ1c6Uxf21}E|7}iKLU#iM+x>R^c1`k%*Z;DCO zWSgr&Jw0__z53Z6Nwls0<_+ZN=;&Z2Qk;lRt!!v&>RVeIJ4+eo{%&TPq-*ndm0cW* z+gytj`a9n)u|v!D^B_&2g)M3bgRHDfZb$b%oY<98!s`oIfaC0kfIoelLZjD zpLsrqhp~MpW2U=k1Sh+I!US|&?{GQoG#TwW&k8*y8y}Hubz;c&YQFyHXg2@L`jL;` z$i<5tZ2;VbB_(MtbUOQ*G`U_;X^DmJV_wvHhii!$AOuct*Te*$=ut#gmyH2}4pasfdN8Q5omU(=PqVLTHKm0 z;~5$yho&6n)u5|O#ON-#-m`~Tn zS*{FZin(2&&En{u{$-zuWdmT#3DA8$fEZ$J7zyRHZ!cHy4gka$R8r`egp*Tkn=J5z zA^=Ph7!Mi|-RGri&fjR7$D}PxK`7{xM(x>6XJ^DAc0}#5G6gDpBNyNrb>ccG$YYgzHt{s%5qM78;eQaZtRCa9MKx~)p z4;JZ*`C(huly)fBj}*-_;%QlG9eqY0a@<>rLBdFLa&)Y!tekROOssLv)nVNh(T!gT0|8$OXNN8% zq}B&G;e8MziHHF0C|m6VvQ;S=Y&>$m7XO}}p0QfA1|3*Sflv1V<4tryxkmS>S0_o{ zD1Wk$M3AF9k&nP%w+rUdv{u*Op9I63*Iz@Ryh5D)A7bE62;jG$-)-sY1dXPF>UlasVA4gZo11c?4$V(TM>Y*61FX z!PkYWSuy#7(51C|m4;(svn_DEO2eHn_&>sRm4+8!rf3#_Juoa&vPfN}VRl$PjHCEJ z8eT=Fegq^YKt>><;P837;KRY;T#xh#i!1=d-gAYF5KEBe=dPz#9OV@n9UUDJ(YOMF z!r9r`c==5@51H$^#?WZ@BwIK6VQp+|*iTru0J2lX@WqQ4Iyy<&+1ZlmYBf&GL^1!> z)ck1m6PM#oy*ILo1ezPj7;tdXB-iWE@sWYh@nQ!dM>vMbQHOHi5+)Z&h#liS|A)&aFUnIJj#AVKQv?vOe0B+SfqBL&(Ct_Pz{{@BMqe*Dn#!V7vZr6QeeH|xm zq_ea0L(V+~-$XPOR5&d zckWaGW_6u^?_ZJ`DCI;uPV9!15>8$y`Hw_I9FiLYYGYjX^rJpunRg|TwWX}Il|!7V6oeCpT3Q;6X_ zWm10nFRL+ek<=6nX~r`L$yT$>Y?Q!$;sG|c(B;YLshpvf)(?OPe#(LM)4vL7%r18GfO8S%^M}_3;R!DA8hm_lB1Z|TNr6$q2oB#V zfXDe=N5%zFoPe}CSjTNe@OnFT$-%l5@cn-YsDIzTr!3k%4dco(G@$i?$7c1z1OBG` z#hxkXb2&IT@bP^G&;%SH+uod3SzArY0$7N%? z+uJjCxsn>yKULTBUOI`MG}ls4NPfD5g7O+PDF7jd_K1xSvAwG+DxegzFV3=^;AVlI zj)C;)?2{l1TVb4`)-nviKiF&8@pyea`%6W|>o0HSK|3KYFK@@Zl!ALk607&i7*1yvx3M~32LWuUJQTKs`4 zetv!>B}^dXJRlML#AzRd3Vd2vTs&n^>{ojbaP9}I!`%%Hx*)a8Qq#~z(W&DR5^ntX zQQ)|1FqG*K0TK=U>xz)UJxw1Ty;5;e(Yv(xfYkns`*Yl)y|Xj5ft{1{aBXxqJHJ*3 zI{RYXLg!`*O?E_y=A#_t_tD}|+vJJK$<2znAkZsnhs^AEGG=YC&T+GYmd$jn>-pK) zLwb#l#r*Af+ohh*85!@TUcw@`Ur|xfXMW$ln_3_(7SN>e<;f~m&B0f;k1LY^iU2LxXHTBIv!f=ANTA40O*z-e)qvf3FxO7&XtCjP_6sMc zN;7O@+I6NmZd^{tT9SbO(k;PY!cH`qId0?8BC=qQ=eW4Id(44!;e=Q~8lVL&q3@Kc z>VXCa20}qs78sQN;R{!fSx<@WC~BS?64knJQQ{pa6QnNElqGTT>!)~r=rone#LF)WCUC`B_MrBik zkB`sM@yo?Qw^HCCXn%P}SzUaV7Z$#Q%!G*z`f@51b&%L7lS<_&%UL+d6D_&wRKH+8 zxeXi-Z(zM=b-od7mA%B;$|URP2=2>3G|{#}E+iy0(MNxel1IA-Rx~ta)Exn)0@`d)S&T*5@bt-vH1)T`vc%#WS+IRI2pLNZg%k zD=U=%z=7SAZt4%0d88{!ysC%Hs~)?DR5L3)W!&ui5;67J$vCej^Atwx*^h6YXZ)i0 zt3$cE%4QsOd$gr6c5fQ1XE32!jjsXlkUXCxVQ(-mp zuGWM=R8le??0IoF4-Jv6oWA}%s0NN*rMWU@m)o}7IB2#jB=@}CmL4?8me6iFJI|DsE5V9;T&W>Rc0H`0Mm{eQ9q2A8Vwg@ar z)Bplb#d8c|?zfum=aCC%OUc2MjV_=o77h{#A(BA$uP zPFgy;4N$S?FkUs7!{VQVP`dpMCRSiFx^LH~N|$#_hd382__^K60080zv3{ToC|31@ zRBzUvs+O7vv_M%cr+~w50s;<~(V*35esQs-v2kR4yqN40>~0NgtgW?6_vBMYs*r1{ ztEXHK)vvcy9g_gs^|nri&)Q&_DrP&rhw+rh_2d=;0&E-IHxq${QY!DQ4Ej4gdGbUt zSGDOBkSKtH0G7>R^@A@lxGtsXphma>$4P@`hxo< zVL-9vIk-1aoS69IV0}oUQZQE1-&tpTnzLs%2%d=nR?!{b|5eeABY8G9Hm+s9l**hR z&v`wG?la|b*f>0F4{P(&smDIk^=Z%VEP!9A)P;jlXeOFGzhcs;%T*l(Re)?vP)!@m zgOa1ePU_$L;p6vhCZAp7X?mhxHfY8Jz?sLt;ju4cHt8K2JjnTzSn~kNe_|u zYu)DxGs5BFU|AM0tpB&5UAl2SB`CM5Am$<>A6z`y2M$0575l4#ViLsx5eAKWPZ|JK z4UKr0xR{S_pyw>{=~uBN0qdV{R_{uRiw8)igY*N1fJ)EzKAcC}UxlU?z3MF>DnLMx zt$zRheGiky()Rrua15Xj0fey4zBtaAfPY9xNSOj2`9I%ULGtuQ@F)A{QoN+q?qCWk z1M&=dwXz%#4MIahK?6n?*&UQRF!>cPfMQJOzbe2Oh9fR;2Y^aVHhX}D9tbSNuc}a-^lDQ+rNPLEr*Hpl z`~Ev{`tQ}>{{yuCUl<-%7C(2taEbN3F#o|pOS`@x0BjWRdJ(dC9+)8ULtQEn1}cOQ z;R>Ey8=`{ilK^rQmEw$UJZEmOC?>yFXdhNLGlX8R&`=!179N0NAFda_c*;v#hT
  • g&G7v!F5}&H&ZFW3#J|G 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 ZCmbsHlAJdIM?xYbMP)_Oh3-H5e*klRf|>vT literal 0 HcmV?d00001 From e9649ea791de0e42ffbc74040d4c89a1879bf5e4 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Sun, 9 Apr 2023 21:44:56 +0800 Subject: [PATCH 152/207] Update User Guide --- docs/UserGuide.md | 374 ++++++++++++++++++++++++++++++---------------- 1 file changed, 244 insertions(+), 130 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a77698e1f1..f1dadeb602 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -1,57 +1,124 @@ # BagPacker User Guide +BagPacker is a desktop application to help travellers manage their packing list, via a Command Line Interface (CLI). +Users can add items of varying quantities to their packing list, delete items, view their packing list and much more. +With BagPacker, you never need to worry about packing wrongly again. Simply use BagPacker to remind you of what +is unpacked and travel with an ease of mind. + --- ## Table of contents -* [Introduction](#span-stylecolor00a36c-introduction-span) * [Quick Start](#span-stylecolor00a36c-quick-start-span) * [Features](#span-stylecolor00a36c-features-span) + * [Help message](#span-stylecolor6495ed-help-message--span-help) * [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) * [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) - * [Packing an item](#span-stylecolor6495ed-packing-some-items--span-pack) - * [Fully pack an item](#span-stylecolor6495ed-marking-total-quantity-of-item-as-packed--span-packall) - * [Unpacking an item](#span-stylecolor6495ed-unpacking-some-items--span-unpack) + * [Packing an item](#span-stylecolor6495ed-packing-an-item--span-pack) + * [Packing all of an item](#span-stylecolor6495ed-packing-all-of-an-item--span-packall) + * [Unpacking an item](#span-stylecolor6495ed-unpacking-an-item--span-unpack) + * [Unpacking all of an item](#span-stylecolor6495ed-unpacking-all-of-an-item--span-unpackall) * [Editing item quantity](#span-stylecolor6495ed-editing-item-quantity--span-editquantity) * [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) * [Listing all unpacked items](#span-stylecolor6495ed-listing-all-unpacked-items--span-listunpacked) * [Deleting the entire list](#span-stylecolor6495ed-deleting-the-entire-list--span-deletelist) * [Finding an item](#span-stylecolor6495ed-finding-an-item--span-find) - * [Help message](#span-stylecolor6495ed-help-message--span-help) * [Exiting the application](#span-stylecolor6495ed-exiting-the-application--span-bye) * [Frequently Asked Questions (FAQ)](#span-stylecolor00a36c-frequently-asked-questions--faq--span) * [Command Summary](#span-stylecolor00a36c-command-summary-span) --- -## Introduction - -BagPacker is an application to help travellers manage their packing list. -Users can add items of varying quantities to their packing list, delete items, view their packing list and much more. -With BagPacker, you never need to worry about miss-packing again simply use BagPacker to remind you of what -is unpacked and travel with ease of mind. - ---- - ## Quick Start -1. Ensure that you have Java 11 installed. - * If not, please follow the instructions here for [Windows](https://docs.oracle.com/en/java/javase/11/install/installation-jdk-microsoft-windows-platforms.html#GUID-A7E27B90-A28D-4237-9383-A58B416071CA) and [macOS](https://docs.oracle.com/en/java/javase/11/install/installation-jdk-macos.html#GUID-2FE451B0-9572-4E38-A1A5-568B77B146DE) -2. Download the `jar` file from the **latest release** [here](https://github.com/AY2223S2-CS2113-T14-2/tp/releases) -3. Move this `jar` file into an empty folder on your computer. -4. Open a command line interface, and navigate to the directory with the `jar` file using the `cd` command. +1. Ensure that you have Java `11` installed in your Computer. + * If not, please follow the instructions here for [Windows](https://docs.oracle.com/en/java/javase/11/install/installation-jdk-microsoft-windows-platforms.html#GUID-A7E27B90-A28D-4237-9383-A58B416071CA) and [macOS](https://docs.oracle.com/en/java/javase/11/install/installation-jdk-macos.html#GUID-2FE451B0-9572-4E38-A1A5-568B77B146DE). +2. Download the `BagPacker.jar` file from the **latest release** [here](https://github.com/AY2223S2-CS2113-T14-2/tp/releases). +3. Copy the `BagPacker.jar` file to the folder you want to use as the _home folder_ for BagPacker. + * We recommend using an empty folder. +4. Open a command terminal, and navigate to the folder with the `jar` file using the `cd` command. * For Windows users: search for Command Prompt, and launch it. * For macOS users: search for Terminal, and launch it. -5. Execute the following command `java -jar Team_Project.jar` +5. Execute the following command `java -jar BagPacker.jar` to run BagPacker. BagPacker should start up, and the following message will be displayed. + ``` + Hi this is, + ____ _____ _ + | _ \ | __ \ | | + | |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ + | _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| + | |_) | (_| | (_| | | | (_| | (__| < __/ | + |____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ + + Enter "help" to find out how to use BagPacker + ________________________________________________________________________________________________________________________ + ________________________________________________________________________________________________________________________ + Welcome back, User! + ``` +6. Type a command, and press Enter to execute it. +To start off, typing `help` and pressing Enter will display a help message. + +7. Refer to the [Features section](#span-stylecolor00a36c-features-span) below for details of each command. --- ## Features > **Notes about command format** -> * Words that are fully capitalised (such as `QUANTITY`) indicate that an input is expected from the user. +> * Words in `UPPER_CASE` (such as `QUANTITY`) indicate that an input is expected from the user. +> * E.g. in `add QUANTITY /of NAME`, `QUANTITY` and `NAME` are parameters which can be used as `add 2 /of shoes`. > * The `/` in `/of` is necessary for `of` to be recognised as a keyword. > * `NAME` is a case-sensitive input. -> * Additional parameters will be ignored for commands that do not need them. +> * The order of parameters has to be strictly followed. +> * Not following the given order would result in error messages or incorrect behaviour. +> * Leading and trailing spaces for each input will be ignored. +> * Extraneous parameters will be ignored for commands that do not take in parameters. > * For example, `deletelist abc123` will be interpreted as `deletelist`. +> * For more information on integers, please read this [Wikipedia page](https://en.wikipedia.org/wiki/Integer). + +### Help message: `help` +Displays a help message containing the command summary and examples of how to use each command. + +Format: `help` +* This command is not expecting any parameters. Any additional parameters will be ignored. + +Example: + +`help` +* Expected outcome: + ``` + All Commands: + 1. add: Adds quantity and name of item to the packing list. + Example: add 3 /of toothbrush + Meaning: Add quantity of 3 toothbrushes to the packing list + 2. delete: Deletes an item from the packing list. + Example: delete 1 + Meaning: Removes the first item in the packing list + 3. pack: Adds to the current quantity of items packed in the packing list. + Example: pack 2 /of 3 + Meaning: Packs 2 more quantities of the third item in the packing list + 4. packall: Fully pack an item of choice from the packing list. + Example: packall /of 3 + Meaning: Set the third item in the packing list as fully packed + 5. unpack: Deducts from the current quantity of items packed in the packing list. + Example: unpack 1 /of 2 + Meaning: Unpacks 1 quantity of the second item in the packing list + 6. unpackall: Fully unpacks an item of choice from the packing list. + Example: unpackall /of 3 + Meaning: Set the third item in the packing list as totally not packed yet + 7. editquantity: Edit the total quantity of an item to be packed. + Example: editquantity 3 /of 2 + Meaning: Change the total quantity of the second item to 3 + 8. list: List all items and their total quantities packed in packing list. + Example: list + 9. listunpacked: List all items and their total quantities if they are not fully packed yet. + Example: listunpacked + 10. deletelist: Deletes all items in the packing list. + Example: deletelist + 11. find: Displays all items in the packingList as a list that contains the keyword used in the command. + Example: find jacket + 12. bye: Stops the BagPacker Application + Example: bye + ``` ### Adding a new item: `add` Adds a new item and its quantity to the packing list. @@ -63,24 +130,28 @@ Format: `add QUANTITY /of NAME` * An invalid `QUANTITY` will result in an error message. * `NAME` is the name of the item to be packed. * `NAME` is case-sensitive. - -
    Examples of usage:
    - -* `add 3 /of jackets` - -* `add 2 /of water bottles` - -
    Expected outcomes:
    - -BagPacker will add a quantity of 3 jackets to the packing list - -``` -New item added: [0/3] jackets -``` -BagPacker will add a quantity of 2 water bottles to the packing list -``` -New item added: [0/2] water bottles -``` + * `NAME` accepts alphanumeric and special characters. + * If there is already an item with the same `NAME`, `QUANTITY` will be added to the total quantity of that item. + +Examples: + +`add 3 /of jackets` +* Adds an item of name `jackets` with a total quantity of `3`. +* Expected outcome: + ``` + New item added: [0/3] jackets + ``` +`add 2 /of water bottles` and `add 3 /of water bottles` +* Adds an item of name `water botles` with a total quantity of `2`. +* Adds `3` to the total quantity of the index of the item `water bottles`. +* Expected outcome: + ``` + New item added: [0/2] water bottles + ``` + and + ``` + Add to quantity of existing item: [0/5] water bottles + ``` ### Deleting an item: `delete` Deletes an item from the packing list. @@ -91,17 +162,20 @@ Format: `delete INDEX` * It must be more than 0, but no more than the number of items in the list. * An invalid index will result in an error message. -
    Example of usage:
    - -* `delete 2` - -
    Expected outcome:
    - -BagPacker will remove the second item from the packing list - -``` -[0/2] water bottles removed from the list -``` +Examples: + +`delete 2` +* Deletes the item at index `2` from the packing list. +* Expected outcome: + ``` + [0/2] water bottles removed from the list + ``` +`deletes 100` +* Deletes the item at index `100` from the packing list. +* Expected outcome: + ``` + [12/20] pens removed from the list + ``` ### Packing an item: `pack` Packs the given amount of that item in the packing list. @@ -115,10 +189,16 @@ Format: `pack QUANTITY /of INDEX` * It must be a positive integer that is more than 0, but no more than the number of items in the list. * An invalid `INDEX` will result in an error message. -Examples of usage: -* `pack 3 /of 1` +Example: + +`pack 2 /of 1` +* Adds `3` to the packed quantity of the item at index `1` in the packing list. +* Expected outcome: + ``` + Item packed: [2/3] jackets + ``` -### Fully pack an item: `packall` +### Packing all of an item: `packall` Packs the total quantity of that item in the packing list. Format: `packall /of INDEX` @@ -127,17 +207,14 @@ Format: `packall /of INDEX` * It must be a positive integer that is more than 0, but no more than the number of items in the list. * An invalid `INDEX` will result in an error message. -
    Example of usage:
    +Example: `packall /of 3` - -
    Expected outcome:
    - -BagPacker will mark all the quantities of the third item in the packing list as 'packed' - -``` -Item packed: [20/20] socks -``` +* The packed quantity of the item at index `3` becomes its total quantity. +* Expected outcome: + ``` + Item packed: [20/20] socks + ``` ### Unpacking an item: `unpack` Unpacks the given amount of that item in the packing list. @@ -151,10 +228,16 @@ Format: `unpack QUANTITY /of INDEX` * It must be a positive integer that is more than 0, but no more than the number of items in the list. * An invalid `INDEX` will result in an error message. -Example of usage: -* `unpack 2 /of 5` +Example: + +`unpack 2 /of 5` +* Subtracts `2` from the packed quantity of the item at index `5` in the packing list. +* Expected outcome: + ``` + Item unpacked: [2/10] shirts + ``` -### Fully unpack an item: `unpackall` +### Unpacking all of an item: `unpackall` Unpacks the total quantity of that item in the packing list. Format: `unpackall /of INDEX` @@ -163,24 +246,21 @@ Format: `unpackall /of INDEX` * It must be a positive integer that is more than 0, but no more than the number of items in the list. * An invalid `INDEX` will result in an error message. -
    Example of usage:
    +Example: -`unpackall /of 3` - -
    Expected outcome:
    - -BagPacker will mark all the quantities of the third item in the packing list as 'unpacked' - -``` -Item unpacked: [0/20] socks -``` +`unpackall /of 5` +* The packed quantity of the item at index 5 becomes 0. +* Expected outcome: + ``` + Item unpacked: [0/10] shirts + ``` ### Editing item quantity: `editquantity` Edits the total quantity of an item to be packed. Format: `editquantity QUANTITY /of INDEX` * `QUANTITY` is the new total quantity of that item to be packed. - * It must be a positive integer + * It must be a positive integer. * It must be more than 0, but not more than 1 million (1,000,000). * It must be at least the value of the current quantity packed. * An invalid `QUANTITY` will result in an error message. @@ -188,8 +268,14 @@ Format: `editquantity QUANTITY /of INDEX` * It must be a positive integer that is more than 0, but no more than the number of items in the list. * An invalid `INDEX` will result in an error message. -Examples of usage: -* `editquantity 200 /of 1` +Example: + +`editquantity 200 /of 1` +* Replaces the total quantity of the item at index `1` with `200`. +* Expected outcome: +``` +Item total quantity edited: [0/200] jackets +``` ### Listing all items: `list` @@ -199,18 +285,17 @@ Lists all the items in the packing list. Format: `list` * This command is not expecting any parameters. Any additional parameters will be ignored. -Examples of usage: -* `list` - -Example output: -``` -Here are the items in your list -1. [1000000/1000000] jackets -2. [0/5] water bottles -``` -List Format explanation: +Example: -`ITEM_INDEX. [CURRENTLY_PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME` +`list` and `list abc1123*#+` +* Both will give the same output - return a list of all the items in the packing list. +* Format explanation: `ITEM_INDEX. [CURRENTLY_PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME`. +* Expected outcome: + ``` + Here are the items in your list + 1. [1000000/1000000] jackets + 2. [0/5] water bottles + ``` ### Listing all unpacked items: `listunpacked` Lists all the items in the packing list that are not fully packed yet. @@ -220,20 +305,18 @@ Lists all the items in the packing list that are not fully packed yet. Format: `listunpacked` * This command is not expecting any parameters. Any additional parameters will be ignored. -Examples of usage: -* `listunpacked` -* `listunpacked 123` - -Example output: -``` -Here are the unpacked items in your list -1. [19317/1000000] jackets -2. [0/5] water bottles -``` -List Format explanation: - -`ITEM_INDEX. [CURRENTLY_PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME` +Example: +`listunpacked` and `listunpacked abc123*#+` +* Both will give the same output - return a list of unpacked items. +* Format explanation: `INDEX. [CURRENTLY_PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME` + * ❗ The `INDEX` here is not the `ITEM_INDEX` in the `list` command. `INDEX` is the number of the item in this list of unpacked items. +* Expected outcome: + ``` + Here are the unpacked items in your list + 1. [10/200] jackets + 2. [0/5] water bottles + ``` ### Deleting the entire list: `deletelist` Deletes the whole packing list. @@ -243,8 +326,14 @@ Deletes the whole packing list. Format: `deletelist` * This command is not expecting any parameters. Any additional parameters will be ignored. -Example of usage: -* `deletelist` +Example: + +`deletelist` and `deletelist abc123*#+` +* Both will give the same output - delete the entire packing list of items. +* Expected outcome: + ``` + Packing list deleted + ``` ### Finding an item: `find` Searches for item names that contain any part of the input keywords. @@ -252,18 +341,26 @@ Searches for item names that contain any part of the input keywords. Format: `find KEYWORDS` * `KEYWORDS` should contain a phrase that can be found in the names of at least one list item. * A `KEYWORD` that cannot be found in the names of at least one list item will result in an error message. - -Example of usage: -* `find shirt` - -### Help message: `help` -Displays a help message containing the command summary. - -Format: `help` -* This command is not expecting any parameters. Any additional parameters will be ignored. - -Examples of usage: -* `help` +* `KEYWORDS` is case-sensitive. + * E.g. `ipad` will not return `iPad`. +* The order of the words in `KEYWORDS` matters. + * E.g. `winter jacket` will not return `jacket winter`. +* `find` will only search the item names. +* `KEYWORDS` need not be complete words. + * E.g. `sh` will return `shirts`. +* Only item names that completely contain the input phrase will be returned. + * E.g. `ter sh` will return `winter shawl` and `winter shirt`. + +Example: + +`find shirt` +* The names of all the items in the packing list will be searched. +* Expected outcome: + ``` + There are 2 items(s) in your list containing shirt: + 1. [0/3] inner shirts + 2. [0/4] outer shirts + ``` ### Exiting the application: `bye` Exits BagPacker and saves the packing list. @@ -271,8 +368,21 @@ Exits BagPacker and saves the packing list. Format: `bye` * This command is not expecting any parameters. Any additional parameters will be ignored. -Examples of usage: -* `bye` +Example: +`bye` +* Exits BagPacker +* Expected outcome: + ``` + Bye thanks for using, + ____ _____ _ + | _ \ | __ \ | | + | |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ + | _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| + | |_) | (_| | (_| | | | (_| | (__| < __/ | + |____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ + ``` [⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [⏫ Go to Features](#span-stylecolor00a36c-table-of-contents-span) @@ -290,16 +400,20 @@ Examples of usage: ## Command Summary -| Action description | Syntax | Remarks | -|:-----------------------------------------|:----------------------------|:---------------------------------------------------------------------------------------------------------------------| -| Add an item | `add QUANTITY /of NAME` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000 | -| Delete an item | `delete INDEX` | `INDEX` must be a valid list index | -| Pack some of an item | `pack QUANTITY /of INDEX` | Adding `QUANTITY` should not cause the quantity to exceed the total quantity
    `INDEX` must be a valid list index | -| Marking total quantity of item as packed | `packall /of INDEX` | `INDEX` must be a valid list index | -| Unpack some item | `unpack QUANTITY /of INDEX` | Subtracting `QUANTITY` should not cause the quantity to be less than 0
    `INDEX` must be a valid list index | -| List all items | `list` | Additional parameters will be ignored | -| Delete the whole list | `deletelist` | Additional parameters will be ignored | -| Help message | `help` | Additional parameters will be ignored | -| Exit | `bye` | Additional parameters will be ignored | +| Action description | Syntax | Remarks | +|:---------------------------|:----------------------------------|:---------------------------------------------------------------------------------------------------------------------| +| Help | `help` | Additional parameters will be ignored | +| Adding a new item | `add QUANTITY /of NAME` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000 | +| Deleting an item | `delete INDEX` | `INDEX` must be a valid list index | +| Packing an item | `pack QUANTITY /of INDEX` | Adding `QUANTITY` should not cause the quantity to exceed the total quantity
    `INDEX` must be a valid list index | +| Packing all of an item | `packall /of INDEX` | `INDEX` must be a valid list index | +| Unpacking an item | `unpack QUANTITY /of INDEX` | Subtracting `QUANTITY` should not cause the quantity to be less than 0
    `INDEX` must be a valid list index | +| Unpacking all of an item | `unpackall /of INDEX` | `INDEX` must be a valid list index | +| Editing item quantity | `editquantity QUANTITY /of INDEX` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000
    `INDEX` must be a valid list index | +| Listing all items | `list` | Additional parameters will be ignored | +| Listing all unpacked items | `listunpacked` | Additional parameters will be ignored | +| Deleting the entire list | `deletelist` | Additional parameters will be ignored | +| Finding an item | `help` | Additional parameters will be ignored | +| Exiting the application | `bye` | Additional parameters will be ignored | [⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [⏫ Go to Features](#span-stylecolor00a36c-table-of-contents-span) \ No newline at end of file From d633157f48f2e0ff0696b6b7a05e609a7d222425 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Sun, 9 Apr 2023 21:45:19 +0800 Subject: [PATCH 153/207] Update the help message to match the order of the commands in the User Guide --- src/main/java/bagpacker/iohandler/Ui.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index 81fe6d1c15..d91d934db0 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -79,14 +79,14 @@ public static void helpMessage() { System.out.println("All Commands:"); System.out.println("1. " + AddCommand.HELP_MSG); System.out.println("2. " + DeleteCommand.HELP_MSG); - System.out.println("3. " + ListCommand.HELP_MSG); - System.out.println("4. " + PackCommand.HELP_MSG); + System.out.println("3. " + PackCommand.HELP_MSG); + System.out.println("4. " + PackAllCommand.HELP_MSG); System.out.println("5. " + UnpackCommand.HELP_MSG); - System.out.println("6. " + DeleteListCommand.HELP_MSG); - System.out.println("7. " + ListUnpackedCommand.HELP_MSG); - System.out.println("8. " + EditQuantityCommand.HELP_MSG); - System.out.println("9. " + PackAllCommand.HELP_MSG); - System.out.println("10. " + UnpackAllCommand.HELP_MSG); + System.out.println("6. " + UnpackAllCommand.HELP_MSG); + System.out.println("7. " + EditQuantityCommand.HELP_MSG); + System.out.println("8. " + ListCommand.HELP_MSG); + System.out.println("9. " + ListUnpackedCommand.HELP_MSG); + System.out.println("10. " + DeleteListCommand.HELP_MSG); System.out.println("11. " + FindCommand.HELP_MSG); System.out.println("12. " + ByeCommand.HELP_MSG); printLine(); From 0bae023d4e6bdfd11f205b70a597db74c22f79be Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Sun, 9 Apr 2023 21:45:40 +0800 Subject: [PATCH 154/207] Add assert statements --- src/main/java/bagpacker/commands/DeleteCommand.java | 2 ++ src/main/java/bagpacker/commands/EditQuantityCommand.java | 2 ++ src/main/java/bagpacker/commands/PackAllCommand.java | 2 +- src/main/java/bagpacker/commands/PackCommand.java | 4 ++-- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/bagpacker/commands/DeleteCommand.java b/src/main/java/bagpacker/commands/DeleteCommand.java index 93d71cd124..0508a181a1 100644 --- a/src/main/java/bagpacker/commands/DeleteCommand.java +++ b/src/main/java/bagpacker/commands/DeleteCommand.java @@ -21,6 +21,8 @@ public class DeleteCommand extends Command { */ public DeleteCommand(int targetIndex) { super(targetIndex); + assert (targetIndex >= 1 && targetIndex <= PackingList.getItemList().size()) : + "Delete Command Target Index is out of bounds"; } /** * Deletes a given item in the packing list by its packing list index, and prints a successfully deleted message diff --git a/src/main/java/bagpacker/commands/EditQuantityCommand.java b/src/main/java/bagpacker/commands/EditQuantityCommand.java index c3ee734de5..7d3c15fbf7 100644 --- a/src/main/java/bagpacker/commands/EditQuantityCommand.java +++ b/src/main/java/bagpacker/commands/EditQuantityCommand.java @@ -22,6 +22,8 @@ public class EditQuantityCommand extends Command{ public EditQuantityCommand(int newTotalQuantity, int targetIndex) { super(targetIndex); totalQuantity = newTotalQuantity; + assert (targetIndex >= 1 && targetIndex <= PackingList.getItemList().size()) : + "EditQuantity Command Target Index is out of bounds"; } /** * Changed the total quantity of an item and prints a successfully edited message when diff --git a/src/main/java/bagpacker/commands/PackAllCommand.java b/src/main/java/bagpacker/commands/PackAllCommand.java index 329e3e0ac3..6f5998bc13 100644 --- a/src/main/java/bagpacker/commands/PackAllCommand.java +++ b/src/main/java/bagpacker/commands/PackAllCommand.java @@ -22,7 +22,7 @@ public class PackAllCommand extends Command { public PackAllCommand(int targetIndex) { super(targetIndex); - assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : + assert (targetIndex >= 1 && targetIndex <= PackingList.getItemList().size()) : "Packall Command Target index is out of bounds"; } /** diff --git a/src/main/java/bagpacker/commands/PackCommand.java b/src/main/java/bagpacker/commands/PackCommand.java index 49fdce7236..cb0375261e 100644 --- a/src/main/java/bagpacker/commands/PackCommand.java +++ b/src/main/java/bagpacker/commands/PackCommand.java @@ -22,8 +22,8 @@ public class PackCommand extends Command { public PackCommand(int quantity, int targetIndex) { super(targetIndex); packQuantity = quantity; - assert (targetIndex >= 1 & targetIndex <= PackingList.getItemList().size()) : - "Pack Command Target index is out of bounds"; + assert (targetIndex >= 1 && targetIndex <= PackingList.getItemList().size()) : + "Pack Command Target Index is out of bounds"; } /** * Adds to the total packed quantity of an item in the packing list and prints a successfully packed message when From 5735b924032f2839402d7085cf87dc911e7bcf5b Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Sun, 9 Apr 2023 21:46:49 +0800 Subject: [PATCH 155/207] Add shannen's PPP --- docs/team/shannentan.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 docs/team/shannentan.md diff --git a/docs/team/shannentan.md b/docs/team/shannentan.md new file mode 100644 index 0000000000..2d6ff714c5 --- /dev/null +++ b/docs/team/shannentan.md @@ -0,0 +1,39 @@ +# Shannen Tan's Project Portfolio Page + +## Overview + +BagPacker is a desktop Command Line Interface (CLI) application used to manage a user's packing list. +It stores a packing list, edit the quantities packed and the total quantity packed of an item, and searches the packing list for items. +It is written in Java, and has about 3 kLoC. + +## Summary of Contributions +Given below are my contributions to the project. + +New Feature: `editquantity` + * What it does: allows the user to edit the total quantity of an item at the index specified + * Justification: this feature improves the product significantly as there was no way to reduce the total quantity of an item in teh packing list + * Repeated `add` commands can be used to increase the total quantity of an item, but not reduce it + * Highlights: users are able to edit the total quantity of an item to be packed, without having to delete the current item and add the item again + +Code contributed: [RepoSense link](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=shannentan&breakdown=true) + +Project management +* Created GitHub organisation for the team +* Set up GitHub team repository + +Enhancements to existing features +* Enhanced the `add`, `pack` and `unpack` commands to support multiple quantities + * Involved changing the `Item` constructor, and the respective methods used to parse inputs and execute the commands + + +Documentation +* User Guide + * Formatted the User Guide + * Added the tables of contents, links to different sections within the User Guide, and colours to the headers + * Added description of command, format, example usage and important notes to some commands + * `add`, `delete`, `pack`, `unpack`, `editquantity`, `list`, `deletelist` and `find` + * Added the command summary +* Developer Guide + +Community +* Reported bugs and gave suggestions to other teams in the class during [PE-D](https://github.com/shannentan/ped/issues) From 9c57b478707927e8dd6ca85f0fe939be1d17293f Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sun, 9 Apr 2023 22:58:19 +0800 Subject: [PATCH 156/207] Add Pack and Unpack Command into DG, including Sequence Diagrams --- docs/DeveloperGuide.md | 43 ++++++++++++++++++ .../CreatePackObjSequenceDiagram.puml | 22 +++++++++ .../ExecutePackCommandSequenceDiagram.png | Bin 0 -> 25220 bytes .../ExecutePackCommandSequenceDiagram.puml | 31 +++++++++++++ .../ExecuteUnpackCommandSequenceDiagram.png | Bin 0 -> 30725 bytes .../ExecuteUnpackCommandSequenceDiagram.puml | 31 +++++++++++++ 6 files changed, 127 insertions(+) create mode 100644 docs/umlDiagrams/CreatePackObjSequenceDiagram.puml create mode 100644 docs/umlDiagrams/ExecutePackCommandSequenceDiagram.png create mode 100644 docs/umlDiagrams/ExecutePackCommandSequenceDiagram.puml create mode 100644 docs/umlDiagrams/ExecuteUnpackCommandSequenceDiagram.png create mode 100644 docs/umlDiagrams/ExecuteUnpackCommandSequenceDiagram.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8690dbc4af..aea5bb45d7 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -88,6 +88,49 @@ Mechanism: ```DeleteCommand.execute()``` calls the ```PackingList.deleteItem()`` --- +#### Pack Command + +Pack command is used to pack a quantity of an item in the packing list. + +Create Mechanism: Creating of `PackCommand` object is done in `Parser.CreatePackObj()`, which should return a new `PackCommand` object if there are no exceptions caught. +The following conditions will cause an `IncorrectCommand` to be returned instead of a `PackCommand`, signalling an error has occurred. +1. Empty PackingList +2. `QuantityPacked` less than 1 OR greater than 1,000,000 OR greater than the item's unpacked quantity +3. Item index not a positive integer at most the size of the Packing List + +This new command created (either `PackCommand` OR `IncorrectCommand`) will then be executed by `BagPacker()`. + +Execute Mechanism: ```PackCommand.execute()``` calls the ```PackCommand.getTargetItem()``` method to retrieve the target item to pack. +After which the ```PackingList.PackItem(item, packQuantity)``` method is called in ```PackingList``` which calls ```Item.setPacked(packQuantity)```in `Item` class. `Item.setPacked()` will add the `packedQuantity` to the current pack quantity of the item `toPack`. +Lastly `Ui.printToUser(MSG_SUCCESS_PACK, item)` from `Ui` class is called to print a message to the user signifying that the pack command has been executed successfully. + +![ExecutePackCommandSequenceDiagram.png](umlDiagrams%2FExecutePackCommandSequenceDiagram.png) + +Sequence Diagram of Successful `PackCommand.execute()` + +--- + +#### Unpack Command + +Unpack command is used to unpack a quantity of an item in the packing list. + +Create Mechanism: Creating of `UnpackCommand` object is done in `Parser.CreateUnpackObj()`, which should return a new `UnpackCommand` object if there are no exceptions caught. +The following conditions will cause an `IncorrectCommand` to be returned instead of a `PackCommand`, signalling an error has occurred. +1. Empty PackingList +2. `QuantityUnpacked` less than 1 OR greater than 1,000,000 OR greater than the item's packed quantity +3. Item index not a positive integer at most the size of the Packing List + +This new command created (either `UnpackCommand` OR `IncorrectCommand`) will then be executed by `BagPacker()`. + +Execute Mechanism: ```UnpackCommand.execute()``` calls the ```UnpackCommand.getTargetItem()``` method to retrieve the target item to pack. +After which the ```PackingList.UnpackItem(item, quantity)``` method is called in ```PackingList``` which calls ```Item.setUnpacked(quantity)```in `Item` class. `Item.setUnpacked()` will remove the `quantity` from the current pack quantity of the item. +Lastly `Ui.printToUser(MSG_SUCCESS_UNPACK, item)` from `Ui` class is called to print a message to the user signifying that the unpack command has been executed successfully. + +![ExecuteUnpackCommandSequenceDiagram.png](umlDiagrams%2FExecuteUnpackCommandSequenceDiagram.png) + +Sequence Diagram of Successful `UnpackCommand.execute()` + +--- #### Help Command Help command is used to display all the possible commands in the BagPacker application for the user. diff --git a/docs/umlDiagrams/CreatePackObjSequenceDiagram.puml b/docs/umlDiagrams/CreatePackObjSequenceDiagram.puml new file mode 100644 index 0000000000..bd0d7f4707 --- /dev/null +++ b/docs/umlDiagrams/CreatePackObjSequenceDiagram.puml @@ -0,0 +1,22 @@ +@startuml +'https://plantuml.com/sequence-diagram + +autonumber + +@startuml +note right #MediumSeaGreen +All details in green activation +bars omitted as it depends +on the type of command input +end note +":Parser" -> ":Parser" : createPackObj() +activate ":Parser" +Create ":PackCommand" +":Parser" -> ":PackCommand" : Parser.parse() +activate ":PackCommand" #MediumSpringGreen +":PackCommand" -> ":PackCommand" : getTargetItem() +activate ":PackCommand" #DarkGreen +":PackCommand" --> ":PackCommand" : item +deactivate ":PackCommand" +deactivate ":PackCommand" +@enduml \ No newline at end of file diff --git a/docs/umlDiagrams/ExecutePackCommandSequenceDiagram.png b/docs/umlDiagrams/ExecutePackCommandSequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..42349c1f87ddb2a8f977c8ddd287d0383766db7c GIT binary patch literal 25220 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 literal 0 HcmV?d00001 diff --git a/docs/umlDiagrams/ExecutePackCommandSequenceDiagram.puml b/docs/umlDiagrams/ExecutePackCommandSequenceDiagram.puml new file mode 100644 index 0000000000..9c6962d71e --- /dev/null +++ b/docs/umlDiagrams/ExecutePackCommandSequenceDiagram.puml @@ -0,0 +1,31 @@ +@startuml +'https://plantuml.com/sequence-diagram + +autonumber + +@startuml +":BagPacker" -> ":PackCommand": currentCommand\n.execute() +activate ":PackCommand" #MediumSpringGreen +note left +currentCommand is retrieved +from Parser.Parse() +end note +":PackCommand" -> ":PackCommand" : getTargetItem() +activate ":PackCommand" #DarkGreen +":PackCommand" --> ":PackCommand" : item +deactivate ":PackCommand" +":PackCommand" -> "packingList:\nPackingList" : packingList\n.packItem(item, packQuantity) +activate "packingList:\nPackingList" #ForestGreen +"packingList:\nPackingList" -> "toPack:Item" : toPack.setPacked\n(packQuantity) +activate "toPack:Item" #MediumSeaGreen +"toPack:Item" --> "packingList:\nPackingList" +deactivate "toPack:Item" +":PackCommand" <-- "packingList:\nPackingList" +deactivate "packingList:\nPackingList" +":PackCommand" -> ":Ui" : Ui.printToUser(MSG_SUCCESS_PACK, item) +activate ":Ui" #ForestGreen +":PackCommand" <-- ":Ui" +deactivate ":Ui" +":BagPacker" <-- ":PackCommand": PackCommand is \ndone executing +deactivate ":PackCommand" +@enduml \ No newline at end of file diff --git a/docs/umlDiagrams/ExecuteUnpackCommandSequenceDiagram.png b/docs/umlDiagrams/ExecuteUnpackCommandSequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..717c77792f295ac6706f3a63b94e72db01a7da2a GIT binary patch literal 30725 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 literal 0 HcmV?d00001 diff --git a/docs/umlDiagrams/ExecuteUnpackCommandSequenceDiagram.puml b/docs/umlDiagrams/ExecuteUnpackCommandSequenceDiagram.puml new file mode 100644 index 0000000000..fc118411a7 --- /dev/null +++ b/docs/umlDiagrams/ExecuteUnpackCommandSequenceDiagram.puml @@ -0,0 +1,31 @@ +@startuml +'https://plantuml.com/sequence-diagram + +autonumber + +@startuml +":BagPacker" -> ":UnpackCommand": currentCommand\n.execute() +note left +currentCommand is retrieved +from Parser.Parse() +end note +activate ":UnpackCommand" #MediumSpringGreen +":UnpackCommand" -> ":UnpackCommand" : getTargetItem() +activate ":UnpackCommand" #DarkGreen +":UnpackCommand" --> ":UnpackCommand" : item +deactivate ":UnpackCommand" +":UnpackCommand" -> "packingList:\nPackingList" : packingList\n.unpackItem(item, quantity) +activate "packingList:\nPackingList" #ForestGreen +"packingList:\nPackingList" -> ":Item" : item.setUnpacked\n(quantity) +activate ":Item" #MediumSeaGreen +":Item" --> "packingList:\nPackingList" +deactivate ":Item" +":UnpackCommand" <-- "packingList:\nPackingList" +deactivate "packingList:\nPackingList" +":UnpackCommand" -> ":Ui" : Ui.printToUser(MSG_SUCCESS_UNPACK, item) +activate ":Ui" #ForestGreen +":UnpackCommand" <-- ":Ui" +deactivate ":Ui" +":BagPacker" <-- ":UnpackCommand": UnpackCommand is \ndone executing +deactivate ":UnpackCommand" +@enduml \ No newline at end of file From 4c99a75a9b65e0e4d12f87fd0bb921781184286b Mon Sep 17 00:00:00 2001 From: linuspuah Date: Sun, 9 Apr 2023 23:09:38 +0800 Subject: [PATCH 157/207] Update Contents page --- docs/DeveloperGuide.md | 18 +++++++-------- .../bagpacker/iohandlertest/ParserTest.java | 23 +++++++++---------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index aea5bb45d7..8d3d6f328f 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -9,20 +9,20 @@ This project is based on the AddressBook-Level3 project created by the SE-EDU in #### BagPacker Class is the main entry point for the BagPacker Program, below are the Packages and every class contained within each Package 1. commands - Command - - AddCommand - - ByeCommand - - DeleteCommand - - DeleteListCommand + - [AddCommand](#add-command) + - [ByeCommand](#bye-command) + - [DeleteCommand](#delete-command) + - [DeleteListCommand](#deletelist-command) - EditQuantityCommand - FindCommand - - HelpCommand + - [HelpCommand](#help-command) - IncorrectCommand - - ListCommand - - ListUnpackedCommand + - [ListCommand](#list-command) + - [ListUnpackedCommand](#list-unpacked-command) - PackAllCommand - - PackCommand + - [PackCommand](#pack-command) - UnpackAllCommand - - UnpackCommand + - [UnpackCommand](#unpack-command) 2. exception - EmptyInputException - InvalidIndexException diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index 2f1a95bc88..44e6bf5473 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -13,7 +13,6 @@ import bagpacker.commands.PackCommand; import bagpacker.commands.UnpackAllCommand; import bagpacker.commands.UnpackCommand; -import bagpacker.exception.EmptyInputException; import bagpacker.iohandler.Parser; import bagpacker.packingfunc.PackingList; import org.junit.jupiter.api.Test; @@ -24,7 +23,6 @@ import java.io.PrintStream; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; /** * ParserTest to test Parser Class @@ -49,7 +47,7 @@ public void fullInputTest() { } @Test - public void createAddObjTest_Successful() { + public void createAddObjTest_successful() { PackingList dummyPackingList = new PackingList(); String userInput = " add 500 /of this item "; InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); @@ -60,7 +58,7 @@ public void createAddObjTest_Successful() { } @Test - public void createAddObjTest_NoItemName() { + public void createAddObjTest_noItemName() { PackingList dummyPackingList = new PackingList(); String userInput = " add 500 /of "; InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); @@ -70,7 +68,7 @@ public void createAddObjTest_NoItemName() { delList.execute(dummyPackingList); } @Test - public void createAddObjTest_RepeatItem() { + public void createAddObjTest_repeatItem() { PackingList dummyPackingList = new PackingList(); String userInput = " add 500 /of something "; InputStream inStream = new ByteArrayInputStream(userInput.getBytes()); @@ -92,7 +90,8 @@ public void emptyInputTest() { PackingList dummyPackingList = new PackingList(); Parser.parse().execute(dummyPackingList); assert(outputStreamCaptor.toString().trim().contains("Empty input received") - & outputStreamCaptor.toString().trim().contains("try to input a command, to view all commands input 'help'")); + & outputStreamCaptor.toString().trim().contains("try to input a command, " + + "to view all commands input 'help'")); tearDown(); } @@ -127,7 +126,7 @@ public void createPackObjTest() { } @Test - public void createUnpackObjTest_Successful() { + public void createUnpackObjTest_successful() { String userInput1 = " add 3 /of this item "; String userInput2 = " pack 2 /of 1"; String userInput3 = " Unpack 1 /of 1"; @@ -149,7 +148,7 @@ public void createUnpackObjTest_Successful() { } @Test - public void createUnpackObjTest_InvalidItemQuantity() { + public void createUnpackObjTest_invalidItemQuantity() { String userInput1 = " add 3 /of this item "; String userInput2 = " pack 2 /of 1"; String userInput3 = " Unpack 10 /of 1"; @@ -194,7 +193,7 @@ public void createPackAllObjTest() { } @Test - public void createUnpackAllObjTest_Successful() { + public void createUnpackAllObjTest_successful() { String userInput1 = " add 2468 /of this item "; String userInput2 = " unpackall /of 1 "; InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); @@ -208,7 +207,7 @@ public void createUnpackAllObjTest_Successful() { delList.execute(dummyPackingList); } @Test - public void createUnpackAllObjTest_InvalidIndex() { + public void createUnpackAllObjTest_invalidIndex() { String userInput1 = " add 2468 /of this item "; String userInput2 = " unpackall /of 1000 "; InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); @@ -275,7 +274,7 @@ public void createListUnpackedObjTest() { } @Test - public void createFindObjTest_Successful() { + public void createFindObjTest_successful() { String userInput1 = " add 123 /of this item "; String userInput2 = " find item "; PackingList dummyPackingList = new PackingList(); @@ -289,7 +288,7 @@ public void createFindObjTest_Successful() { delList.execute(dummyPackingList); } @Test - public void createFindObjTest_EmptyKeyword() { + public void createFindObjTest_emptyKeyword() { String userInput1 = " add 123 /of this item "; String userInput2 = " find "; PackingList dummyPackingList = new PackingList(); From ae4fd89a2606c7311ed48242c4c86f02f3984b8e Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Sun, 9 Apr 2023 23:39:51 +0800 Subject: [PATCH 158/207] Fix expected outcome code block not displayed correctly for help, list, listunpacked and find Fix second example input not indented correctly for add and delete --- docs/UserGuide.md | 73 +++++++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index f1dadeb602..8d14f66849 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -8,8 +8,8 @@ is unpacked and travel with an ease of mind. --- ## Table of contents -* [Quick Start](#span-stylecolor00a36c-quick-start-span) -* [Features](#span-stylecolor00a36c-features-span) +* [Quick Start](#quick-start) +* [Features](https://ay2223s2-cs2113-t14-2.github.io/tp/UserGuide.html#features) * [Help message](#span-stylecolor6495ed-help-message--span-help) * [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) * [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) @@ -39,7 +39,8 @@ is unpacked and travel with an ease of mind. * For Windows users: search for Command Prompt, and launch it. * For macOS users: search for Terminal, and launch it. 5. Execute the following command `java -jar BagPacker.jar` to run BagPacker. BagPacker should start up, and the following message will be displayed. - ``` + + ``` Hi this is, ____ _____ _ | _ \ | __ \ | | @@ -55,6 +56,7 @@ is unpacked and travel with an ease of mind. ________________________________________________________________________________________________________________________ Welcome back, User! ``` + 6. Type a command, and press Enter to execute it. To start off, typing `help` and pressing Enter will display a help message. @@ -85,39 +87,40 @@ Example: `help` * Expected outcome: + ``` All Commands: 1. add: Adds quantity and name of item to the packing list. - Example: add 3 /of toothbrush - Meaning: Add quantity of 3 toothbrushes to the packing list + Example: add 3 /of toothbrush + Meaning: Add quantity of 3 toothbrushes to the packing list 2. delete: Deletes an item from the packing list. - Example: delete 1 - Meaning: Removes the first item in the packing list + Example: delete 1 + Meaning: Removes the first item in the packing list 3. pack: Adds to the current quantity of items packed in the packing list. - Example: pack 2 /of 3 - Meaning: Packs 2 more quantities of the third item in the packing list + Example: pack 2 /of 3 + Meaning: Packs 2 more quantities of the third item in the packing list 4. packall: Fully pack an item of choice from the packing list. - Example: packall /of 3 - Meaning: Set the third item in the packing list as fully packed + Example: packall /of 3 + Meaning: Set the third item in the packing list as fully packed 5. unpack: Deducts from the current quantity of items packed in the packing list. - Example: unpack 1 /of 2 - Meaning: Unpacks 1 quantity of the second item in the packing list + Example: unpack 1 /of 2 + Meaning: Unpacks 1 quantity of the second item in the packing list 6. unpackall: Fully unpacks an item of choice from the packing list. - Example: unpackall /of 3 - Meaning: Set the third item in the packing list as totally not packed yet + Example: unpackall /of 3 + Meaning: Set the third item in the packing list as totally not packed yet 7. editquantity: Edit the total quantity of an item to be packed. - Example: editquantity 3 /of 2 - Meaning: Change the total quantity of the second item to 3 + Example: editquantity 3 /of 2 + Meaning: Change the total quantity of the second item to 3 8. list: List all items and their total quantities packed in packing list. - Example: list + Example: list 9. listunpacked: List all items and their total quantities if they are not fully packed yet. - Example: listunpacked + Example: listunpacked 10. deletelist: Deletes all items in the packing list. - Example: deletelist + Example: deletelist 11. find: Displays all items in the packingList as a list that contains the keyword used in the command. - Example: find jacket + Example: find jacket 12. bye: Stops the BagPacker Application - Example: bye + Example: bye ``` ### Adding a new item: `add` @@ -138,13 +141,16 @@ Examples: `add 3 /of jackets` * Adds an item of name `jackets` with a total quantity of `3`. * Expected outcome: + ``` New item added: [0/3] jackets ``` + `add 2 /of water bottles` and `add 3 /of water bottles` * Adds an item of name `water botles` with a total quantity of `2`. * Adds `3` to the total quantity of the index of the item `water bottles`. * Expected outcome: + ``` New item added: [0/2] water bottles ``` @@ -167,15 +173,10 @@ Examples: `delete 2` * Deletes the item at index `2` from the packing list. * Expected outcome: + ``` [0/2] water bottles removed from the list ``` -`deletes 100` -* Deletes the item at index `100` from the packing list. -* Expected outcome: - ``` - [12/20] pens removed from the list - ``` ### Packing an item: `pack` Packs the given amount of that item in the packing list. @@ -194,6 +195,7 @@ Example: `pack 2 /of 1` * Adds `3` to the packed quantity of the item at index `1` in the packing list. * Expected outcome: + ``` Item packed: [2/3] jackets ``` @@ -212,6 +214,7 @@ Example: `packall /of 3` * The packed quantity of the item at index `3` becomes its total quantity. * Expected outcome: + ``` Item packed: [20/20] socks ``` @@ -233,6 +236,7 @@ Example: `unpack 2 /of 5` * Subtracts `2` from the packed quantity of the item at index `5` in the packing list. * Expected outcome: + ``` Item unpacked: [2/10] shirts ``` @@ -251,6 +255,7 @@ Example: `unpackall /of 5` * The packed quantity of the item at index 5 becomes 0. * Expected outcome: + ``` Item unpacked: [0/10] shirts ``` @@ -273,9 +278,10 @@ Example: `editquantity 200 /of 1` * Replaces the total quantity of the item at index `1` with `200`. * Expected outcome: -``` -Item total quantity edited: [0/200] jackets -``` + + ``` + Item total quantity edited: [0/200] jackets + ``` ### Listing all items: `list` @@ -291,6 +297,7 @@ Example: * Both will give the same output - return a list of all the items in the packing list. * Format explanation: `ITEM_INDEX. [CURRENTLY_PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME`. * Expected outcome: + ``` Here are the items in your list 1. [1000000/1000000] jackets @@ -312,6 +319,7 @@ Example: * Format explanation: `INDEX. [CURRENTLY_PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME` * ❗ The `INDEX` here is not the `ITEM_INDEX` in the `list` command. `INDEX` is the number of the item in this list of unpacked items. * Expected outcome: + ``` Here are the unpacked items in your list 1. [10/200] jackets @@ -331,6 +339,7 @@ Example: `deletelist` and `deletelist abc123*#+` * Both will give the same output - delete the entire packing list of items. * Expected outcome: + ``` Packing list deleted ``` @@ -356,6 +365,7 @@ Example: `find shirt` * The names of all the items in the packing list will be searched. * Expected outcome: + ``` There are 2 items(s) in your list containing shirt: 1. [0/3] inner shirts @@ -372,6 +382,7 @@ Example: `bye` * Exits BagPacker * Expected outcome: + ``` Bye thanks for using, ____ _____ _ From ecc01b0bbc362bc699ace32b1cfa9af939b767d1 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Sun, 9 Apr 2023 23:55:22 +0800 Subject: [PATCH 159/207] Fix User Guide bugs Resolve GitHub issues #175 --- docs/UserGuide.md | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 8d14f66849..052a9ef600 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -9,22 +9,22 @@ is unpacked and travel with an ease of mind. ## Table of contents * [Quick Start](#quick-start) -* [Features](https://ay2223s2-cs2113-t14-2.github.io/tp/UserGuide.html#features) - * [Help message](#span-stylecolor6495ed-help-message--span-help) - * [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) - * [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) - * [Packing an item](#span-stylecolor6495ed-packing-an-item--span-pack) - * [Packing all of an item](#span-stylecolor6495ed-packing-all-of-an-item--span-packall) - * [Unpacking an item](#span-stylecolor6495ed-unpacking-an-item--span-unpack) - * [Unpacking all of an item](#span-stylecolor6495ed-unpacking-all-of-an-item--span-unpackall) - * [Editing item quantity](#span-stylecolor6495ed-editing-item-quantity--span-editquantity) - * [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) - * [Listing all unpacked items](#span-stylecolor6495ed-listing-all-unpacked-items--span-listunpacked) - * [Deleting the entire list](#span-stylecolor6495ed-deleting-the-entire-list--span-deletelist) - * [Finding an item](#span-stylecolor6495ed-finding-an-item--span-find) - * [Exiting the application](#span-stylecolor6495ed-exiting-the-application--span-bye) -* [Frequently Asked Questions (FAQ)](#span-stylecolor00a36c-frequently-asked-questions--faq--span) -* [Command Summary](#span-stylecolor00a36c-command-summary-span) +* [Features](#features) + * [Help message](#help-message-help) + * [Adding a new item](#adding-a-new-item-add) + * [Deleting an item](#deleting-an-item-delete) + * [Packing an item](#packing-an-item-pack) + * [Packing all of an item](#packing-all-of-an-item-packall) + * [Unpacking an item](#unpacking-an-item-unpack) + * [Unpacking all of an item](#unpacking-all-of-an-item-unpackall) + * [Editing item quantity](#editing-item-quantity-editquantity) + * [Listing all items](#listing-all-items-list) + * [Listing all unpacked items](#listing-all-unpacked-items-listunpacked) + * [Deleting the entire list](#deleting-the-entire-list-deletelist) + * [Finding an item](#finding-an-item-find) + * [Exiting the application](#exiting-the-application-bye) +* [Frequently Asked Questions (FAQ)](#frequently-asked-questions-faq) +* [Command Summary](#command-summary) --- @@ -60,7 +60,7 @@ is unpacked and travel with an ease of mind. 6. Type a command, and press Enter to execute it. To start off, typing `help` and pressing Enter will display a help message. -7. Refer to the [Features section](#span-stylecolor00a36c-features-span) below for details of each command. +7. Refer to the [Features section](#features) below for details of each command. --- @@ -395,7 +395,7 @@ Example: |___/ ``` -[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [⏫ Go to Features](#span-stylecolor00a36c-table-of-contents-span) +[⏫ Go to Table of Contents](#table-of-contents) | [⏫ Go to Features](#features) --- @@ -405,7 +405,7 @@ Example: **A**: Please check that there are no typos in the command. To check the correct spelling of the commands, please type `help` and hit enter. -[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | +[⏫ Go to Table of Contents](#table-of-contents) | --- @@ -427,4 +427,4 @@ Example: | Finding an item | `help` | Additional parameters will be ignored | | Exiting the application | `bye` | Additional parameters will be ignored | -[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [⏫ Go to Features](#span-stylecolor00a36c-table-of-contents-span) \ No newline at end of file +[⏫ Go to Table of Contents](#table-of-contents) | [⏫ Go to Features](#features) \ No newline at end of file From 63cdb17848618735b5115c2f40c2837b3c13a141 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 00:29:14 +0800 Subject: [PATCH 160/207] Revert "Fix User Guide bugs" This reverts commit ecc01b0bbc362bc699ace32b1cfa9af939b767d1. --- docs/UserGuide.md | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 052a9ef600..8d14f66849 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -9,22 +9,22 @@ is unpacked and travel with an ease of mind. ## Table of contents * [Quick Start](#quick-start) -* [Features](#features) - * [Help message](#help-message-help) - * [Adding a new item](#adding-a-new-item-add) - * [Deleting an item](#deleting-an-item-delete) - * [Packing an item](#packing-an-item-pack) - * [Packing all of an item](#packing-all-of-an-item-packall) - * [Unpacking an item](#unpacking-an-item-unpack) - * [Unpacking all of an item](#unpacking-all-of-an-item-unpackall) - * [Editing item quantity](#editing-item-quantity-editquantity) - * [Listing all items](#listing-all-items-list) - * [Listing all unpacked items](#listing-all-unpacked-items-listunpacked) - * [Deleting the entire list](#deleting-the-entire-list-deletelist) - * [Finding an item](#finding-an-item-find) - * [Exiting the application](#exiting-the-application-bye) -* [Frequently Asked Questions (FAQ)](#frequently-asked-questions-faq) -* [Command Summary](#command-summary) +* [Features](https://ay2223s2-cs2113-t14-2.github.io/tp/UserGuide.html#features) + * [Help message](#span-stylecolor6495ed-help-message--span-help) + * [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) + * [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) + * [Packing an item](#span-stylecolor6495ed-packing-an-item--span-pack) + * [Packing all of an item](#span-stylecolor6495ed-packing-all-of-an-item--span-packall) + * [Unpacking an item](#span-stylecolor6495ed-unpacking-an-item--span-unpack) + * [Unpacking all of an item](#span-stylecolor6495ed-unpacking-all-of-an-item--span-unpackall) + * [Editing item quantity](#span-stylecolor6495ed-editing-item-quantity--span-editquantity) + * [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) + * [Listing all unpacked items](#span-stylecolor6495ed-listing-all-unpacked-items--span-listunpacked) + * [Deleting the entire list](#span-stylecolor6495ed-deleting-the-entire-list--span-deletelist) + * [Finding an item](#span-stylecolor6495ed-finding-an-item--span-find) + * [Exiting the application](#span-stylecolor6495ed-exiting-the-application--span-bye) +* [Frequently Asked Questions (FAQ)](#span-stylecolor00a36c-frequently-asked-questions--faq--span) +* [Command Summary](#span-stylecolor00a36c-command-summary-span) --- @@ -60,7 +60,7 @@ is unpacked and travel with an ease of mind. 6. Type a command, and press Enter to execute it. To start off, typing `help` and pressing Enter will display a help message. -7. Refer to the [Features section](#features) below for details of each command. +7. Refer to the [Features section](#span-stylecolor00a36c-features-span) below for details of each command. --- @@ -395,7 +395,7 @@ Example: |___/ ``` -[⏫ Go to Table of Contents](#table-of-contents) | [⏫ Go to Features](#features) +[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [⏫ Go to Features](#span-stylecolor00a36c-table-of-contents-span) --- @@ -405,7 +405,7 @@ Example: **A**: Please check that there are no typos in the command. To check the correct spelling of the commands, please type `help` and hit enter. -[⏫ Go to Table of Contents](#table-of-contents) | +[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | --- @@ -427,4 +427,4 @@ Example: | Finding an item | `help` | Additional parameters will be ignored | | Exiting the application | `bye` | Additional parameters will be ignored | -[⏫ Go to Table of Contents](#table-of-contents) | [⏫ Go to Features](#features) \ No newline at end of file +[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [⏫ Go to Features](#span-stylecolor00a36c-table-of-contents-span) \ No newline at end of file From 31a2ff2b5bacb8b39ffb48bc64e2de43811c6cf0 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 01:15:18 +0800 Subject: [PATCH 161/207] Update DG to include Exceptions, and UML diagram for overall command mechanism --- docs/DeveloperGuide.md | 87 +++++++++++++++++-- src/main/java/bagpacker/iohandler/Parser.java | 1 + 2 files changed, 79 insertions(+), 9 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8d3d6f328f..c36e656c91 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -7,7 +7,7 @@ This project is based on the AddressBook-Level3 project created by the SE-EDU in ## Design & implementation #### BagPacker Class is the main entry point for the BagPacker Program, below are the Packages and every class contained within each Package -1. commands +1. [commands](#bagpacker-command-mechanisms-) - Command - [AddCommand](#add-command) - [ByeCommand](#bye-command) @@ -23,10 +23,11 @@ This project is based on the AddressBook-Level3 project created by the SE-EDU in - [PackCommand](#pack-command) - UnpackAllCommand - [UnpackCommand](#unpack-command) -2. exception - - EmptyInputException - - InvalidIndexException - - InvalidVariablesException +2. [exception](#exceptions) + - [EmptyInputException](#emptyinputexception) + - [InvalidIndexException](#invalidindexexception) + - [InvalidQuantityException](#invalidquantityexception) + - [InvalidVariablesException](#invalidvariablesexception) 3. iohandler - Parser - Storage @@ -40,13 +41,17 @@ The class diagram below shows the overall structure of BagPacker application, ma ![BagPackerClassDiagram.png](umlDiagrams%2FBagPackerClassDiagram.png) ![ExceptionClassDiagram.png](umlDiagrams%2FExceptionClassDiagram.png) -### Command Mechanisms: +### BagPacker Command Mechanisms: For all valid commands, the mechanism of implementation are as follows: -1. Read input - ```runBagPacker()``` method in ```BagPacker``` calls the ```Parser``` class to read user input command -2. Create command object - The ```Parser``` class creates a corresponding command object of the relevant command -3. Execute command object - ```runBagPacker()``` method executes the ```.execute()``` method (overridden by child classes) of the command object +1. If `ByeCommand.isBagPackerRunning` is true, keep looping through steps 2-4 +2. Read input - ```runBagPacker()``` method in ```BagPacker``` calls the ```Parser``` class to read user input command using `Parser.parse()` +3. Create command object - The ```Parser``` class creates a corresponding command object of the relevant command (child class of the Command Class) +4. Execute command object - ```runBagPacker()``` method executes the ```.execute()``` method (overridden by child classes) of the command object which runs the actual command function +Below shows a sequence diagram of the above explanation + +![BagPackerSequenceDiagram.png](umlDiagrams%2FBagPackerSequenceDiagram.png) --- #### Add Command @@ -257,6 +262,70 @@ Mechanism: ```ByeCommand.execute()``` updates the static boolean ```isBagPackerR The ```runBagPacker()``` method will continually parse and execute relevant commands (refer to Command Mechanisms in DG) until ```isBagPackerRunning == false``` which occurs upon the execution of the ```byeCommand```. +--- + +### Exceptions +The `exceptions` package contains all exceptions within BagPacker that are thrown when an error is detected. This is done to allow the program +to continue running and to elegantly handle any potential app stopping errors. +--- +#### EmptyInputException +The `EmptyInputException` is thrown when the user input is empty or is composed of whitespace characters only. + +Thrown by: +1. `Parser.readLine()` + +Caught in: +1. `Parser.parse()` + +--- +#### InvalidIndexException +The `InvalidIndexException` is thrown when the user inputs an item index that is out of bounds of the `PackingList` or greater than 1,000,000 + +Thrown by: +1. `Parser.getItemIndex()` +2. `Parser.getPackVariables()` +3. `Parser.getPackAllIndex()` + +Thrown and caught in: +1. `Parser.createDeleteObj()` +2. `Parser.createPackObj()` +3. `Parser.createEditQuantityObj()` +4. `Parser.createPackAllObj()` +5. `Parser.createUnpackObj()` + +--- +#### InvalidQuantityException +The `InvalidQuantityException` is thrown when the user inputs a quantity of an item that is invalid. This differs depending on the respective Command. + +Invalid Quantity definition: +1. For all cases, when input quantity is less than 1 or more than 1,000,000 +2. For `add` command, when new total quantity of item will exceed 1,000,000 +3. For `pack` command, when input pack quantity is greater than the item's unpacked quantity +4. For `unpack` command, when input unpack quantity is greater than the item's packed quantity +5. For `editquantity` command, when new total quantity (input) is less than the item's packed quantity + +Thrown and caught in: +1. `Parser.createAddObj()` +2. `Parser.createPackObj()` +3. `Parser.createEditQuantityObj()` +4. `Parser.createUnpackObj()` + +--- +#### InvalidVariablesException +The `InvalidVariablesException` is thrown when the user inputs the wrong number of variables for commands with input variables (i.e. excluding `help`, `list`, `bye`, `deletelist` and `listunpacked` commands) + +Thrown by: +1. `Parser.getKeyword()` +2. `Parser.getAddVariables` +3. `Parser.getItemIndex()` +4. `Parser.getPackVariables()` +5. `Parser.getPackAllIndex()` +6. `Parser.getEditQuantityVariables()` + +Caught by: +all createCommandObj methods except for commands without input variables (i.e. excluding `help`, `list`, `bye`, `deletelist` and `listunpacked` commands) + +--- ## Product scope ### Target user profile diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index cdbfe30921..2388dcd58f 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -397,6 +397,7 @@ public static String[] getPackVariables() throws InvalidIndexException, InvalidV * * @return itemIndex of the item to set as fully packed * @throws InvalidIndexException if item index is not valid + * @throws InvalidVariablesException invalid number of variables */ public static int getPackAllIndex() throws InvalidIndexException, InvalidVariablesException { try { From 8b7e483a3a5235067603083918e7b91a79f1fad5 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 01:17:16 +0800 Subject: [PATCH 162/207] Fix User Guide bugs Resolve GitHub issues #175 --- docs/UserGuide.md | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 8d14f66849..052a9ef600 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -9,22 +9,22 @@ is unpacked and travel with an ease of mind. ## Table of contents * [Quick Start](#quick-start) -* [Features](https://ay2223s2-cs2113-t14-2.github.io/tp/UserGuide.html#features) - * [Help message](#span-stylecolor6495ed-help-message--span-help) - * [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) - * [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) - * [Packing an item](#span-stylecolor6495ed-packing-an-item--span-pack) - * [Packing all of an item](#span-stylecolor6495ed-packing-all-of-an-item--span-packall) - * [Unpacking an item](#span-stylecolor6495ed-unpacking-an-item--span-unpack) - * [Unpacking all of an item](#span-stylecolor6495ed-unpacking-all-of-an-item--span-unpackall) - * [Editing item quantity](#span-stylecolor6495ed-editing-item-quantity--span-editquantity) - * [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) - * [Listing all unpacked items](#span-stylecolor6495ed-listing-all-unpacked-items--span-listunpacked) - * [Deleting the entire list](#span-stylecolor6495ed-deleting-the-entire-list--span-deletelist) - * [Finding an item](#span-stylecolor6495ed-finding-an-item--span-find) - * [Exiting the application](#span-stylecolor6495ed-exiting-the-application--span-bye) -* [Frequently Asked Questions (FAQ)](#span-stylecolor00a36c-frequently-asked-questions--faq--span) -* [Command Summary](#span-stylecolor00a36c-command-summary-span) +* [Features](#features) + * [Help message](#help-message-help) + * [Adding a new item](#adding-a-new-item-add) + * [Deleting an item](#deleting-an-item-delete) + * [Packing an item](#packing-an-item-pack) + * [Packing all of an item](#packing-all-of-an-item-packall) + * [Unpacking an item](#unpacking-an-item-unpack) + * [Unpacking all of an item](#unpacking-all-of-an-item-unpackall) + * [Editing item quantity](#editing-item-quantity-editquantity) + * [Listing all items](#listing-all-items-list) + * [Listing all unpacked items](#listing-all-unpacked-items-listunpacked) + * [Deleting the entire list](#deleting-the-entire-list-deletelist) + * [Finding an item](#finding-an-item-find) + * [Exiting the application](#exiting-the-application-bye) +* [Frequently Asked Questions (FAQ)](#frequently-asked-questions-faq) +* [Command Summary](#command-summary) --- @@ -60,7 +60,7 @@ is unpacked and travel with an ease of mind. 6. Type a command, and press Enter to execute it. To start off, typing `help` and pressing Enter will display a help message. -7. Refer to the [Features section](#span-stylecolor00a36c-features-span) below for details of each command. +7. Refer to the [Features section](#features) below for details of each command. --- @@ -395,7 +395,7 @@ Example: |___/ ``` -[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [⏫ Go to Features](#span-stylecolor00a36c-table-of-contents-span) +[⏫ Go to Table of Contents](#table-of-contents) | [⏫ Go to Features](#features) --- @@ -405,7 +405,7 @@ Example: **A**: Please check that there are no typos in the command. To check the correct spelling of the commands, please type `help` and hit enter. -[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | +[⏫ Go to Table of Contents](#table-of-contents) | --- @@ -427,4 +427,4 @@ Example: | Finding an item | `help` | Additional parameters will be ignored | | Exiting the application | `bye` | Additional parameters will be ignored | -[⏫ Go to Table of Contents](#span-stylecolor00a36c-table-of-contents-span) | [⏫ Go to Features](#span-stylecolor00a36c-table-of-contents-span) \ No newline at end of file +[⏫ Go to Table of Contents](#table-of-contents) | [⏫ Go to Features](#features) \ No newline at end of file From 8e463a0cec2e2036b783836c81bbffa44c386a80 Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 10:43:13 +0800 Subject: [PATCH 163/207] docs - Developer Guide updated --- docs/DeveloperGuide.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 9e99f6ef5b..b1338336b8 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -14,7 +14,7 @@ This project is based on the AddressBook-Level3 project created by the SE-EDU in - [DeleteCommand](#delete-command) - [DeleteListCommand](#deletelist-command) - EditQuantityCommand - - FindCommand + - [FindCommand](#find-command) - [HelpCommand](#help-command) - IncorrectCommand - [ListCommand](#list-command) @@ -48,7 +48,9 @@ For all valid commands, the mechanism of implementation are as follows: which runs the actual command function --- - +#### Command +The `Command` abstract class is used to create subclasses of commands for BagPacker. The constructor `Command()` takes in an integer of `targetIndex` which sets the internal `targetIndex` value. +`targetIndex` is used for certain commands such as delete, pack, and edit, where the `index` of a certain `item` in the `packingList` is important in the command. This is done through the `getTargetItem()` method. #### Add Command Add command is used to add a quantity of item(s) to the packing list. @@ -269,13 +271,18 @@ Can only pack a positive quantity that is less than or equal to the unpacked qua ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ``` +--- +#### Find Command +`FindCommand` is used to find all items containing the keyword(s) provided. + +Mechanism: `FindCommand.execute()` calls `PackingList.keywordFinder()` with the given `keyword`. This method loops through every `item` in `packingList` to see if the `itemName` for each `item` contains the keyword(s) given. +The `item`(s) that contain the keyword are placed into an ArrayList with their `itemIndex` then used in `printToUser`. --- #### DeleteList Command `DeleteListCommand` is used to delete all items inside `packingList`. Mechanism: `DeleteListCommand.execute()` reassigns the existing `packingList` to a new empty ArrayList of Items, thus deleting any items in `packingList`. - --- #### Bye Command From 21d747e98a143ebda61f87a220ea85972eab9e3e Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 13:47:36 +0800 Subject: [PATCH 164/207] docs - IncorrectCommand and Command added --- docs/DeveloperGuide.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index a9c8148a74..31be03caeb 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -44,7 +44,7 @@ The class diagram below shows the overall structure of BagPacker application, ma ### BagPacker Command Mechanisms: For all valid commands, the mechanism of implementation are as follows: 1. If `ByeCommand.isBagPackerRunning` is true, keep looping through steps 2-4 -2. Read input - ```runBagPacker()``` method in ```BagPacker``` calls the ```Parser``` class to read user input command using `Parser.parse()` +2. Read input - `runBagPacker()` method in `BagPacker` calls the `Parser` class to read user input command using `Parser.parse()` 3. Create command object - The ```Parser``` class creates a corresponding command object of the relevant command (child class of the Command Class) 4. Execute command object - ```runBagPacker()``` method executes the ```.execute()``` method (overridden by child classes) of the command object which runs the actual command function @@ -55,7 +55,7 @@ Below shows a sequence diagram of the above explanation --- #### Command The `Command` abstract class is used to create subclasses of commands for BagPacker. The constructor `Command()` takes in an integer of `targetIndex` which sets the internal `targetIndex` value. -`targetIndex` is used for certain commands such as delete, pack, and edit, where the `index` of a certain `item` in the `packingList` is important in the command. This is done through the `getTargetItem()` method. +`targetIndex` is used for certain commands such as delete, pack, and edit, where the `index` of a certain `item` in the `packingList` is important in the command. An `item` of that index will be extracted out using `getTargetItem()`. #### Add Command Add command is used to add a quantity of item(s) to the packing list. @@ -291,11 +291,16 @@ Mechanism: `DeleteListCommand.execute()` reassigns the existing `packingList` to --- #### Bye Command -```ByeCommand``` is used to exit the BagPacker application. +`ByeCommand` is used to exit the BagPacker application. -Mechanism: ```ByeCommand.execute()``` updates the static boolean ```isBagPackerRunning``` to be false. -The ```runBagPacker()``` method will continually parse and execute relevant commands (refer to Command Mechanisms in DG) until -```isBagPackerRunning == false``` which occurs upon the execution of the ```byeCommand```. +Mechanism: `ByeCommand.execute()`updates the static boolean `isBagPackerRunning` to be false. +The `runBagPacker()` method will continually parse and execute relevant commands (refer to Command Mechanisms in DG) until +`isBagPackerRunning == false` which occurs upon the execution of the `byeCommand`. +--- +#### Incorrect Command + +`IncorrectCommand` is a special type command that is returned by `Parser.parse()` when an exception is thrown by one of the methods in `Parse`. +These exceptions are thrown when an error is detected in the user's input, consist of many types, such as a blank input, incorrect command format, or a missing parameter. See [Exceptions](#exceptions). --- From a32e52641a018694a760b8ae3668b6cb06be0f8c Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 15:47:40 +0800 Subject: [PATCH 165/207] Refactor developer guide --- docs/DeveloperGuide.md | 141 ++++++++++++++++++++++++++++------------- 1 file changed, 96 insertions(+), 45 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 31be03caeb..0ff801453b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,47 +1,64 @@ [DeveloperGuide.md](DeveloperGuide.md) # Developer Guide +* [Acknowledgements](#acknowledgements) +* [Setting up and getting started](#setting-up-and-getting-started) +* [Design](#design) + * [Commands component](#commands-component) + * [Add command](#add-command) + * [Preventing duplicate items](#preventing-duplicate-items) + * [Delete command](#delete-command) + * [Pack command](#pack-command) + * [Unpack command](#unpack-command) + * [Help command](#help-command) + * [List command](#list-command) + * [List Unpacked command](#list-unpacked-command) + * [Find command](#find-command) + * [Delete list command](#deletelist-command) + * [Bye command](#bye-command) + * [Incorrect command](#incorrect-command) + * Edit Quantity command + * Pack All command + * Unpack All command + * [Exceptions component](#exceptions) + * [Empty input](#emptyinputexception) + * [Invalid index](#invalidindexexception) + * [Invalid quantity](#invalidquantityexception) + * [Invalid variables](#invalidvariablesexception) + * IOHandler component + * Parser + * Storage + * Ui + * Packing component + * Item + * Packing List +* Implementation +* Documentation, logging, testing, configuration, dev-ops +* [Appendix A: Product Scope](#appendix-a--product-scope) +* [Appendix B: User Stories](#appendix-b--user-stories) +* [Appendix C: Non-Functional Requirements](#appendix-c--non-functional-requirements) +* [Appendix D: Glossary](#appendix-d--glossary) +* [Appendix E: Instructions for manual testing](#appendix-e--instructions-for-manual-testing) + + ## Acknowledgements This project is based on the AddressBook-Level3 project created by the SE-EDU initiative. +* The design and structure of our User Guide and Developer Guide is referenced from the AddressBook-Level3 (AB3) User Guide and Developer Guide. + * [AB3 User Guide](https://se-education.org/addressbook-level3/UserGuide.html) + * [AB3 Developer Guide](https://se-education.org/addressbook-level3/DeveloperGuide.html) + +## Setting up and getting started -## Design & implementation +## Design #### BagPacker Class is the main entry point for the BagPacker Program, below are the Packages and every class contained within each Package -1. [commands](#bagpacker-command-mechanisms-) - - [Command](#command) - - [AddCommand](#add-command) - - [ByeCommand](#bye-command) - - [DeleteCommand](#delete-command) - - [DeleteListCommand](#deletelist-command) - - EditQuantityCommand - - [FindCommand](#find-command) - - [HelpCommand](#help-command) - - IncorrectCommand - - [ListCommand](#list-command) - - [ListUnpackedCommand](#list-unpacked-command) - - PackAllCommand - - [PackCommand](#pack-command) - - UnpackAllCommand - - [UnpackCommand](#unpack-command) -2. [exception](#exceptions) - - [EmptyInputException](#emptyinputexception) - - [InvalidIndexException](#invalidindexexception) - - [InvalidQuantityException](#invalidquantityexception) - - [InvalidVariablesException](#invalidvariablesexception) -3. iohandler - - Parser - - Storage - - Ui -4. packingfunc - - Item - - PackingList The class diagram below shows the overall structure of BagPacker application, many methods, variables and associations are omitted for improved clarity -![BagPackerClassDiagram.png](umlDiagrams%2FBagPackerClassDiagram.png) -![ExceptionClassDiagram.png](umlDiagrams%2FExceptionClassDiagram.png) +![BagPackerClassDiagram.png](diagrams%2FBagPackerClassDiagram.png) +![ExceptionClassDiagram.png](diagrams%2FExceptionClassDiagram.png) -### BagPacker Command Mechanisms: +### Commands component For all valid commands, the mechanism of implementation are as follows: 1. If `ByeCommand.isBagPackerRunning` is true, keep looping through steps 2-4 2. Read input - `runBagPacker()` method in `BagPacker` calls the `Parser` class to read user input command using `Parser.parse()` @@ -51,11 +68,17 @@ For all valid commands, the mechanism of implementation are as follows: Below shows a sequence diagram of the above explanation -![BagPackerSequenceDiagram.png](umlDiagrams%2FBagPackerSequenceDiagram.png) +![BagPackerSequenceDiagram.png](diagrams%2FBagPackerSequenceDiagram.png) + --- + #### Command + The `Command` abstract class is used to create subclasses of commands for BagPacker. The constructor `Command()` takes in an integer of `targetIndex` which sets the internal `targetIndex` value. `targetIndex` is used for certain commands such as delete, pack, and edit, where the `index` of a certain `item` in the `packingList` is important in the command. An `item` of that index will be extracted out using `getTargetItem()`. + +--- + #### Add Command Add command is used to add a quantity of item(s) to the packing list. @@ -63,6 +86,7 @@ Add command is used to add a quantity of item(s) to the packing list. Mechanism: ```AddCommand.execute()``` calls the ```PackingList.addItem()``` method from the ```PackingList``` class which executes the ```ArrayList.add()``` method to add the item to the ```PackingList``` ArrayList. It then updates the ```quantity``` variable according to the quantity inputted by the user. +--- ##### Preventing duplicate items @@ -72,7 +96,7 @@ This is done through the `itemFinder()` method in class `PackingList()`, which i Below is the UML diagram showing what occurs during `add` function when trying to add a duplicate item. -![AddExistingItemDiagram.png](umlDiagrams%2FAddExistingItemDiagram.png) +![AddExistingItemDiagram.png](diagrams%2FAddExistingItemDiagram.png) When `AddCommand.execute()` is called in `BagPacker`, the `PackingList.itemFinder()` method is called. @@ -84,7 +108,6 @@ If `PackingList.itemFinder()` returns false, the item will be added onto `packin In both scenarios, the relevant `ui.printToUser` messages (omitted in the sequence diagram for easier reading) will be called to print a message to the user. - --- #### Delete Command @@ -111,7 +134,7 @@ Execute Mechanism: ```PackCommand.execute()``` calls the ```PackCommand.getTarge After which the ```PackingList.PackItem(item, packQuantity)``` method is called in ```PackingList``` which calls ```Item.setPacked(packQuantity)```in `Item` class. `Item.setPacked()` will add the `packedQuantity` to the current pack quantity of the item `toPack`. Lastly `Ui.printToUser(MSG_SUCCESS_PACK, item)` from `Ui` class is called to print a message to the user signifying that the pack command has been executed successfully. -![ExecutePackCommandSequenceDiagram.png](umlDiagrams%2FExecutePackCommandSequenceDiagram.png) +![ExecutePackCommandSequenceDiagram.png](diagrams%2FExecutePackCommandSequenceDiagram.png) Sequence Diagram of Successful `PackCommand.execute()` @@ -133,11 +156,12 @@ Execute Mechanism: ```UnpackCommand.execute()``` calls the ```UnpackCommand.getT After which the ```PackingList.UnpackItem(item, quantity)``` method is called in ```PackingList``` which calls ```Item.setUnpacked(quantity)```in `Item` class. `Item.setUnpacked()` will remove the `quantity` from the current pack quantity of the item. Lastly `Ui.printToUser(MSG_SUCCESS_UNPACK, item)` from `Ui` class is called to print a message to the user signifying that the unpack command has been executed successfully. -![ExecuteUnpackCommandSequenceDiagram.png](umlDiagrams%2FExecuteUnpackCommandSequenceDiagram.png) +![ExecuteUnpackCommandSequenceDiagram.png](diagrams%2FExecuteUnpackCommandSequenceDiagram.png) Sequence Diagram of Successful `UnpackCommand.execute()` --- + #### Help Command Help command is used to display all the possible commands in the BagPacker application for the user. @@ -245,7 +269,9 @@ All items in your list are fully packed! ________________________________________________________________________________________________________________________ ``` + --- + #### Pack Command `PackCommand` is used to increase the quantity packed of a certain item in the `packingList`. Mechanism: PackCommand.execute() calls packingList.packItem() with a certain `item` and `itemQuantity`, which then calls the `.setPacked()` method. This method will increase the `packedQuantity` of that specific item by `itemQuantity`. @@ -277,12 +303,15 @@ Can only pack a positive quantity that is less than or equal to the unpacked qua ``` --- + #### Find Command `FindCommand` is used to find all items containing the keyword(s) provided. Mechanism: `FindCommand.execute()` calls `PackingList.keywordFinder()` with the given `keyword`. This method loops through every `item` in `packingList` to see if the `itemName` for each `item` contains the keyword(s) given. The `item`(s) that contain the keyword are placed into an ArrayList with their `itemIndex` then used in `printToUser`. + --- + #### DeleteList Command `DeleteListCommand` is used to delete all items inside `packingList`. @@ -296,7 +325,9 @@ Mechanism: `DeleteListCommand.execute()` reassigns the existing `packingList` to Mechanism: `ByeCommand.execute()`updates the static boolean `isBagPackerRunning` to be false. The `runBagPacker()` method will continually parse and execute relevant commands (refer to Command Mechanisms in DG) until `isBagPackerRunning == false` which occurs upon the execution of the `byeCommand`. + --- + #### Incorrect Command `IncorrectCommand` is a special type command that is returned by `Parser.parse()` when an exception is thrown by one of the methods in `Parse`. @@ -307,8 +338,11 @@ These exceptions are thrown when an error is detected in the user's input, consi ### Exceptions The `exceptions` package contains all exceptions within BagPacker that are thrown when an error is detected. This is done to allow the program to continue running and to elegantly handle any potential app stopping errors. + --- + #### EmptyInputException + The `EmptyInputException` is thrown when the user input is empty or is composed of whitespace characters only. Thrown by: @@ -318,6 +352,7 @@ Caught in: 1. `Parser.parse()` --- + #### InvalidIndexException The `InvalidIndexException` is thrown when the user inputs an item index that is out of bounds of the `PackingList` or greater than 1,000,000 @@ -334,6 +369,7 @@ Thrown and caught in: 5. `Parser.createUnpackObj()` --- + #### InvalidQuantityException The `InvalidQuantityException` is thrown when the user inputs a quantity of an item that is invalid. This differs depending on the respective Command. @@ -351,6 +387,7 @@ Thrown and caught in: 4. `Parser.createUnpackObj()` --- + #### InvalidVariablesException The `InvalidVariablesException` is thrown when the user inputs the wrong number of variables for commands with input variables (i.e. excluding `help`, `list`, `bye`, `deletelist` and `listunpacked` commands) @@ -366,18 +403,27 @@ Caught by: all createCommandObj methods except for commands without input variables (i.e. excluding `help`, `list`, `bye`, `deletelist` and `listunpacked` commands) --- -## Product scope -### Target user profile +## Appendix + +--- -BagPacker is for NUS students, in particular, exchange students who travel a lot and want a simple CLI to keep track of their packing. +### Appendix A: Product scope -### Value proposition +**Target user profile** +* Has a need to pack items for travel purposes +* Prefers desktop apps over other types of apps (such as mobile apps) +* Prefers typing to mouse interactions +* Is reasonably comfortable using CLI apps + + +**Value proposition** BagPacker aims to help busy students simplify their packing process by allowing easy adding of items to pack and record of the items they have already packed so that they can be organised and aboard their travels with ease. +--- -## User Stories +### Appendix B: User Stories | Version | As a ... | I want to ... | So that I can ... | |---------|----------|------------------------------------------------|------------------------------------------------------------------------------| @@ -395,16 +441,21 @@ BagPacker aims to help busy students simplify their packing process by allowing | v2.1 | user | edit the number of items i need to pack | change my mind whenever I want | | v2.1 | user | fully pack or unpack an item | don't have to refer to how many of that item I need | +--- -## Non-Functional Requirements +### Appendix C: Non-Functional Requirements - be able to retrieve the user's packing list quickly and accurately - the quantity of each item to be packed should not be unreasonably large -## Glossary +--- + +### Appendix D: Glossary * *CLI* - Command Line Interface -## Instructions for manual testing +--- + +### Appendix E: Instructions for manual testing {Give instructions on how to do a manual product testing e.g., how to load sample data to be used for testing} From f0c0b7dc94a7791b79c4be515d88b97abe37ab1e Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 15:48:00 +0800 Subject: [PATCH 166/207] Rename folder containing diagrams --- .../AddExistingItemDiagram.png | Bin .../AddExistingItemDiagram.puml | 0 .../BagPackerClassDiagram.png | Bin .../BagPackerClassDiagram.puml | 0 .../BagPackerSequenceDiagram.png | Bin .../BagPackerSequenceDiagram.puml | 0 .../CreatePackObjSequenceDiagram.puml | 0 .../ExceptionClassDiagram.png | Bin .../ExceptionClassDiagram.puml | 0 .../ExecutePackCommandSequenceDiagram.png | Bin .../ExecutePackCommandSequenceDiagram.puml | 0 .../ExecuteUnpackCommandSequenceDiagram.png | Bin .../ExecuteUnpackCommandSequenceDiagram.puml | 0 13 files changed, 0 insertions(+), 0 deletions(-) rename docs/{umlDiagrams => diagrams}/AddExistingItemDiagram.png (100%) rename docs/{umlDiagrams => diagrams}/AddExistingItemDiagram.puml (100%) rename docs/{umlDiagrams => diagrams}/BagPackerClassDiagram.png (100%) rename docs/{umlDiagrams => diagrams}/BagPackerClassDiagram.puml (100%) rename docs/{umlDiagrams => diagrams}/BagPackerSequenceDiagram.png (100%) rename docs/{umlDiagrams => diagrams}/BagPackerSequenceDiagram.puml (100%) rename docs/{umlDiagrams => diagrams}/CreatePackObjSequenceDiagram.puml (100%) rename docs/{umlDiagrams => diagrams}/ExceptionClassDiagram.png (100%) rename docs/{umlDiagrams => diagrams}/ExceptionClassDiagram.puml (100%) rename docs/{umlDiagrams => diagrams}/ExecutePackCommandSequenceDiagram.png (100%) rename docs/{umlDiagrams => diagrams}/ExecutePackCommandSequenceDiagram.puml (100%) rename docs/{umlDiagrams => diagrams}/ExecuteUnpackCommandSequenceDiagram.png (100%) rename docs/{umlDiagrams => diagrams}/ExecuteUnpackCommandSequenceDiagram.puml (100%) diff --git a/docs/umlDiagrams/AddExistingItemDiagram.png b/docs/diagrams/AddExistingItemDiagram.png similarity index 100% rename from docs/umlDiagrams/AddExistingItemDiagram.png rename to docs/diagrams/AddExistingItemDiagram.png diff --git a/docs/umlDiagrams/AddExistingItemDiagram.puml b/docs/diagrams/AddExistingItemDiagram.puml similarity index 100% rename from docs/umlDiagrams/AddExistingItemDiagram.puml rename to docs/diagrams/AddExistingItemDiagram.puml diff --git a/docs/umlDiagrams/BagPackerClassDiagram.png b/docs/diagrams/BagPackerClassDiagram.png similarity index 100% rename from docs/umlDiagrams/BagPackerClassDiagram.png rename to docs/diagrams/BagPackerClassDiagram.png diff --git a/docs/umlDiagrams/BagPackerClassDiagram.puml b/docs/diagrams/BagPackerClassDiagram.puml similarity index 100% rename from docs/umlDiagrams/BagPackerClassDiagram.puml rename to docs/diagrams/BagPackerClassDiagram.puml diff --git a/docs/umlDiagrams/BagPackerSequenceDiagram.png b/docs/diagrams/BagPackerSequenceDiagram.png similarity index 100% rename from docs/umlDiagrams/BagPackerSequenceDiagram.png rename to docs/diagrams/BagPackerSequenceDiagram.png diff --git a/docs/umlDiagrams/BagPackerSequenceDiagram.puml b/docs/diagrams/BagPackerSequenceDiagram.puml similarity index 100% rename from docs/umlDiagrams/BagPackerSequenceDiagram.puml rename to docs/diagrams/BagPackerSequenceDiagram.puml diff --git a/docs/umlDiagrams/CreatePackObjSequenceDiagram.puml b/docs/diagrams/CreatePackObjSequenceDiagram.puml similarity index 100% rename from docs/umlDiagrams/CreatePackObjSequenceDiagram.puml rename to docs/diagrams/CreatePackObjSequenceDiagram.puml diff --git a/docs/umlDiagrams/ExceptionClassDiagram.png b/docs/diagrams/ExceptionClassDiagram.png similarity index 100% rename from docs/umlDiagrams/ExceptionClassDiagram.png rename to docs/diagrams/ExceptionClassDiagram.png diff --git a/docs/umlDiagrams/ExceptionClassDiagram.puml b/docs/diagrams/ExceptionClassDiagram.puml similarity index 100% rename from docs/umlDiagrams/ExceptionClassDiagram.puml rename to docs/diagrams/ExceptionClassDiagram.puml diff --git a/docs/umlDiagrams/ExecutePackCommandSequenceDiagram.png b/docs/diagrams/ExecutePackCommandSequenceDiagram.png similarity index 100% rename from docs/umlDiagrams/ExecutePackCommandSequenceDiagram.png rename to docs/diagrams/ExecutePackCommandSequenceDiagram.png diff --git a/docs/umlDiagrams/ExecutePackCommandSequenceDiagram.puml b/docs/diagrams/ExecutePackCommandSequenceDiagram.puml similarity index 100% rename from docs/umlDiagrams/ExecutePackCommandSequenceDiagram.puml rename to docs/diagrams/ExecutePackCommandSequenceDiagram.puml diff --git a/docs/umlDiagrams/ExecuteUnpackCommandSequenceDiagram.png b/docs/diagrams/ExecuteUnpackCommandSequenceDiagram.png similarity index 100% rename from docs/umlDiagrams/ExecuteUnpackCommandSequenceDiagram.png rename to docs/diagrams/ExecuteUnpackCommandSequenceDiagram.png diff --git a/docs/umlDiagrams/ExecuteUnpackCommandSequenceDiagram.puml b/docs/diagrams/ExecuteUnpackCommandSequenceDiagram.puml similarity index 100% rename from docs/umlDiagrams/ExecuteUnpackCommandSequenceDiagram.puml rename to docs/diagrams/ExecuteUnpackCommandSequenceDiagram.puml From c3ea4d4cb24ab399cfbc6d3f2a8eac9c2c1107b6 Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 15:55:22 +0800 Subject: [PATCH 167/207] docs - storage added in developer docs --- docs/DeveloperGuide.md | 40 +++++++++++++++++++ .../java/bagpacker/iohandler/Storage.java | 2 + 2 files changed, 42 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 31be03caeb..738f6ab22d 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -301,6 +301,9 @@ The `runBagPacker()` method will continually parse and execute relevant commands `IncorrectCommand` is a special type command that is returned by `Parser.parse()` when an exception is thrown by one of the methods in `Parse`. These exceptions are thrown when an error is detected in the user's input, consist of many types, such as a blank input, incorrect command format, or a missing parameter. See [Exceptions](#exceptions). +Depending on the error, `IncorrectCommand` will be constructed with an `errorType` and `helpMessage`. + +Mechanism: `IncorrectCommand.execute()` will print the relevant error message to the user by calling `Ui.errorMessage`. --- @@ -366,6 +369,43 @@ Caught by: all createCommandObj methods except for commands without input variables (i.e. excluding `help`, `list`, `bye`, `deletelist` and `listunpacked` commands) --- + +### IOHandler +The `IOHandler` package contains three main classes, which are [Parser](#parser), [Storage](#storage) and [Ui](#ui). These classes are used to handle input from and output to the user through the CLI, +while managing the storage and retrieval of the associated `item`s in the user's `packingList`. + +--- +#### Parser + + +--- +#### Storage +The `Storage` class consists of two main methods: `save()` and `load()`. +The constructor of this class, which is called in `BagPacker`, will set the `file_path` of storage, which is default at "packingList.txt". + +`save()` calls the method `writeToFile`, which loops through the `packingList` to write every `item` to a file in the `file_path` using a `FileWriter`. + +Each `item` is written on a newline with a format using `.toString()`, which is `[PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME`. +Example: +```text +[0/4] jackets +[2/4] cats +[0/3] toothbrush +``` + +`load()` is called at the start of `main()` in `BagPacker`. +This method reads in the file in `file_path` and translates each line to construct an `item`. + +This is done by the method `readItem()`, which marks out the relevant variables for `packedQuantity`, `totalQuantity` and `itemName` in a line, then uses the overloaded constructor method in `Item` class to form an item. + +Each `item` is returned to `load()` and added to the packingList. + +--- +#### Ui + + +--- + ## Product scope ### Target user profile diff --git a/src/main/java/bagpacker/iohandler/Storage.java b/src/main/java/bagpacker/iohandler/Storage.java index 94c13a5970..92b03a60ab 100644 --- a/src/main/java/bagpacker/iohandler/Storage.java +++ b/src/main/java/bagpacker/iohandler/Storage.java @@ -39,6 +39,8 @@ public static void load() throws FileNotFoundException { * @return item containing relevant packedQuantity, totalQuantity and item description */ private static Item readItem(String line) { + assert (line.matches("\\[\\d+/\\d+\\] .+")) : + "the format of this savefile is incorrect."; int openBracketIndex = line.indexOf('['); int forwardSlashIndex = line.indexOf('/'); int closeBracketIndex = line.indexOf(']'); From eae9edbfd34e1c915c8b3a3ea852ee4e039e537a Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 16:33:20 +0800 Subject: [PATCH 168/207] Refactor Developer Guide --- docs/DeveloperGuide.md | 148 ++++++++++++-------- docs/DeveloperGuide.md.rej | 18 --- docs/umlDiagrams/BagPackerClassDiagram.png | Bin 75369 -> 64665 bytes docs/umlDiagrams/BagPackerClassDiagram.puml | 4 +- 4 files changed, 90 insertions(+), 80 deletions(-) delete mode 100644 docs/DeveloperGuide.md.rej diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c36e656c91..c2905c6e87 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,47 +1,72 @@ [DeveloperGuide.md](DeveloperGuide.md) # Developer Guide - -## Acknowledgements +## Table of Contents +* **Acknowledgements** +* **Setting up, getting started** +* **Design** + * [Architecture](#architecture) + * [commands Package](#bagpacker-command-mechanisms-) + - Command + - [AddCommand](#add-command) + - [ByeCommand](#bye-command) + - [DeleteCommand](#delete-command) + - [DeleteListCommand](#deletelist-command) + - EditQuantityCommand + - FindCommand + - [HelpCommand](#help-command) + - IncorrectCommand + - [ListCommand](#list-command) + - [ListUnpackedCommand](#list-unpacked-command) + - PackAllCommand + - [PackCommand](#pack-command) + - UnpackAllCommand + - [UnpackCommand](#unpack-command) + * **[exception Package](#exceptions)** + - [EmptyInputException](#emptyinputexception) + - [InvalidIndexException](#invalidindexexception) + - [InvalidQuantityException](#invalidquantityexception) + - [InvalidVariablesException](#invalidvariablesexception) + * **[iohandler Pakage](#iohandler-package)** + - Parser + - Storage + - Ui + * **[packingfunc Package](#packingfunc-package)** + - Item + - PackingList +* **Documentation, logging, testing, configuration, dev-ops** +* **Appendix: Requirements** + * Product scope + * User stories + * Use cases + * Non-Functional Requirements + * Glossary + + +### Acknowledgements This project is based on the AddressBook-Level3 project created by the SE-EDU initiative. -## Design & implementation -#### BagPacker Class is the main entry point for the BagPacker Program, below are the Packages and every class contained within each Package -1. [commands](#bagpacker-command-mechanisms-) - - Command - - [AddCommand](#add-command) - - [ByeCommand](#bye-command) - - [DeleteCommand](#delete-command) - - [DeleteListCommand](#deletelist-command) - - EditQuantityCommand - - FindCommand - - [HelpCommand](#help-command) - - IncorrectCommand - - [ListCommand](#list-command) - - [ListUnpackedCommand](#list-unpacked-command) - - PackAllCommand - - [PackCommand](#pack-command) - - UnpackAllCommand - - [UnpackCommand](#unpack-command) -2. [exception](#exceptions) - - [EmptyInputException](#emptyinputexception) - - [InvalidIndexException](#invalidindexexception) - - [InvalidQuantityException](#invalidquantityexception) - - [InvalidVariablesException](#invalidvariablesexception) -3. iohandler - - Parser - - Storage - - Ui -4. packingfunc - - Item - - PackingList - -The class diagram below shows the overall structure of BagPacker application, many methods, variables and associations are omitted for improved clarity - -![BagPackerClassDiagram.png](umlDiagrams%2FBagPackerClassDiagram.png) -![ExceptionClassDiagram.png](umlDiagrams%2FExceptionClassDiagram.png) - -### BagPacker Command Mechanisms: +--- +### Setting up, getting started +Refer to the [user guide]([UserGuide.md](UserGuide.md)) for more details + +--- +### Design + +##### Architecture +![BagPackerClassDiagram.png](umlDiagrams%2FBagPackerClassDiagram.png)![ExceptionClassDiagram.png](umlDiagrams%2FExceptionClassDiagram.png) + +The Architecture of BagPacker Application can be seen from the diagram above + +BagPacker components of the architecture (similar to a standard main() class) + +`BagPacker` is responsible for, +- A + +--- + +### commands package + For all valid commands, the mechanism of implementation are as follows: 1. If `ByeCommand.isBagPackerRunning` is true, keep looping through steps 2-4 2. Read input - ```runBagPacker()``` method in ```BagPacker``` calls the ```Parser``` class to read user input command using `Parser.parse()` @@ -52,7 +77,6 @@ For all valid commands, the mechanism of implementation are as follows: Below shows a sequence diagram of the above explanation ![BagPackerSequenceDiagram.png](umlDiagrams%2FBagPackerSequenceDiagram.png) ---- #### Add Command @@ -83,7 +107,6 @@ If `PackingList.itemFinder()` returns false, the item will be added onto `packin In both scenarios, the relevant `ui.printToUser` messages (omitted in the sequence diagram for easier reading) will be called to print a message to the user. ---- #### Delete Command @@ -91,7 +114,6 @@ Delete command is used to delete an item from the packing list. Mechanism: ```DeleteCommand.execute()``` calls the ```PackingList.deleteItem()``` method from the ```PackingList``` class which executes the ```ArrayList.remove()``` method to remove the item from the ```PackingList``` ArrayList. ---- #### Pack Command @@ -113,7 +135,6 @@ Lastly `Ui.printToUser(MSG_SUCCESS_PACK, item)` from `Ui` class is called to pri Sequence Diagram of Successful `PackCommand.execute()` ---- #### Unpack Command @@ -135,7 +156,7 @@ Lastly `Ui.printToUser(MSG_SUCCESS_UNPACK, item)` from `Ui` class is called to p Sequence Diagram of Successful `UnpackCommand.execute()` ---- + #### Help Command Help command is used to display all the possible commands in the BagPacker application for the user. @@ -177,7 +198,6 @@ All Commands: ____________________________________________________________ ``` ---- #### List Command @@ -200,7 +220,6 @@ Here are the items in your list ____________________________________________________________ ``` ---- #### List Unpacked Command @@ -244,7 +263,6 @@ ________________________________________________________________________________ ``` ---- #### DeleteList Command @@ -253,7 +271,6 @@ ________________________________________________________________________________ Mechanism: `DeleteListCommand.execute()` reassigns the existing `packingList` to a new empty ArrayList of Items, thus deleting any items in `packingList`. ---- #### Bye Command ```ByeCommand``` is used to exit the BagPacker application. @@ -267,7 +284,7 @@ The ```runBagPacker()``` method will continually parse and execute relevant comm ### Exceptions The `exceptions` package contains all exceptions within BagPacker that are thrown when an error is detected. This is done to allow the program to continue running and to elegantly handle any potential app stopping errors. ---- + #### EmptyInputException The `EmptyInputException` is thrown when the user input is empty or is composed of whitespace characters only. @@ -277,7 +294,7 @@ Thrown by: Caught in: 1. `Parser.parse()` ---- + #### InvalidIndexException The `InvalidIndexException` is thrown when the user inputs an item index that is out of bounds of the `PackingList` or greater than 1,000,000 @@ -293,7 +310,7 @@ Thrown and caught in: 4. `Parser.createPackAllObj()` 5. `Parser.createUnpackObj()` ---- + #### InvalidQuantityException The `InvalidQuantityException` is thrown when the user inputs a quantity of an item that is invalid. This differs depending on the respective Command. @@ -310,7 +327,7 @@ Thrown and caught in: 3. `Parser.createEditQuantityObj()` 4. `Parser.createUnpackObj()` ---- + #### InvalidVariablesException The `InvalidVariablesException` is thrown when the user inputs the wrong number of variables for commands with input variables (i.e. excluding `help`, `list`, `bye`, `deletelist` and `listunpacked` commands) @@ -326,18 +343,29 @@ Caught by: all createCommandObj methods except for commands without input variables (i.e. excluding `help`, `list`, `bye`, `deletelist` and `listunpacked` commands) --- -## Product scope +### iohandler package -### Target user profile + +--- +### packingfunc package + +--- +### Documentation, logging, testing, configuration, dev-ops + +--- +### Appendix: Requirements +##### Product scope + +**Target user profile** BagPacker is for NUS students, in particular, exchange students who travel a lot and want a simple CLI to keep track of their packing. -### Value proposition +**Value proposition** BagPacker aims to help busy students simplify their packing process by allowing easy adding of items to pack and record of the items they have already packed so that they can be organised and aboard their travels with ease. -## User Stories +##### User Stories | Version | As a ... | I want to ... | So that I can ... | |---------|----------|------------------------------------------------|------------------------------------------------------------------------------| @@ -356,15 +384,17 @@ BagPacker aims to help busy students simplify their packing process by allowing -## Non-Functional Requirements +##### Non-Functional Requirements - be able to retrieve the user's packing list quickly and accurately - the quantity of each item to be packed should not be unreasonably large -## Glossary +##### Glossary * *CLI* - Command Line Interface -## Instructions for manual testing +--- + +### Instructions for manual testing {Give instructions on how to do a manual product testing e.g., how to load sample data to be used for testing} diff --git a/docs/DeveloperGuide.md.rej b/docs/DeveloperGuide.md.rej deleted file mode 100644 index ff0fabc4d6..0000000000 --- a/docs/DeveloperGuide.md.rej +++ /dev/null @@ -1,18 +0,0 @@ -diff a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md (rejected hunks) -@@ -83,7 +83,16 @@ - - Mechanism: ```DeleteListCommand.execute()``` reassigns the existing ```packingList``` to a new empty ArrayList of Items, thus deleting the ```packingList```. - -+#### Pack Command -+```PackCommand``` is used to mark an item in the list as packed. - -+Mechanism: ```PackCommand.execute()``` calls the ```PackingList.packItem()``` method from the ```PackingList``` class. -+This will execute the ```setPacked()``` method to set the value of the boolean ```isPacked``` to be ```true```, and mark the item as packed in the ```PackingList``` ArrayList. -+ -+#### Unpack Command -+```Unpack Command``` is used to mark an item in the list as unpacked. -+Mechanism: ```UnpackCommand.execute()``` calls the ```PackingList.unpackItem()``` method from the ```PackingList``` class. -+This will execute the ```setPacked``` method to set the value of the boolean ```isPacked``` to be ```false```, and mark the item as unpacked in the ```PackingList``` ArrayList. - - ## Product scope - diff --git a/docs/umlDiagrams/BagPackerClassDiagram.png b/docs/umlDiagrams/BagPackerClassDiagram.png index 618af68cfc22c22c441da998246977e4d10880a2..d9d290201fd6996a63b1df724406f9d5ec7876f8 100644 GIT binary patch literal 64665 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 z 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 B;lBU? literal 75369 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
    ## Quick Start @@ -53,8 +53,8 @@ is unpacked and travel with an ease of mind. |___/ Enter "help" to find out how to use BagPacker - ________________________________________________________________________________________________________________________ - ________________________________________________________________________________________________________________________ + _________________________________________________________________________________ + _________________________________________________________________________________ Welcome back, User! ``` @@ -63,7 +63,7 @@ To start off, typing `help` and pressing Enter will display a help message. 7. Refer to the [Features section](#features) below for details of each command. ---- +
    ## Features > **Notes about command format** @@ -89,40 +89,41 @@ Example: `help` * Expected outcome: - ``` - All Commands: - 1. add: Adds quantity and name of item to the packing list. - Example: add 3 /of toothbrush - Meaning: Add quantity of 3 toothbrushes to the packing list - 2. delete: Deletes an item from the packing list. - Example: delete 1 - Meaning: Removes the first item in the packing list - 3. pack: Adds to the current quantity of items packed in the packing list. - Example: pack 2 /of 3 - Meaning: Packs 2 more quantities of the third item in the packing list - 4. packall: Fully pack an item of choice from the packing list. - Example: packall /of 3 - Meaning: Set the third item in the packing list as fully packed - 5. unpack: Deducts from the current quantity of items packed in the packing list. - Example: unpack 1 /of 2 - Meaning: Unpacks 1 quantity of the second item in the packing list - 6. unpackall: Fully unpacks an item of choice from the packing list. - Example: unpackall /of 3 - Meaning: Set the third item in the packing list as totally not packed yet - 7. editquantity: Edit the total quantity of an item to be packed. - Example: editquantity 3 /of 2 - Meaning: Change the total quantity of the second item to 3 - 8. list: List all items and their total quantities packed in packing list. - Example: list - 9. listunpacked: List all items and their total quantities if they are not fully packed yet. - Example: listunpacked - 10. deletelist: Deletes all items in the packing list. - Example: deletelist - 11. find: Displays all items in the packingList as a list that contains the keyword used in the command. - Example: find jacket - 12. bye: Stops the BagPacker Application - Example: bye - ``` +``` +All Commands: +1. add: Adds quantity and name of item to the packing list. + Example: add 3 /of toothbrush + Meaning: Add quantity of 3 toothbrushes to the packing list +2. delete: Deletes an item from the packing list. + Example: delete 1 + Meaning: Removes the first item in the packing list +3. pack: Adds to the current quantity of items packed in the packing list. + Example: pack 2 /of 3 + Meaning: Packs 2 more quantities of the third item in the packing list +4. packall: Fully pack an item of choice from the packing list. + Example: packall /of 3 + Meaning: Set the third item in the packing list as fully packed +5. unpack: Deducts from the current quantity of items packed in the packing list. + Example: unpack 1 /of 2 + Meaning: Unpacks 1 quantity of the second item in the packing list +6. unpackall: Fully unpacks an item of choice from the packing list. + Example: unpackall /of 3 + Meaning: Set the third item in the packing list as totally not packed yet +7. editquantity: Edit the total quantity of an item to be packed. + Example: editquantity 3 /of 2 + Meaning: Change the total quantity of the second item to 3 +8. list: List all items and their total quantities packed in packing list. + Example: list +9. listunpacked: List all items and their total quantities if they are not fully packed yet. + Example: listunpacked +10. deletelist: Deletes all items in the packing list. + Example: deletelist +11. find: Displays all items in the packingList as a list that contains the keyword used in the command. + Example: find jacket +12. bye: Stops the BagPacker Application + Example: bye + ``` + ### Adding a new item: `add` Adds a new item and its quantity to the packing list. @@ -398,7 +399,7 @@ Example: [⏫ Go to Table of Contents](#table-of-contents) | [⏫ Go to Features](#features) ---- +
    ## Frequently Asked Questions (FAQ) @@ -434,7 +435,7 @@ Example: [⏫ Go to Table of Contents](#table-of-contents) | ---- +
    ## Command Summary From e53f52c3140aff35bf23ca12888c00f78023ce27 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 23:02:20 +0800 Subject: [PATCH 201/207] Bug fix unpackall and packall --- src/main/java/bagpacker/iohandler/Parser.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 4d50c073e6..d8cfd7a306 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -430,6 +430,10 @@ public static Command createPackAllObj() { } else { try { int itemIndex = getPackAllIndex(); + if (PackingList.getItemList().get(itemIndex - 1).getUnpackedQuantity() == 0) { + return new IncorrectCommand("Item Fully Packed", + "You are done packing this item"); + } return new PackAllCommand(itemIndex); } catch (InvalidVariablesException | ArrayIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid Packall Command Input", @@ -498,6 +502,10 @@ public static Command createUnpackAllObj() { } else { try { int itemIndex = getPackAllIndex(); + if (PackingList.getItemList().get(itemIndex - 1).getPackedQuantity() == 0) { + return new IncorrectCommand("Item Not Packed", + "You have not packed this item at all"); + } return new UnpackAllCommand(itemIndex); } catch (InvalidVariablesException | ArrayIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid Unpackall Command Input", From 7a8aae62ba4ed755bfc128a8ea1542ced2009089 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 23:04:12 +0800 Subject: [PATCH 202/207] Add line break to PPP --- docs/team/shannentan.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/team/shannentan.md b/docs/team/shannentan.md index 7f03a6f3e7..9a74121de4 100644 --- a/docs/team/shannentan.md +++ b/docs/team/shannentan.md @@ -26,6 +26,8 @@ Project management * Created GitHub organisation for the team * Set up GitHub team repository +
    + Enhancements to existing features * Enhanced the `add`, `pack` and `unpack` commands to support multiple quantities * Involved changing the `Item` constructor, and the respective methods used to parse inputs and execute the commands From c20417eb94e0bffb7501a60944298582d3201a6c Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 23:26:56 +0800 Subject: [PATCH 203/207] Fix DG broken link Add line break --- docs/DeveloperGuide.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 1b299c3fcd..55ac0fe8b5 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -6,7 +6,7 @@ * [**Acknowledgements**](#acknowledgements) * [**Setting up, getting started**](#setting-up-getting-started) -* [**Design**](#span-stylecolor00a36c-design-span) +* [**Design**](#design) * [Architecture](#architecture) * [*Commands Package*](#commands-package) * [*Command*](#command) @@ -58,7 +58,7 @@ This project is based on the AddressBook-Level3 project created by the SE-EDU in Refer to the [UserGuide.md](UserGuide.md) for more details --- - +
    ## Design ### Architecture @@ -598,9 +598,10 @@ Methods: - `size()` - returns size of packing list - --- +
    + ## Appendix A: Product scope **Target user profile** @@ -615,6 +616,8 @@ BagPacker aims to help busy students simplify their packing process by allowing --- +
    + ## Appendix B: User Stories @@ -636,6 +639,8 @@ BagPacker aims to help busy students simplify their packing process by allowing --- +
    + ## Appendix C: Non-Functional Requirements - be able to retrieve the user's packing list quickly and accurately From fbc4821fa01043b4107b0dc4aa18dff909986084 Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 23:40:56 +0800 Subject: [PATCH 204/207] code block horizontal scroll fixed --- docs/DeveloperGuide.md | 38 ++++++++++++++++++++------------------ docs/UserGuide.md | 10 ++++++---- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 55ac0fe8b5..05fd2fa012 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -255,7 +255,8 @@ All Commands: Meaning: Unpacks 1 quantity of the second item in the packing list 6. deletelist: Deletes all items in the packing list. Example: deletelist -7. listunpacked: List all items and their total quantities if they are not fully packed yet. +7. listunpacked: List all items and their total quantities if they are not fully + packed yet. Example: listunpacked 8. editquantity: Edit the total quantity of an item to be packed. Example: editquantity 3 /of 2 @@ -266,7 +267,8 @@ All Commands: 10. unpackall: Fully unpacks an item of choice from the packing list. Example: unpackall /of 3 Meaning: Set the third item in the packing list as totally not packed yet -11. find: Displays all items in the packingList as a list that contains the keyword used in the command. +11. find: Displays all items in the packingList as a list that contains the keyword + used in the command. Example: find jacket 12. bye: Stops the BagPacker Application Example: bye @@ -319,20 +321,20 @@ In the case where there are no items in the list, or all items are fully packed, _**No items:**_ ``` -________________________________________________________________________________________________________________________ +_________________________________________________________________________ listunpacked -________________________________________________________________________________________________________________________ +_________________________________________________________________________ There are no items in your list. What would you like to add? -________________________________________________________________________________________________________________________ +_________________________________________________________________________ ``` **_All items fully packed:_** ``` -________________________________________________________________________________________________________________________ +_________________________________________________________________________ listunpacked -________________________________________________________________________________________________________________________ +_________________________________________________________________________ All items in your list are fully packed! -________________________________________________________________________________________________________________________ +_________________________________________________________________________ ``` @@ -663,7 +665,7 @@ java -jar bagpacker.jar You will see a greeting screen: ``` -________________________________________________________________________________________________________________________ +________________________________________________________________________________ Hi this is, ____ _____ _ | _ \ | __ \ | | @@ -675,10 +677,10 @@ Hi this is, |___/ Enter "help" to find out how to use BagPacker -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ +________________________________________________________________________________ +________________________________________________________________________________ No save files detected. Hello new user! -________________________________________________________________________________________________________________________ +________________________________________________________________________________ ``` You can run a few commands; refer to the [User Guide](https://ay2223s2-cs2113-t14-2.github.io/tp/UserGuide.html) for the full list of commands and the relevant formats, or you can type `help` to see what commands are available. @@ -687,9 +689,9 @@ You can run a few commands; refer to the [User Guide](https://ay2223s2-cs2113-t1 * Example: `add 4 /of jackets` * Expected: ``` - ________________________________________________________________________________________________________________________ + ____________________________________________________________________________ New item added: [0/4] jackets - ________________________________________________________________________________________________________________________ + ____________________________________________________________________________ ``` * You may add in as many items you want to test with varying quantity and item names @@ -753,9 +755,9 @@ You can run a few commands; refer to the [User Guide](https://ay2223s2-cs2113-t1 * Expected: ``` - ________________________________________________________________________________________________________________________ + _________________________________________________________________________ Packing list deleted - ________________________________________________________________________________________________________________________ + _________________________________________________________________________ ``` * This command will replace your packing list with an empty one. @@ -765,7 +767,7 @@ You can run a few commands; refer to the [User Guide](https://ay2223s2-cs2113-t1 * Expected: ``` - ________________________________________________________________________________________________________________________ + __________________________________________________________________________ Bye thanks for using, ____ _____ _ | _ \ | __ \ | | @@ -776,5 +778,5 @@ You can run a few commands; refer to the [User Guide](https://ay2223s2-cs2113-t1 __/ | |___/ - ________________________________________________________________________________________________________________________ + ___________________________________________________________________________ ``` diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 8e1ff1d6b8..3ab22c4d89 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -53,8 +53,8 @@ is unpacked and travel with an ease of mind. |___/ Enter "help" to find out how to use BagPacker - _________________________________________________________________________________ - _________________________________________________________________________________ + _______________________________________________________________________________ + _______________________________________________________________________________ Welcome back, User! ``` @@ -114,11 +114,13 @@ All Commands: Meaning: Change the total quantity of the second item to 3 8. list: List all items and their total quantities packed in packing list. Example: list -9. listunpacked: List all items and their total quantities if they are not fully packed yet. +9. listunpacked: List all items and their total quantities if they are not fully + packed yet. Example: listunpacked 10. deletelist: Deletes all items in the packing list. Example: deletelist -11. find: Displays all items in the packingList as a list that contains the keyword used in the command. +11. find: Displays all items in the packingList as a list that contains the keyword + used in the command. Example: find jacket 12. bye: Stops the BagPacker Application Example: bye From b040234ed059211315cc668850b792f6a22832d4 Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 23:50:24 +0800 Subject: [PATCH 205/207] handled test fix --- src/test/java/bagpacker/iohandlertest/ParserTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index 44e6bf5473..6926830d04 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -193,7 +193,7 @@ public void createPackAllObjTest() { } @Test - public void createUnpackAllObjTest_successful() { + public void createUnpackAllObjTest_unsuccessful() { String userInput1 = " add 2468 /of this item "; String userInput2 = " unpackall /of 1 "; InputStream inStream = new ByteArrayInputStream(userInput1.getBytes()); @@ -202,7 +202,7 @@ public void createUnpackAllObjTest_successful() { Parser.parse().execute(dummyPackingList); inStream = new ByteArrayInputStream(userInput2.getBytes()); System.setIn(inStream); - assertEquals(UnpackAllCommand.class, Parser.parse().getClass()); + assertEquals(IncorrectCommand.class, Parser.parse().getClass()); DeleteListCommand delList = new DeleteListCommand(); delList.execute(dummyPackingList); } From 477950adabdebc5082656f53c55b2d748cf25d91 Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 23:52:57 +0800 Subject: [PATCH 206/207] fix --- src/test/java/bagpacker/iohandlertest/ParserTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/bagpacker/iohandlertest/ParserTest.java b/src/test/java/bagpacker/iohandlertest/ParserTest.java index 6926830d04..1ce6f47f02 100644 --- a/src/test/java/bagpacker/iohandlertest/ParserTest.java +++ b/src/test/java/bagpacker/iohandlertest/ParserTest.java @@ -11,7 +11,6 @@ import bagpacker.commands.ListUnpackedCommand; import bagpacker.commands.PackAllCommand; import bagpacker.commands.PackCommand; -import bagpacker.commands.UnpackAllCommand; import bagpacker.commands.UnpackCommand; import bagpacker.iohandler.Parser; import bagpacker.packingfunc.PackingList; From d320cd96061b829d1fd161dd74063e66e29f24dc Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 23:56:49 +0800 Subject: [PATCH 207/207] io test fix --- text-ui-test/EXPECTED-UNIX.TXT | 12 ++++++------ text-ui-test/EXPECTED.TXT | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/text-ui-test/EXPECTED-UNIX.TXT b/text-ui-test/EXPECTED-UNIX.TXT index 989aff69e4..623818e69c 100644 --- a/text-ui-test/EXPECTED-UNIX.TXT +++ b/text-ui-test/EXPECTED-UNIX.TXT @@ -1,4 +1,4 @@ -________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________ Hi this is, ____ _____ _ | _ \ | __ \ | | @@ -10,11 +10,11 @@ Hi this is, |___/ Enter "help" to find out how to use BagPacker -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________ +________________________________________________________________________________________________________ No save files detected. Hello new user! -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________ +________________________________________________________________________________________________________ Bye thanks for using, ____ _____ _ | _ \ | __ \ | | @@ -25,4 +25,4 @@ Bye thanks for using, __/ | |___/ -________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________ diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 989aff69e4..623818e69c 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,4 +1,4 @@ -________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________ Hi this is, ____ _____ _ | _ \ | __ \ | | @@ -10,11 +10,11 @@ Hi this is, |___/ Enter "help" to find out how to use BagPacker -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________ +________________________________________________________________________________________________________ No save files detected. Hello new user! -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________ +________________________________________________________________________________________________________ Bye thanks for using, ____ _____ _ | _ \ | __ \ | | @@ -25,4 +25,4 @@ Bye thanks for using, __/ | |___/ -________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________

    GH>XtfSPnr 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 PDv6$!k!GcaL&Sdo`9Pb( diff --git a/docs/umlDiagrams/BagPackerClassDiagram.puml b/docs/umlDiagrams/BagPackerClassDiagram.puml index b3769a444d..35f1dfd292 100644 --- a/docs/umlDiagrams/BagPackerClassDiagram.puml +++ b/docs/umlDiagrams/BagPackerClassDiagram.puml @@ -45,15 +45,13 @@ namespace commands #AAAAAA { note right Omitted some child commands to avoid clutter (DeleteList, Help, UnpackAll, ListUnpacked, - and Incorrect Command) + EditQuantity, Bye and Incorrect Command) end note class AddCommand extends Command class DeleteCommand extends Command class ListCommand extends Command - class ByeCommand extends Command - class EditQuantityCommand extends Command class FindCommand extends Command class HelpCommand extends Command class PackCommand extends Command From 41289547813d2e9b707d2a11de2f9726c7d32cc9 Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 16:54:06 +0800 Subject: [PATCH 169/207] docs - Add self contribution docs --- docs/team/coregano.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 docs/team/coregano.md diff --git a/docs/team/coregano.md b/docs/team/coregano.md new file mode 100644 index 0000000000..29f594cc16 --- /dev/null +++ b/docs/team/coregano.md @@ -0,0 +1,40 @@ +# Kim Tae Won - Project Portfolio Page + +## Overview + +BagPacker is a desktop Command Line Interface (CLI) application used to manage a user's packing list. +It stores a packing list, edit the quantities packed and the total quantity packed of an item, and searches the packing list for items. +It is written in Java, and has about 3 kLoC. + +## Summary of Contributions + +--- + +### Code contributed + +543 LoC contributed ([tP Code Dashboard](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=t14&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=coregano&tabRepo=AY2223S2-CS2113-T14-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)) +- 42 Documentation +- 456 functional-code +- 40 test-code + +--- +### Enhancements implemented + +1. Designed main infrastructure of creating and executing commands in `BagPacker` +2. Added main class and subclasses of `Command` ([#10](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/10/commits)) +3. Added `Storage` class + - Management of the storage and retrieval of user's packing list ([#133](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/134/commits)) +4. Create feature `find` ([#142](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/142/commits)) +5. Added J-Unit Tests for `Storage` ([#157](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/157/commits)) + +--- +### Contributions to the [DG](../DeveloperGuide.md) + +--- +### Contributions to team-based tasks + +--- +### Review/Mentoring Contributions + +--- + From d72f25a794457a39d7f4494a4f67d7b895c437cb Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 17:48:03 +0800 Subject: [PATCH 170/207] Add Parser Class to DG --- docs/DeveloperGuide.md | 103 ++++++++++++++++++++++++++++++++++------- 1 file changed, 85 insertions(+), 18 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 14b28699d9..205bf132da 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -5,8 +5,9 @@ * **Setting up, getting started** * **Design** * [Architecture](#architecture) - * [commands Package](#bagpacker-command-mechanisms-) - - Command + * [BagPacker Mechanism](#bagpacker-mechanism) + * [commands Package](#commands-package) + - [Command](#command) - [AddCommand](#add-command) - [ByeCommand](#bye-command) - [DeleteCommand](#delete-command) @@ -27,19 +28,18 @@ - [InvalidQuantityException](#invalidquantityexception) - [InvalidVariablesException](#invalidvariablesexception) * **[iohandler Pakage](#iohandler-package)** - - Parser + - [Parser](#parser-class) - Storage - Ui * **[packingfunc Package](#packingfunc-package)** - Item - PackingList -* **Documentation, logging, testing, configuration, dev-ops** -* **Appendix: Requirements** - * Product scope - * User stories - * Use cases - * Non-Functional Requirements - * Glossary +* **[Documentation, logging, testing, configuration, dev-ops](#documentation-logging-testing-configuration-dev-ops)** +* **[Appendix: Requirements](#appendix--requirements)** + * [Product scope](#product-scope) + * [User stories](#user-stories) + * [Non-Functional Requirements](#non-functional-requirements) + * [Glossary](#glossary) @@ -53,7 +53,7 @@ This project is based on the AddressBook-Level3 project created by the SE-EDU in --- ### Setting up, getting started -Refer to the [user guide]([UserGuide.md](UserGuide.md)) for more details +Refer to the [UserGuide.md](UserGuide.md) for more details ##### Architecture @@ -62,12 +62,27 @@ Refer to the [user guide]([UserGuide.md](UserGuide.md)) for more details The Architecture of BagPacker Application can be seen from the diagram above -BagPacker components of the architecture (similar to a standard main() class) +BagPacker() role is similar to a how a standard main() class acts in Java programs -`BagPacker` is responsible for +`BagPacker` is responsible for, +- At app launch: Initializes the components in the correct sequence. Retrieves saved packing list if any. +- Running the main app: Calls 'BagPacker.runBagPacker()' which runs the main program for BagPacker application. (including execution of commands) +- At shut down: Shuts down the components and invokes cleanup methods where necessary. Saves the current packing list. -### Commands component +##### runBagPacker() Mechanism + +Run Condition: ByeCommand.isBagPackerRunning + +While Loop (if Run Condition is true): +1. `Parser.parse()` the user input which involves reading, getting command variables, and creating of relevant command object. (more info in [Parser](#parser-class)) +2. execute the relevant command returned from `Parser.parse()` + +This can be seen from the interactions between `:BagPacker` and `:Parser` in the diagram below. + +![BagPackerSequenceDiagram.png](diagrams%2FBagPackerSequenceDiagram.png) + +### Commands Package For all valid commands, the mechanism of implementation are as follows: 1. If `ByeCommand.isBagPackerRunning` is true, keep looping through steps 2-4 @@ -76,9 +91,7 @@ For all valid commands, the mechanism of implementation are as follows: 4. Execute command object - ```runBagPacker()``` method executes the ```.execute()``` method (overridden by child classes) of the command object which runs the actual command function -Below shows a sequence diagram of the above explanation - -![BagPackerSequenceDiagram.png](diagrams%2FBagPackerSequenceDiagram.png) +Refer to the sequence diagram in [runBagPacker() Mechanism](#runbagpacker---mechanism) for a visual aid of the above explanation. --- @@ -323,7 +336,7 @@ Mechanism: `DeleteListCommand.execute()` reassigns the existing `packingList` to #### Bye Command `ByeCommand` is used to exit the BagPacker application. -Mechanism: `ByeCommand.execute()`updates the static boolean `isBagPackerRunning` to be false. +Mechanism: `ByeCommand.execute()` updates the static boolean `isBagPackerRunning` to be false. The `runBagPacker()` method will continually parse and execute relevant commands (refer to Command Mechanisms in DG) until `isBagPackerRunning == false` which occurs upon the execution of the `byeCommand`. @@ -402,6 +415,60 @@ all createCommandObj methods except for commands without input variables (i.e. e --- ### iohandler package +### parser class +The Parser class has 2 main functions: +1. Reading and retrieving the relevant command, and command variables from the users input (get*CommandVariable()*) +2. Creating a command object based on the retrieved command and command variables (create*Command*Obj()) + +##### get*CommandVariable*() methods: +`getCommand()` - returns the command from user input by finding the first word and changing it to lower case. + +`getItemIndex()` - returns a string which represents the index of the item from the user input. Used by `createDeleteObj()`. + +`getKeyword()` - return the keyword Used by `createFindObj()`. + +`getAddVariables()` - returns the relevant components of an add command from the user input. Used by `createAddObj()`. + +`getEditQuantityVariables()` - returns the target item's quantity and item index. Used by `createEditQuantityObj()`. + +`getPackVariables()` - returns the target item's quantity to be packed and item index. Used by `createPackObj()` and `createUnpackObj`. + +`getPackAllIndex()` - returns the item Index of the item to set as fully packed. Used by `createPackAllObj()` and `createUnpackAllObj`. . + +##### create*Command*Obj() methods: +All erroneous inputs will instead return `IncorrectCommand()` with respective error messages. Go to [Exceptions](#exceptions) to see more details + +The following show the respective create methods for each command. The `command` object they return will be executed in `BagPacker()` + +`createAddObj()` - returns new `AddCommand(item)` + +`createDeleteObj()` - returns new `DeleteCommand(itemIndex)` + +`createPackObj()` - returns new `PackCommand(itemQuantity, itemIndex)` + +`createUnpackObj()` - returns new `UnpackCommand(itemQuantity, itemIndex)` + +`createListObj()` - returns new `ListCommand()` + +`createListUnpackedObj()` - returns new `ListUnpackedCommand()` + +`createHelpObj()` - returns new `HelpCommand()` + +`createDeleteListObj()` - returns new `DeleteListCommand()` + +`createPackAllObj()` - returns new `PackAllCommand(itemIndex)` + +`createUnpackAllObj()` - returns new `UnpackAllCommand(itemIndex)` + +`createEditQuantityObj()` - returns new `EditQuantityCommand(newTotalQuantity, itemIndex)` + +`createFindObj()` - returns new `FindCommand(keyword)` + +`createByeObj()` - returns new `ByeCommand()` + +`IncorrectCommand()` - of format `IncorrectCommand(errorType, helpMessage)` is returned for any [Exceptions](#exceptions) caught. + + --- ### packingfunc package From d603023fad70e0f1479a97390fbcf03d7b3c4041 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 17:51:44 +0800 Subject: [PATCH 171/207] Refactor DG --- docs/DeveloperGuide.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 92e7a6f7ad..0827872eb7 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -5,7 +5,7 @@ * **Setting up, getting started** * **Design** * [Architecture](#architecture) - * [BagPacker Mechanism](#bagpacker-mechanism) + * [BagPacker Mechanism](#runbagpacker---mechanism) * [commands Package](#commands-package) - [Command](#command) - [AddCommand](#add-command) @@ -27,11 +27,11 @@ - [InvalidIndexException](#invalidindexexception) - [InvalidQuantityException](#invalidquantityexception) - [InvalidVariablesException](#invalidvariablesexception) - * **[iohandler Pakage](#iohandler-package)** + * **[iohandler Pakage](#iohandler)** - [Parser](#parser-class) - Storage - Ui - * **[packingfunc Package](#packingfunc-package)** + * **[packingfunc Package]()** - Item - PackingList * **[Documentation, logging, testing, configuration, dev-ops](#documentation-logging-testing-configuration-dev-ops)** @@ -393,10 +393,10 @@ all createCommandObj methods except for commands without input variables (i.e. e ### IOHandler -The `IOHandler` package contains three main classes, which are [Parser](#parser), [Storage](#storage) and [Ui](#ui). These classes are used to handle input from and output to the user through the CLI, -while managing the storage and retrieval of the associated `item`s in the user's `packingList`. +The `IOHandler` package contains three main classes, which are [Parser](#parser-class), [Storage](#storage) and [Ui](#ui). These classes are used to handle input from and output to the user through the CLI, +while managing the storage and retrieval of the associated `item`'s in the user's `packingList`. -### parser class +### Parser Class The Parser class has 2 main functions: 1. Reading and retrieving the relevant command, and command variables from the users input (get*CommandVariable()*) 2. Creating a command object based on the retrieved command and command variables (create*Command*Obj()) @@ -417,6 +417,7 @@ The Parser class has 2 main functions: `getPackAllIndex()` - returns the item Index of the item to set as fully packed. Used by `createPackAllObj()` and `createUnpackAllObj`. . ##### create*Command*Obj() methods: + All erroneous inputs will instead return `IncorrectCommand()` with respective error messages. Go to [Exceptions](#exceptions) to see more details The following show the respective create methods for each command. The `command` object they return will be executed in `BagPacker()` @@ -450,9 +451,6 @@ The following show the respective create methods for each command. The `command` `IncorrectCommand()` - of format `IncorrectCommand(errorType, helpMessage)` is returned for any [Exceptions](#exceptions) caught. ---- -#### Parser - --- #### Storage From 4478813d60c5e1f036020d3902c62a1dc4889756 Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 18:49:44 +0800 Subject: [PATCH 172/207] docs - instructions for manual testing 50% complete --- docs/DeveloperGuide.md | 76 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 5 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index a36953a6f8..f9462cb6bf 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -395,6 +395,7 @@ The constructor of this class, which is called in `BagPacker`, will set the `fil `save()` calls the method `writeToFile`, which loops through the `packingList` to write every `item` to a file in the `file_path` using a `FileWriter`. Each `item` is written on a newline with a format using `.toString()`, which is `[PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME`. + Example: ```text [0/4] jackets @@ -405,13 +406,20 @@ Example: `load()` is called at the start of `main()` in `BagPacker`. This method reads in the file in `file_path` and translates each line to construct an `item`. -This is done by the method `readItem()`, which marks out the relevant variables for `packedQuantity`, `totalQuantity` and `itemName` in a line, then uses the overloaded constructor method in `Item` class to form an item. +This is done by the method `readItem()`, which marks out the relevant variables for `packedQuantity`, `totalQuantity` and `itemName` in a line, then uses a constructor method in `Item` class to form an item. Each `item` is returned to `load()` and added to the packingList. --- #### Ui +The `Ui` class is the main component of `BagPacker`'s Command Line Interface (CLI) interface. +It is responsible for handling most of start-up and farewell messages, the CLI output, including error messages, information messages, and confirmation prompts after every `command.execute()`. + +Some important methods are: +`printToUser()` - takes variable arity parameter of type `String` to print to the user +`helpMessage()` - prints out the list of available commands and the respective formats +`errorMessage()` - shows the error type and help message to the user in the case an error occurs --- @@ -420,6 +428,7 @@ Each `item` is returned to `load()` and added to the packingList. ### Appendix: Requirements + #### Product scope **Target user profile** @@ -428,15 +437,12 @@ Each `item` is returned to `load()` and added to the packingList. * Prefers typing to mouse interactions * Is reasonably comfortable using CLI apps - - **Value proposition** BagPacker aims to help busy students simplify their packing process by allowing easy adding of items to pack and record of the items they have already packed so that they can be organised and aboard their travels with ease. - -##### User Stories +#### User Stories | Version | As a ... | I want to ... | So that I can ... | |---------|----------|------------------------------------------------|------------------------------------------------------------------------------| @@ -470,4 +476,64 @@ BagPacker aims to help busy students simplify their packing process by allowing ### Instructions for manual testing +Download the jar file from [here](https://github.com/AY2223S2-CS2113-T14-2/tp/releases/tag/v2.1) and run `BagPacker` in a terminal with the command +``` +java -jar bagpacker.jar +``` + +You will see a greeting screen: +```text +________________________________________________________________________________________________________________________ +Hi this is, + ____ _____ _ +| _ \ | __ \ | | +| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ +| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| +| |_) | (_| | (_| | | | (_| | (__| < __/ | +|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ + +Enter "help" to find out how to use BagPacker +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ +No save files detected. Hello new user! +________________________________________________________________________________________________________________________ + +``` +You can run a few commands; refer to the [User Guide]() for the full list of commands and the relevant formats, or you can type `help` to see what commands are available. + +* Try adding a few items using the `add` command + * Example: `add 4 /of jackets` + * Expected: + ```text + ________________________________________________________________________________________________________________________ + New item added: [0/4] jackets + ________________________________________________________________________________________________________________________ + ``` + * You may add in as many items you want to test with varying quantity and item names + +* Try packing the items added using the `pack` command + * Example: `pack 2 /of 1` + * Expected: A message showing that the first item pas been packed with quantity of 2. + * You may pack other items with different quantities. + +* Try to see your current packing list with the `list` command + * Example: `list` + * Expected: A message showing every item in the packing list with the respective item index, packed quantity, total quantity and item name. + * You may use this command everytime you wish to see your packing list. + +* Try deleting some items using the `delete` command + * Example: `delete 1` + * Expected: A message showing the removal of the item with its packed quantity and total quantity. + * You may delete any item added to the list at any time. + +* Try using the `` command + * Example: `` + * Expected: A message showing + + + + + {Give instructions on how to do a manual product testing e.g., how to load sample data to be used for testing} From 622f3813fe2d8e47bc39c526376a0c6017b06d8f Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 19:09:30 +0800 Subject: [PATCH 173/207] Update Linus' PPP --- docs/team/linuspuah.md | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/docs/team/linuspuah.md b/docs/team/linuspuah.md index 5b7a2309f9..d1cf986a9d 100644 --- a/docs/team/linuspuah.md +++ b/docs/team/linuspuah.md @@ -9,7 +9,7 @@ --- ##### Code contributed -1242 LOC contributed ([tP Code Dashboard](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=linuspuah&tabRepo=AY2223S2-CS2113-T14-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)) +2266 LOC contributed ([tP Code Dashboard](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=linuspuah&tabRepo=AY2223S2-CS2113-T14-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)) - 71 lines documentation - 483 function-code - 534 test-code @@ -23,15 +23,16 @@ 2. Enhance `AddCommand` function - Create feature to deal with adding of repeated items ([#137](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/137)) 3. Error catching and Bug Handling - - Added various Exceptions in `exception` package ([#37](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/37/commits/ed24adb50654c55001ebe477d860c36cb6a6b9d5)) + - Added various Exceptions in `exception` package ([#37](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/37/commits/ed24adb50654c55001ebe477d860c36cb6a6b9d5), [#165](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/165/commits)) - Added try-catch statements to deal with functional errors ([#79](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/79/commits)) - - Bug Handling ([#36](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/36/files), ) + - Bug Handling ([#36](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/36/files),[[#167](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/167/files)) 4. Refactor packing list to use `ArrayList<>` instead of `String[]` ([#23](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/23/files#diff-215cdbb994affff07183e82ab3ac790e169e38469c4ec7d920f6ede6d2957f45)) 5. Add J-unit Test for the majority of code base - Command Class J-unit tests ([#140](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/140), [#151](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/151)) 6. Create feature - `listunpacked` ([#151](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/151)) - `deletelist` ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) +7. Add JavaDocs ([#163](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/163/commits)) --- ##### Contributions to the [UG](../UserGuide.md) @@ -40,7 +41,13 @@ ##### Contribution to the [DG](../DeveloperGuide.md) 1. Update User Stories ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) 2. Add explanation of overall command mechanism for the whole application ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) -3. Add explanation and [sequence diagram](#contributions-to-the-developer-guide--extracts--) for feature of adding repeated items in `AddCommand` ([#138](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/138)) +3. Add explanation for Exceptions ([#179](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/179/files#diff-1a95edf069a4136e9cb71bee758b0dc86996f6051f0d438ec2c424557de7160b)) +4. Add explanation for Parser Class ([#184](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/184/files)) +4. Add explanation and [sequence diagram](#contributions-to-the-developer-guide--extracts--) for feature of +- adding repeated items in `AddCommand` ([#138](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/138),[#158](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/158/commits/6d154b8464ba4d57e8d19a958e8be0b554e73cd6#diff-60cb84c47c48c2d69d1f587d9c9ed3af7d99acf2c3b11cd94c8d86eb532e32e2)) +- `runBagPacker()` overall Sequence Diagram ([#176](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/176/commits/0ae5782514e02b5c755b689550d1c595449d1128)) + + --- ##### Contributions to team-based tasks Plan and create the framework for BagPacker application @@ -63,8 +70,8 @@ Managed internal deadlines for group tasking --- ##### Contributions to the Developer Guide (Extracts): - -![AddExistingItemDiagram.png](..%2FumlDiagrams%2FAddExistingItemDiagram.png) +![AddExistingItemDiagram.png](..%2Fdiagrams%2FAddExistingItemDiagram.png)![BagPackerClassDiagram.png](..%2Fdiagrams%2FBagPackerClassDiagram.png)![BagPackerSequenceDiagram.png](..%2Fdiagrams%2FBagPackerSequenceDiagram.png) +![ExceptionClassDiagram.png](..%2Fdiagrams%2FExceptionClassDiagram.png)![ExecutePackCommandSequenceDiagram.png](..%2Fdiagrams%2FExecutePackCommandSequenceDiagram.png)![ExecuteUnpackCommandSequenceDiagram.png](..%2Fdiagrams%2FExecuteUnpackCommandSequenceDiagram.png) --- ##### Contributions to the User Guide (Extracts): From 2662c2edd10d94b9773070d87631e0000c93cf4c Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 19:29:33 +0800 Subject: [PATCH 174/207] Add UG FAQ's --- docs/DeveloperGuide.md | 17 ++++++++++------- docs/UserGuide.md | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 0827872eb7..50e88f96f0 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -52,20 +52,23 @@ This project is based on the AddressBook-Level3 project created by the SE-EDU in --- -### Setting up, getting started +## Setting up, getting started Refer to the [UserGuide.md](UserGuide.md) for more details - +--- +## Design ##### Architecture ![BagPackerClassDiagram.png](diagrams%2FBagPackerClassDiagram.png) ![ExceptionClassDiagram.png](diagrams%2FExceptionClassDiagram.png) -The Architecture of BagPacker Application can be seen from the diagram above - -BagPacker() role is similar to a how a standard main() class acts in Java programs - -`BagPacker` is responsible for, +The Architecture of BagPacker Application can be seen from the diagrams above containing +1. BagPacker() class - role is similar to a how a standard main() class acts in Java programs +2. commands package +3. iohandler package +4. exception package +5. packingfunc package +`BagPacker` is responsible for, - At app launch: Initializes the components in the correct sequence. Retrieves saved packing list if any. - Running the main app: Calls 'BagPacker.runBagPacker()' which runs the main program for BagPacker application. (including execution of commands) - At shut down: Shuts down the components and invokes cleanup methods where necessary. Saves the current packing list. diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 052a9ef600..00c0b830df 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -405,6 +405,26 @@ Example: **A**: Please check that there are no typos in the command. To check the correct spelling of the commands, please type `help` and hit enter. +**Q**: I am following the suggested input, why is it still giving me an error? + +**A**: For command inputs that have item quantity and item index, the / character is necessary before the of (e.g. `pack 1 /of 1` is valid but `pack 1 of 1` is not) + +**Q**: Why are some commands affected by extra random inputs before or after the full command while others aren't? + +**A**: The commands that are not affected by extra inputs are those that have no variables (e.g. `list`, `listunpacked`, `bye`, and `help`) + +**Q**: Why does `editquantity` command give me an error for a positive integer quantity? + +**A**: Your new input quantity may be considered invalid as it is smaller than the current packed amount of the item. (You cannot set the total quantity to be less than what is currently packed) + +**Q**: Why does my list have duplicate items? + +**A**: Item names are caps sensitive, you could have accidentally input two items with the same name but differing in capitalisation. + +**Q**: Why is the list indexes for `find` command not sequential? + +**A**: The index printed for `find` comes from the full packing list which can be retrieved from `list` command. + [⏫ Go to Table of Contents](#table-of-contents) | --- From 655f263699199671142728dd2e0a4a3ef08ec88c Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 19:33:53 +0800 Subject: [PATCH 175/207] Update PPP --- docs/team/shannentan.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/team/shannentan.md b/docs/team/shannentan.md index 2d6ff714c5..68dfa75a70 100644 --- a/docs/team/shannentan.md +++ b/docs/team/shannentan.md @@ -4,16 +4,21 @@ BagPacker is a desktop Command Line Interface (CLI) application used to manage a user's packing list. It stores a packing list, edit the quantities packed and the total quantity packed of an item, and searches the packing list for items. -It is written in Java, and has about 3 kLoC. +It is written in Java, and has about 4 kLoC. ## Summary of Contributions Given below are my contributions to the project. New Feature: `editquantity` - * What it does: allows the user to edit the total quantity of an item at the index specified - * Justification: this feature improves the product significantly as there was no way to reduce the total quantity of an item in teh packing list - * Repeated `add` commands can be used to increase the total quantity of an item, but not reduce it - * Highlights: users are able to edit the total quantity of an item to be packed, without having to delete the current item and add the item again +* What it does: allows the user to edit the total quantity of an item at the index specified +* Justification: this feature improves the product significantly as there was no way to reduce the total quantity of an item in the packing list + * Repeated `add` commands can be used to increase the total quantity of an item, but not reduce it +* Highlights: users are able to edit the total quantity of an item to be packed, without having to delete the current item and add the item again + +New Feature: `list` +* What it does: prints the entire packing list to the user +* Justification: this feature improves the product significantly as there was no way for the user to view the entire packing list +* Highlights: users can see each item's index, current quantity packed, total quantity to be packed, and item name Code contributed: [RepoSense link](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=shannentan&breakdown=true) @@ -25,7 +30,6 @@ Enhancements to existing features * Enhanced the `add`, `pack` and `unpack` commands to support multiple quantities * Involved changing the `Item` constructor, and the respective methods used to parse inputs and execute the commands - Documentation * User Guide * Formatted the User Guide @@ -34,6 +38,7 @@ Documentation * `add`, `delete`, `pack`, `unpack`, `editquantity`, `list`, `deletelist` and `find` * Added the command summary * Developer Guide + * Formatted the Developer Guide Community * Reported bugs and gave suggestions to other teams in the class during [PE-D](https://github.com/shannentan/ped/issues) From 8153ed0e1c225b21f617e8de3a983712c152f178 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 19:34:26 +0800 Subject: [PATCH 176/207] Format Developer Guide --- docs/DeveloperGuide.md | 148 ++++++++++++++++++++++++----------------- 1 file changed, 87 insertions(+), 61 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index a36953a6f8..8aad2944a0 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,47 +1,51 @@ [DeveloperGuide.md](DeveloperGuide.md) # Developer Guide + ## Table of Contents -* **Acknowledgements** -* **Setting up, getting started** -* **Design** - * [Architecture](#architecture) - * [commands Package](#bagpacker-command-mechanisms-) - - Command - - [AddCommand](#add-command) - - [ByeCommand](#bye-command) - - [DeleteCommand](#delete-command) - - [DeleteListCommand](#deletelist-command) - - EditQuantityCommand - - FindCommand - - [HelpCommand](#help-command) - - IncorrectCommand - - [ListCommand](#list-command) - - [ListUnpackedCommand](#list-unpacked-command) - - PackAllCommand - - [PackCommand](#pack-command) - - UnpackAllCommand - - [UnpackCommand](#unpack-command) - * **[exception Package](#exceptions)** - - [EmptyInputException](#emptyinputexception) - - [InvalidIndexException](#invalidindexexception) - - [InvalidQuantityException](#invalidquantityexception) - - [InvalidVariablesException](#invalidvariablesexception) - * **[iohandler Pakage](#iohandler-package)** - - Parser - - Storage - - Ui - * **[packingfunc Package](#packingfunc-package)** - - Item - - PackingList -* **Documentation, logging, testing, configuration, dev-ops** -* **Appendix: Requirements** - * Product scope - * User stories - * Use cases - * Non-Functional Requirements - * Glossary +* [**Acknowledgements**](#acknowledgements) +* [**Setting up, getting started**](#setting-up-getting-started) +* [**Design**](#design) + * [Architecture](#architecture) + * [*Commands component*](#commands-component) + * [*Command*](#command) + * [*AddCommand*](#add-command) + * [*Preventing duplicate items*](#preventing-duplicate-items) + * [*DeleteCommand*](#delete-command) + * [*PackCommand*](#pack-command) + * [*PackAllCommand*] + * [*UnpackCommand*](#unpack-command) + * [*UnpackAllCommand*] + * [*EditQuantityCommand*] + * [*HelpCommand*](#help-command) + * [*ListCommand*](#list-command) + * [*ListUnpackedCommand*](#list-unpacked-command) + * [*FindCommand*](#find-command) + * [*DeleteListCommand*](#deletelist-command) + * [*ByeCommand*](#bye-command) + * [*IncorrectCommand*](#incorrect-command) + + + * [**exception Package**](#exceptions) + * [*EmptyInputException*](#emptyinputexception) + * [*InvalidIndexException*](#invalidindexexception) + * [*InvalidQuantityException*](#invalidquantityexception) + * [*InvalidVariablesException*](#invalidvariablesexception) + * [**iohandler Package**](#iohandler-package) + * [*Parser*] + * [*Storage*] + * [*Ui*] + * [*packingfunc Package*](#packingfunc-package) + * [*Item*] + * [*PackingList*] +* [**Documentation, logging, testing, configuration, dev-ops**](#documentation-logging-testing-configuration-dev-ops) +* [**Appendix A: Product Scope**](#appendix-a--product-scope) +* [**Appendix B: User Stories**](#appendix-b--user-stories) +* [**Appendix C: Non-Functional Requirements**](#appendix-c--non-functional-requirements) +* [**Appendix D: Glossary**](#appendix-d--glossary) +* [**Appendix E: Instructions for Manual Testing**](#appendix-e--instructions-for-manual-testing) +--- ## Acknowledgements @@ -50,13 +54,16 @@ This project is based on the AddressBook-Level3 project created by the SE-EDU in * [AB3 User Guide](https://se-education.org/addressbook-level3/UserGuide.html) * [AB3 Developer Guide](https://se-education.org/addressbook-level3/DeveloperGuide.html) - --- -### Setting up, getting started + +## Setting up, getting started Refer to the [user guide]([UserGuide.md](UserGuide.md)) for more details +--- + +## Design -##### Architecture +### Architecture ![BagPackerClassDiagram.png](diagrams%2FBagPackerClassDiagram.png) ![ExceptionClassDiagram.png](diagrams%2FExceptionClassDiagram.png) @@ -66,6 +73,7 @@ BagPacker components of the architecture (similar to a standard main() class) `BagPacker` is responsible for +--- ### Commands component @@ -87,7 +95,7 @@ Below shows a sequence diagram of the above explanation The `Command` abstract class is used to create subclasses of commands for BagPacker. The constructor `Command()` takes in an integer of `targetIndex` which sets the internal `targetIndex` value. `targetIndex` is used for certain commands such as delete, pack, and edit, where the `index` of a certain `item` in the `packingList` is important in the command. An `item` of that index will be extracted out using `getTargetItem()`. - +--- #### Add Command @@ -96,9 +104,7 @@ Add command is used to add a quantity of item(s) to the packing list. Mechanism: ```AddCommand.execute()``` calls the ```PackingList.addItem()``` method from the ```PackingList``` class which executes the ```ArrayList.add()``` method to add the item to the ```PackingList``` ArrayList. It then updates the ```quantity``` variable according to the quantity inputted by the user. - - -##### Preventing duplicate items +###### Preventing duplicate items When using the `add` function, we have decided to implement a method to check whether an item with the same name already exists in the packingList. @@ -118,6 +124,7 @@ If `PackingList.itemFinder()` returns false, the item will be added onto `packin In both scenarios, the relevant `ui.printToUser` messages (omitted in the sequence diagram for easier reading) will be called to print a message to the user. +--- #### Delete Command @@ -125,6 +132,7 @@ Delete command is used to delete an item from the packing list. Mechanism: ```DeleteCommand.execute()``` calls the ```PackingList.deleteItem()``` method from the ```PackingList``` class which executes the ```ArrayList.remove()``` method to remove the item from the ```PackingList``` ArrayList. +--- #### Pack Command @@ -147,6 +155,11 @@ Lastly `Ui.printToUser(MSG_SUCCESS_PACK, item)` from `Ui` class is called to pri Sequence Diagram of Successful `PackCommand.execute()` +--- + +#### PackAllCommand + +___ #### Unpack Command @@ -171,6 +184,7 @@ Sequence Diagram of Successful `UnpackCommand.execute()` --- #### Help Command + Help command is used to display all the possible commands in the BagPacker application for the user. Execute: ```HelpCommand.execute()``` prints the following help message. @@ -210,6 +224,7 @@ All Commands: Example: bye ____________________________________________________________ ``` + --- #### List Command @@ -280,6 +295,7 @@ ________________________________________________________________________________ --- #### Find Command + `FindCommand` is used to find all items containing the keyword(s) provided. Mechanism: `FindCommand.execute()` calls `PackingList.keywordFinder()` with the given `keyword`. This method loops through every `item` in `packingList` to see if the `itemName` for each `item` contains the keyword(s) given. @@ -288,6 +304,7 @@ The `item`(s) that contain the keyword are placed into an ArrayList with their ` --- #### DeleteList Command + `DeleteListCommand` is used to delete all items inside `packingList`. Mechanism: `DeleteListCommand.execute()` reassigns the existing `packingList` to a new empty ArrayList of Items, thus deleting any items in `packingList`. @@ -295,6 +312,7 @@ Mechanism: `DeleteListCommand.execute()` reassigns the existing `packingList` to --- #### Bye Command + `ByeCommand` is used to exit the BagPacker application. Mechanism: `ByeCommand.execute()`updates the static boolean `isBagPackerRunning` to be false. @@ -313,7 +331,9 @@ Mechanism: `IncorrectCommand.execute()` will print the relevant error message to --- + ### Exceptions + The `exceptions` package contains all exceptions within BagPacker that are thrown when an error is detected. This is done to allow the program to continue running and to elegantly handle any potential app stopping errors. @@ -330,6 +350,7 @@ Caught in: #### InvalidIndexException + The `InvalidIndexException` is thrown when the user inputs an item index that is out of bounds of the `PackingList` or greater than 1,000,000 Thrown by: @@ -346,6 +367,7 @@ Thrown and caught in: #### InvalidQuantityException + The `InvalidQuantityException` is thrown when the user inputs a quantity of an item that is invalid. This differs depending on the respective Command. Invalid Quantity definition: @@ -363,6 +385,7 @@ Thrown and caught in: #### InvalidVariablesException + The `InvalidVariablesException` is thrown when the user inputs the wrong number of variables for commands with input variables (i.e. excluding `help`, `list`, `bye`, `deletelist` and `listunpacked` commands) Thrown by: @@ -378,29 +401,33 @@ all createCommandObj methods except for commands without input variables (i.e. e --- - ### IOHandler + The `IOHandler` package contains three main classes, which are [Parser](#parser), [Storage](#storage) and [Ui](#ui). These classes are used to handle input from and output to the user through the CLI, while managing the storage and retrieval of the associated `item`s in the user's `packingList`. --- + #### Parser --- + #### Storage + The `Storage` class consists of two main methods: `save()` and `load()`. The constructor of this class, which is called in `BagPacker`, will set the `file_path` of storage, which is default at "packingList.txt". `save()` calls the method `writeToFile`, which loops through the `packingList` to write every `item` to a file in the `file_path` using a `FileWriter`. Each `item` is written on a newline with a format using `.toString()`, which is `[PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME`. + Example: -```text -[0/4] jackets -[2/4] cats -[0/3] toothbrush -``` + ``` + [0/4] jackets + [2/4] cats + [0/3] toothbrush + ``` `load()` is called at the start of `main()` in `BagPacker`. This method reads in the file in `file_path` and translates each line to construct an `item`. @@ -410,6 +437,7 @@ This is done by the method `readItem()`, which marks out the relevant variables Each `item` is returned to `load()` and added to the packingList. --- + #### Ui @@ -419,8 +447,7 @@ Each `item` is returned to `load()` and added to the packingList. ## Documentation, logging, testing, configuration, dev-ops -### Appendix: Requirements -#### Product scope +## Appendix A: Product scope **Target user profile** * Has a need to pack items for travel purposes @@ -428,15 +455,13 @@ Each `item` is returned to `load()` and added to the packingList. * Prefers typing to mouse interactions * Is reasonably comfortable using CLI apps - - **Value proposition** BagPacker aims to help busy students simplify their packing process by allowing easy adding of items to pack and record of the items they have already packed so that they can be organised and aboard their travels with ease. +--- - -##### User Stories +## Appendix B: User Stories | Version | As a ... | I want to ... | So that I can ... | |---------|----------|------------------------------------------------|------------------------------------------------------------------------------| @@ -456,18 +481,19 @@ BagPacker aims to help busy students simplify their packing process by allowing --- -#### Non-Functional Requirements +## Appendix C: Non-Functional Requirements - be able to retrieve the user's packing list quickly and accurately - the quantity of each item to be packed should not be unreasonably large +--- -#### Glossary +## Appendix D: Glossary * *CLI* - Command Line Interface --- -### Instructions for manual testing +## Appendix E: Instructions for Manual Testing {Give instructions on how to do a manual product testing e.g., how to load sample data to be used for testing} From 9255f527ddf8e3af3ce6f39c9d6c6f754b74910c Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 19:41:20 +0800 Subject: [PATCH 177/207] docs - add instructions for manual testing in developer docs fix - test for io --- .gitignore | 1 + docs/DeveloperGuide.md | 48 ++++++++++++++++++++--- text-ui-test/EXPECTED.TXT | 82 --------------------------------------- text-ui-test/input.txt | 16 -------- text-ui-test/runtest.sh | 6 ++- 5 files changed, 47 insertions(+), 106 deletions(-) diff --git a/.gitignore b/.gitignore index 64b484c164..354d55e29a 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ bin/ packList.txt packingList.txt packing_list.txt +text-ui-test/EXPECTED-UNIX.TXT diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 5ec9a320b9..b53791c295 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -578,27 +578,63 @@ You can run a few commands; refer to the [User Guide]() for the full list of com ``` * You may add in as many items you want to test with varying quantity and item names + * Try packing the items added using the `pack` command * Example: `pack 2 /of 1` - * Expected: A message showing that the first item pas been packed with quantity of 2. + * Expected: A message showing that the first item has been packed with quantity of 2. * You may pack other items with different quantities. + * Try to see your current packing list with the `list` command * Example: `list` - * Expected: A message showing every item in the packing list with the respective item index, packed quantity, total quantity and item name. + * Expected: A list showing every item in the packing list with the respective item index, packed quantity, total quantity and item name. * You may use this command everytime you wish to see your packing list. + * Try deleting some items using the `delete` command * Example: `delete 1` * Expected: A message showing the removal of the item with its packed quantity and total quantity. * You may delete any item added to the list at any time. -* Try using the `` command - * Example: `` - * Expected: A message showing + +* Try unpacking an item using the `unpack` command + * Example: `unpack 1 /of 1` + * Expected: A message showing the first item has been unpacked with quantity of 1, assuming that it had a packed quantity of 1 or more. + * You may unpack other items with different quantities given that they are packed to a certain amount beforehand. + + +* Try editing the total quantity of an item using the `editquantity` command + * Example: `editquantity 3 /of 1` + * Expected: A message showing the first item has changed its total quantity to 3. + * You may change the total quantity of other items with different total quantity values. +* Try searching an item containing a certain keyword or keyphrase using the `find` command + * Example: `find jac` + * Expected: A message showing all the items containing "jac" in their item names, with their item index, packed quantity and total quantity. + * You may search using other keyword(s) +* Try seeing all not fully packed items added using the `listunpacked` command + * Example: `listunpacked` + * Expected: A list showing all items that are not fully packed. + * This command will show different results if all items are fully packed, or if there are no items in your packing list. -{Give instructions on how to do a manual product testing e.g., how to load sample data to be used for testing} + +* To exit `BagPacker`, use the `bye` command + * Example: `bye` + * Expected: + ``` + ________________________________________________________________________________________________________________________ + Bye thanks for using, + ____ _____ _ + | _ \ | __ \ | | + | |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ + | _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| + | |_) | (_| | (_| | | | (_| | (__| < __/ | + |____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ + + ________________________________________________________________________________________________________________________ + ``` diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index f281b8eb91..989aff69e4 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -15,88 +15,6 @@ ________________________________________________________________________________ No save files detected. Hello new user! ________________________________________________________________________________________________________________________ ________________________________________________________________________________________________________________________ -All Commands: -1. add: Adds quantity and name of item to the packing list. - Example: add 3 /of toothbrush - Meaning: Add quantity of 3 toothbrushes to the packing list -2. delete: Deletes an item from the packing list. - Example: delete 1 - Meaning: Removes the first item in the packing list -3. list: List all items and their total quantities packed in packing list. - Example: list -4. pack: Adds to the current quantity of items packed in the packing list. - Example: pack 2 /of 3 - Meaning: Packs 2 more quantities of the third item in the packing list -5. unpack: Deducts from the current quantity of items packed in the packing list. - Example: unpack 1 /of 2 - Meaning: Unpacks 1 quantity of the second item in the packing list -6. deletelist: Deletes all items in the packing list. - Example: deletelist -7. listunpacked: List all items and their total quantities if they are not fully packed yet. - Example: listunpacked -8. editquantity: Edit the total quantity of an item to be packed. - Example: editquantity 3 /of 2 - Meaning: Change the total quantity of the second item to 3 -9. packall: Fully pack an item of choice from the packing list. - Example: packall /of 3 - Meaning: Set the third item in the packing list as fully packed -10. unpackall: Fully unpacks an item of choice from the packing list. - Example: unpackall /of 3 - Meaning: Set the third item in the packing list as totally not packed yet -11. find: Displays all items in the packingList as a list that contains the keyword used in the command. - Example: find jacket -12. bye: Stops the BagPacker Application - Example: bye -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ -New item added: [0/4] jackets -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ -New item added: [0/3] cats -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ -New item added: [0/1] bag -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ -Here are the items in your list -1. [0/4] jackets -2. [0/3] cats -3. [0/1] bag -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ -Item total quantity edited: [0/2] bag -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ -Item packed: [2/3] cats -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ -Item packed: [4/4] jackets -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ -Here are the unpacked items in your list -1. [2/3] cats -2. [0/2] bag -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ -Item unpacked: [1/3] cats -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ -There are 1 items(s) in your list containing cats: -2. [1/3] cats -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ -Item packed: [3/3] cats -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ -Item unpacked: [0/4] jackets -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ -Here are the items in your list -1. [0/4] jackets -2. [3/3] cats -3. [0/2] bag -________________________________________________________________________________________________________________________ -________________________________________________________________________________________________________________________ Bye thanks for using, ____ _____ _ | _ \ | __ \ | | diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 3df0133537..b023018cab 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,17 +1 @@ -help - -add 4 /of jackets - -add 3 /of cats -add 1 /of bag -list -editquantity 2 /of 3 -pack 2 /of 2 -pack 4 /of 1 -listunpacked -unpack 1 /of 2 -find cats -packall /of 2 -unpackall /of 1 -list bye diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index 8e18a39300..ec03a435af 100755 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -10,9 +10,11 @@ cd text-ui-test java -jar $(find ../build/libs/ -mindepth 1 -print -quit) < input.txt > ACTUAL.TXT -rm data.txt -diff <(tr -d '\r' Date: Mon, 10 Apr 2023 20:21:01 +0800 Subject: [PATCH 178/207] docs - item for dev guide --- docs/DeveloperGuide.md | 32 +++++++++++++++++++++++++++++--- docs/team/coregano.md | 12 +++++++----- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 1aea16da50..1fc2e80e46 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -13,7 +13,7 @@ - [DeleteCommand](#delete-command) - [DeleteListCommand](#deletelist-command) - EditQuantityCommand - - FindCommand + - [FindCommand](#find-command) - [HelpCommand](#help-command) - IncorrectCommand - [ListCommand](#list-command) @@ -29,8 +29,8 @@ - [InvalidVariablesException](#invalidvariablesexception) * **[iohandler Pakage](#iohandler)** - [Parser](#parser-class) - - Storage - - Ui + - [Storage](#storage) + - [Ui](#ui) * **[packingfunc Package]()** - Item - PackingList @@ -489,6 +489,32 @@ Some important methods are: `helpMessage()` - prints out the list of available commands and the respective formats `errorMessage()` - shows the error type and help message to the user in the case an error occurs +--- +### Packingfunc +The `Packingfunc` package consists of `Item` and `PackingList` classes, which are used to manage the main packing list of `BagPacker`, and its individual items. + +#### Item +The `Item` class contains methods used to manage and manipulate the variables `packedQuantity` and `totalQuantity`. + +There are two constructors of `Item`: + +1. `public Item(int quantity, String description)` +2. `public Item(int totalQuantity, int packedQuantity, String description)` + +The first constructor is used to create `item` objects during an `add` command in `Parser.parse()`. +The latter is used in [storage](#storage) to create `item` objects from the packing list save file during `load()`. + +The `toString()` method returns a `String` containing the packed quantity, total quantity and item name in a specific format. + +It is used in multiple [commands](#commands-package) and [storage](#storage) to save the packing list onto a save file. + +`checkFullyPacked()` is used in [listunpacked](#list-unpacked-command) to return whether the item is fully packed by comparing packedQuantity to totalQuantity. + +`setPacked()` and `setUnpacked()` is used in `packItem()` and `unpackItem()` (both methods in [Parser](#parser-class)) to change the packed quantity of the item. + + +#### PackingList + --- diff --git a/docs/team/coregano.md b/docs/team/coregano.md index 29f594cc16..dcea849d6e 100644 --- a/docs/team/coregano.md +++ b/docs/team/coregano.md @@ -4,7 +4,7 @@ BagPacker is a desktop Command Line Interface (CLI) application used to manage a user's packing list. It stores a packing list, edit the quantities packed and the total quantity packed of an item, and searches the packing list for items. -It is written in Java, and has about 3 kLoC. +It is written in Java, and has about 4k LoC. ## Summary of Contributions @@ -12,10 +12,10 @@ It is written in Java, and has about 3 kLoC. ### Code contributed -543 LoC contributed ([tP Code Dashboard](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=t14&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=coregano&tabRepo=AY2223S2-CS2113-T14-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)) -- 42 Documentation -- 456 functional-code -- 40 test-code +___ LoC contributed ([tP Code Dashboard](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=t14&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=coregano&tabRepo=AY2223S2-CS2113-T14-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)) +- __ Documentation +- __ functional-code +- __ test-code --- ### Enhancements implemented @@ -29,6 +29,8 @@ It is written in Java, and has about 3 kLoC. --- ### Contributions to the [DG](../DeveloperGuide.md) +1. Add Instructions for Manual Testing ([]()) +2. --- ### Contributions to team-based tasks From 3f411ed746249a5cb218ec940d41502c15ba0cb9 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 20:30:18 +0800 Subject: [PATCH 179/207] Recolour DG and PPP headers --- docs/DeveloperGuide.md | 11 +++++------ docs/team/johndoe.md | 5 ----- docs/team/linuspuah.md | 44 +++++++++++++++++++----------------------- 3 files changed, 25 insertions(+), 35 deletions(-) delete mode 100644 docs/team/johndoe.md diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 50e88f96f0..9cfb252c08 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,6 +1,6 @@ [DeveloperGuide.md](DeveloperGuide.md) # Developer Guide -## Table of Contents +## Table of contents * **Acknowledgements** * **Setting up, getting started** * **Design** @@ -56,7 +56,7 @@ This project is based on the AddressBook-Level3 project created by the SE-EDU in Refer to the [UserGuide.md](UserGuide.md) for more details --- -## Design +## Design ##### Architecture ![BagPackerClassDiagram.png](diagrams%2FBagPackerClassDiagram.png) ![ExceptionClassDiagram.png](diagrams%2FExceptionClassDiagram.png) @@ -483,11 +483,10 @@ Each `item` is returned to `load()` and added to the packingList. --- +## Documentation, logging, testing, configuration, dev-ops -## Documentation, logging, testing, configuration, dev-ops - - -### Appendix: Requirements +--- +## Appendix: Requirements #### Product scope **Target user profile** diff --git a/docs/team/johndoe.md b/docs/team/johndoe.md deleted file mode 100644 index 3f71e55207..0000000000 --- a/docs/team/johndoe.md +++ /dev/null @@ -1,5 +0,0 @@ - -## Overview - - -### Summary of Contributions diff --git a/docs/team/linuspuah.md b/docs/team/linuspuah.md index d1cf986a9d..8a8b3cb458 100644 --- a/docs/team/linuspuah.md +++ b/docs/team/linuspuah.md @@ -1,22 +1,24 @@ [LinusPortfolio.md](linuspuah.md) # portfolio -# Linus Puah Jia He - Project Portfolio Page -## Overview - -### Summary of Contributions +# Linus Puah Jia He - Project Portfolio Page +## Overview +BagPacker is a desktop Command Line Interface (CLI) application used to manage a user's packing list. +It stores a packing list, edit the quantities packed and the total quantity packed of an item, and searches the packing list for items. +It is written in Java, and has about 4k LoC. --- +## Summary of Contributions + -##### Code contributed +### Code Contributed 2266 LOC contributed ([tP Code Dashboard](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=linuspuah&tabRepo=AY2223S2-CS2113-T14-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)) - - 71 lines documentation - - 483 function-code - - 534 test-code + - 628 lines documentation + - 868 function-code + - 770 test-code --- - -##### Enhancements implemented +### Enhancements implemented 1. Added `ioHandler` package - Reading in from CLI in `Parser` class ([#8](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/8/commits)) - Printing out to CLI in `Ui` class ([#8](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/8/commits)) @@ -33,23 +35,22 @@ - `listunpacked` ([#151](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/151)) - `deletelist` ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) 7. Add JavaDocs ([#163](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/163/commits)) ---- -##### Contributions to the [UG](../UserGuide.md) +--- +### Contributions to the [UG](../UserGuide.md) 1. Update UG to include max integer supported by BagPacker ([#154](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/154)) --- -##### Contribution to the [DG](../DeveloperGuide.md) +### Contribution to the [DG](../DeveloperGuide.md) 1. Update User Stories ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) 2. Add explanation of overall command mechanism for the whole application ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) 3. Add explanation for Exceptions ([#179](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/179/files#diff-1a95edf069a4136e9cb71bee758b0dc86996f6051f0d438ec2c424557de7160b)) 4. Add explanation for Parser Class ([#184](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/184/files)) -4. Add explanation and [sequence diagram](#contributions-to-the-developer-guide--extracts--) for feature of +5. Add explanation and [sequence diagram](#contributions-to-the-developer-guide--extracts--) for feature of - adding repeated items in `AddCommand` ([#138](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/138),[#158](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/158/commits/6d154b8464ba4d57e8d19a958e8be0b554e73cd6#diff-60cb84c47c48c2d69d1f587d9c9ed3af7d99acf2c3b11cd94c8d86eb532e32e2)) - `runBagPacker()` overall Sequence Diagram ([#176](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/176/commits/0ae5782514e02b5c755b689550d1c595449d1128)) - - --- -##### Contributions to team-based tasks +### Contributions to team-based tasks + Plan and create the framework for BagPacker application - `exception`, `iohandler`, `packingfunc` and the relevant j-unit test packages ([#7](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/7/files), [#8](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/8/commits)) @@ -61,18 +62,13 @@ Issues tracking IC Managed internal deadlines for group tasking --- -##### Review/mentoring contributions +### Review/mentoring contributions - Maintain code standard before merging ([#139](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/139)) - Suggest improvements to code ([#22](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/22)) --- -##### Contributions beyond the project team - ---- - -##### Contributions to the Developer Guide (Extracts): +### Contributions to the Developer Guide (Extracts): ![AddExistingItemDiagram.png](..%2Fdiagrams%2FAddExistingItemDiagram.png)![BagPackerClassDiagram.png](..%2Fdiagrams%2FBagPackerClassDiagram.png)![BagPackerSequenceDiagram.png](..%2Fdiagrams%2FBagPackerSequenceDiagram.png) ![ExceptionClassDiagram.png](..%2Fdiagrams%2FExceptionClassDiagram.png)![ExecutePackCommandSequenceDiagram.png](..%2Fdiagrams%2FExecutePackCommandSequenceDiagram.png)![ExecuteUnpackCommandSequenceDiagram.png](..%2Fdiagrams%2FExecuteUnpackCommandSequenceDiagram.png) --- -##### Contributions to the User Guide (Extracts): From 0b5e5aa8dd624c55221c2f0a48dea44a719a38a3 Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 20:34:33 +0800 Subject: [PATCH 180/207] fix - delete command test --- src/test/java/bagpacker/commands/DeleteCommandTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/bagpacker/commands/DeleteCommandTest.java b/src/test/java/bagpacker/commands/DeleteCommandTest.java index 6b25c8faf0..17fbac994d 100644 --- a/src/test/java/bagpacker/commands/DeleteCommandTest.java +++ b/src/test/java/bagpacker/commands/DeleteCommandTest.java @@ -12,10 +12,11 @@ public class DeleteCommandTest { @Test public void testDeleteCommand() { - DeleteCommand deleteCmd = new DeleteCommand(1); + PackingList dummyPackingList = new PackingList(); Item firstItem = new Item(4, "pairs of socks"); dummyPackingList.addItem(firstItem); + DeleteCommand deleteCmd = new DeleteCommand(1); deleteCmd.execute(dummyPackingList); assertEquals(0, dummyPackingList.size()); From 3ac6145c2538d5ba3607f9b1514f26f0a939a8b5 Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 20:36:52 +0800 Subject: [PATCH 181/207] io test --- .gitignore | 1 - text-ui-test/EXPECTED-UNIX.TXT | 28 ++++++++++++++++++++++++++++ text-ui-test/runtest.sh | 1 - 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 text-ui-test/EXPECTED-UNIX.TXT diff --git a/.gitignore b/.gitignore index 354d55e29a..64b484c164 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,3 @@ bin/ packList.txt packingList.txt packing_list.txt -text-ui-test/EXPECTED-UNIX.TXT diff --git a/text-ui-test/EXPECTED-UNIX.TXT b/text-ui-test/EXPECTED-UNIX.TXT new file mode 100644 index 0000000000..989aff69e4 --- /dev/null +++ b/text-ui-test/EXPECTED-UNIX.TXT @@ -0,0 +1,28 @@ +________________________________________________________________________________________________________________________ +Hi this is, + ____ _____ _ +| _ \ | __ \ | | +| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ +| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| +| |_) | (_| | (_| | | | (_| | (__| < __/ | +|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ + +Enter "help" to find out how to use BagPacker +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ +No save files detected. Hello new user! +________________________________________________________________________________________________________________________ +________________________________________________________________________________________________________________________ +Bye thanks for using, + ____ _____ _ +| _ \ | __ \ | | +| |_) | __ _ __ _| |__) |_ _ ___| | _____ _ __ +| _ < / _` |/ _` | ___/ _` |/ __| |/ / _ \ '__| +| |_) | (_| | (_| | | | (_| | (__| < __/ | +|____/ \__,_|\__, |_| \__,_|\___|_|\_\___|_| + __/ | + |___/ + +________________________________________________________________________________________________________________________ diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index ec03a435af..58c2fdea66 100755 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -14,7 +14,6 @@ java -jar $(find ../build/libs/ -mindepth 1 -print -quit) < input.txt > ACTUAL. cp EXPECTED.TXT EXPECTED-UNIX.TXT dos2unix EXPECTED-UNIX.TXT ACTUAL.TXT diff EXPECTED-UNIX.TXT ACTUAL.TXT -rm packinglist.txt if [ $? -eq 0 ] then echo "Test passed!" From 6933d89ab8924fb35c5f60d3e84471b4286c3a3d Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 20:52:55 +0800 Subject: [PATCH 182/207] Update Developer Guide with edit quantity command --- docs/DeveloperGuide.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 04b4af2566..72e5d97bfd 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -15,7 +15,7 @@ * [*PackAllCommand*] * [*UnpackCommand*](#unpack-command) * [*UnpackAllCommand*] - * [*EditQuantityCommand*] + * [*EditQuantityCommand*](#edit-quantity-command) * [*HelpCommand*](#help-command) * [*ListCommand*](#list-command) * [*ListUnpackedCommand*](#list-unpacked-command) @@ -194,6 +194,26 @@ Lastly `Ui.printToUser(MSG_SUCCESS_UNPACK, item)` from `Ui` class is called to p Sequence Diagram of Successful `UnpackCommand.execute()` +--- + +#### Edit Quantity Command + +`EditQuantityCommand` is used to edit the total quantity of an item in the packing list. + +Create Mechanism: Creating of `EditQuantityCommand` object is done in `Parser.createEditQuantityObj()`, which should return a new `EditQuantityCommand` object if there are no exceptions thrown and caught. +The following conditions will cause an `IncorrectCommand` to be returned instead of a `EditQuantityCommand`, signalling an error had occured. +1. Empty PackingList. +2. `QUANTITY` not an integer, is less than 1, or greater than 1,000,000. +3. `INDEX` is not a positive integer that is at most the size of the PackingList. + +This new command created (either `EditQuantityCommand` or `IncorrectCommand`) will then be executed by `BagPacker()`. + +Execute Mechanism: `EditQuantityCommand.execute()` calls the `EditQuantityCommand.getTargetItem()` method to retrieve the target item to pack. +Next, the `PackingList.editTotalQuantity()` method is called in `PackingList`, which calls `Item.setTotalQuantity()` in `Item` class. +`Item.setTotalQuantity()` will set the `totalQuantity` attribute to the `QUANTITY` input given. +Last, `Ui.printToUser()` from `Ui` class is called to print a message to the user signifying that the Edit Quantity command has been executed successfully. + + --- #### Help Command From c6b97b73b58c141b1988333d888102cb12be90a1 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 20:55:06 +0800 Subject: [PATCH 183/207] Add PackAll and UnpackAll commands to DG --- docs/DeveloperGuide.md | 46 ++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8a076bc581..6a88ee9eb6 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -12,9 +12,9 @@ * [*Preventing duplicate items*](#preventing-duplicate-items) * [*DeleteCommand*](#delete-command) * [*PackCommand*](#pack-command) - * [*PackAllCommand*] + * [*PackAllCommand*](#packall-command) * [*UnpackCommand*](#unpack-command) - * [*UnpackAllCommand*] + * [*UnpackAllCommand*](#unpackall-command) * [*EditQuantityCommand*] * [*HelpCommand*](#help-command) * [*ListCommand*](#list-command) @@ -158,11 +158,9 @@ The following conditions will cause an `IncorrectCommand` to be returned instead 3. Item index not a positive integer at most the size of the Packing List -This new command created (either `PackCommand` OR `IncorrectCommand`) will then be executed by `BagPacker()`. - -Execute Mechanism: ```PackCommand.execute()``` calls the ```PackCommand.getTargetItem()``` method to retrieve the target item to pack. +Execute Mechanism: ```PackCommand.execute()``` calls the ```Command.getTargetItem()``` method to retrieve the target item to pack. After which the ```PackingList.PackItem(item, packQuantity)``` method is called in ```PackingList``` which calls ```Item.setPacked(packQuantity)```in `Item` class. `Item.setPacked()` will add the `packedQuantity` to the current pack quantity of the item `toPack`. -Lastly `Ui.printToUser(MSG_SUCCESS_PACK, item)` from `Ui` class is called to print a message to the user signifying that the pack command has been executed successfully. +Lastly `Ui.printToUser(MSG_SUCCESS_PACK, item)` from `Ui` class is called to print a message to the user signifying that the `pack` command has been executed successfully. ![ExecutePackCommandSequenceDiagram.png](diagrams%2FExecutePackCommandSequenceDiagram.png) @@ -170,7 +168,19 @@ Sequence Diagram of Successful `PackCommand.execute()` --- -#### PackAllCommand +#### PackAll Command + +PackAll command is used to set an item as fully packed (i.e. quantity packed = total quantity) + +Create Mechanism: Creating of `PackAllCommand` object is done in `Parser.CreatePackAllObj()`, which should return a new `PackAllCommand` object if there are no exceptions caught. +The following conditions will cause an `IncorrectCommand` to be returned instead of a `PackAllCommand`, signalling an error has occurred. +1. Empty PackingList +2. Invalid Variables (non integer input for item index, or wrong format) +3. Item index not a positive integer at most the size of the Packing List + +Execute Mechanism: ```PackAllCommand.execute()``` calls the ```Command.getTargetItem()``` method to retrieve the target item to pack. +After which the ```PackingList.getUnpackedQuantity()``` method is called in ```PackingList``` and initialised as `packQuantity` which is added to the previous packed quantity using `packingList.packItem(item, packQuantity)` thus fully packing the item. +Lastly `Ui.printToUser(MSG_SUCCESS_PACKALL, item)` from `Ui` class is called to print a message to the user signifying that the `packall` command has been executed successfully. ___ @@ -184,11 +194,9 @@ The following conditions will cause an `IncorrectCommand` to be returned instead 2. `QuantityUnpacked` less than 1 OR greater than 1,000,000 OR greater than the item's packed quantity 3. Item index not a positive integer at most the size of the Packing List -This new command created (either `UnpackCommand` OR `IncorrectCommand`) will then be executed by `BagPacker()`. - -Execute Mechanism: ```UnpackCommand.execute()``` calls the ```UnpackCommand.getTargetItem()``` method to retrieve the target item to pack. +Execute Mechanism: ```UnpackCommand.execute()``` calls the ```UnpackCommand.getTargetItem()``` method to retrieve the target item to unpack. After which the ```PackingList.UnpackItem(item, quantity)``` method is called in ```PackingList``` which calls ```Item.setUnpacked(quantity)```in `Item` class. `Item.setUnpacked()` will remove the `quantity` from the current pack quantity of the item. -Lastly `Ui.printToUser(MSG_SUCCESS_UNPACK, item)` from `Ui` class is called to print a message to the user signifying that the unpack command has been executed successfully. +Lastly `Ui.printToUser(MSG_SUCCESS_UNPACK, item)` from `Ui` class is called to print a message to the user signifying that the `unpack` command has been executed successfully. ![ExecuteUnpackCommandSequenceDiagram.png](diagrams%2FExecuteUnpackCommandSequenceDiagram.png) @@ -196,6 +204,22 @@ Sequence Diagram of Successful `UnpackCommand.execute()` --- +#### UnpackAll Command + +UnpackAll command is used to set an item as totally unpacked (i.e. quantity packed = 0) + +Create Mechanism: Creating of `UnpackAllCommand` object is done in `Parser.CreateUnpackAllObj()`, which should return a new `UnpackAllCommand` object if there are no exceptions caught. +The following conditions will cause an `IncorrectCommand` to be returned instead of a `UnpackAllCommand`, signalling an error has occurred. +1. Empty PackingList +2. Invalid Variables (non integer input for item index, or wrong format) +3. Item index not a positive integer at most the size of the Packing List + +Execute Mechanism: ```UnpackAllCommand.execute()``` calls the ```Command.getTargetItem()``` method to retrieve the target item to unpack. +After which the ```PackingList.getPackedQuantity()``` method is called in ```PackingList``` and initialised as `unpackQuantity`. This value is taken away from the previous packed quantity using `packingList.unpackItem(item, unpackQuantity)` thus totally unpacking the item. +Lastly `Ui.printToUser(MSG_SUCCESS_UNPACKALL, item)` from `Ui` class is called to print a message to the user signifying that the `unpackall` command has been executed successfully. + +___ + #### Help Command Help command is used to display all the possible commands in the BagPacker application for the user. From 6773978c094c95b4d5c71b214f381961cda7cce2 Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 21:24:29 +0800 Subject: [PATCH 184/207] merge conflict resolve --- docs/DeveloperGuide.md | 46 +++++++++++++++++++++++------------------- docs/team/coregano.md | 6 ++---- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index db67e8d738..780ee0ad84 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -101,14 +101,12 @@ For all valid commands, the mechanism of implementation are as follows: Refer to the sequence diagram in [runBagPacker() Mechanism](#runbagpacker---mechanism) for a visual aid of the above explanation. ---- #### Command The `Command` abstract class is used to create subclasses of commands for BagPacker. The constructor `Command()` takes in an integer of `targetIndex` which sets the internal `targetIndex` value. `targetIndex` is used for certain commands such as delete, pack, and edit, where the `index` of a certain `item` in the `packingList` is important in the command. An `item` of that index will be extracted out using `getTargetItem()`. ---- #### Add Command @@ -137,7 +135,6 @@ If `PackingList.itemFinder()` returns false, the item will be added onto `packin In both scenarios, the relevant `ui.printToUser` messages (omitted in the sequence diagram for easier reading) will be called to print a message to the user. ---- #### Delete Command @@ -145,8 +142,6 @@ Delete command is used to delete an item from the packing list. Mechanism: ```DeleteCommand.execute()``` calls the ```PackingList.deleteItem()``` method from the ```PackingList``` class which executes the ```ArrayList.remove()``` method to remove the item from the ```PackingList``` ArrayList. ---- - #### Pack Command Pack command is used to pack a quantity of an item in the packing list. @@ -166,7 +161,6 @@ Lastly `Ui.printToUser(MSG_SUCCESS_PACK, item)` from `Ui` class is called to pri Sequence Diagram of Successful `PackCommand.execute()` ---- #### PackAll Command @@ -182,7 +176,6 @@ Execute Mechanism: ```PackAllCommand.execute()``` calls the ```Command.getTarget After which the ```PackingList.getUnpackedQuantity()``` method is called in ```PackingList``` and initialised as `packQuantity` which is added to the previous packed quantity using `packingList.packItem(item, packQuantity)` thus fully packing the item. Lastly `Ui.printToUser(MSG_SUCCESS_PACKALL, item)` from `Ui` class is called to print a message to the user signifying that the `packall` command has been executed successfully. -___ #### Unpack Command @@ -202,7 +195,6 @@ Lastly `Ui.printToUser(MSG_SUCCESS_UNPACK, item)` from `Ui` class is called to p Sequence Diagram of Successful `UnpackCommand.execute()` ---- #### UnpackAll Command @@ -218,7 +210,6 @@ Execute Mechanism: ```UnpackAllCommand.execute()``` calls the ```Command.getTarg After which the ```PackingList.getPackedQuantity()``` method is called in ```PackingList``` and initialised as `unpackQuantity`. This value is taken away from the previous packed quantity using `packingList.unpackItem(item, unpackQuantity)` thus totally unpacking the item. Lastly `Ui.printToUser(MSG_SUCCESS_UNPACKALL, item)` from `Ui` class is called to print a message to the user signifying that the `unpackall` command has been executed successfully. -___ #### Edit Quantity Command @@ -238,8 +229,6 @@ Next, the `PackingList.editTotalQuantity()` method is called in `PackingList`, w Last, `Ui.printToUser()` from `Ui` class is called to print a message to the user signifying that the Edit Quantity command has been executed successfully. ---- - #### Help Command Help command is used to display all the possible commands in the BagPacker application for the user. @@ -282,7 +271,6 @@ All Commands: ____________________________________________________________ ``` ---- #### List Command @@ -305,8 +293,6 @@ Here are the items in your list ____________________________________________________________ ``` ---- - #### List Unpacked Command `listunpacked` command is used to list out all items in the packing list that are not fully packed. @@ -349,8 +335,6 @@ ________________________________________________________________________________ ``` ---- - #### Find Command `FindCommand` is used to find all items containing the keyword(s) provided. @@ -358,7 +342,6 @@ ________________________________________________________________________________ Mechanism: `FindCommand.execute()` calls `PackingList.keywordFinder()` with the given `keyword`. This method loops through every `item` in `packingList` to see if the `itemName` for each `item` contains the keyword(s) given. The `item`(s) that contain the keyword are placed into an ArrayList with their `itemIndex` then used in `printToUser`. ---- #### DeleteList Command @@ -366,7 +349,6 @@ The `item`(s) that contain the keyword are placed into an ArrayList with their ` Mechanism: `DeleteListCommand.execute()` reassigns the existing `packingList` to a new empty ArrayList of Items, thus deleting any items in `packingList`. ---- #### Bye Command @@ -376,16 +358,15 @@ Mechanism: `ByeCommand.execute()` updates the static boolean `isBagPackerRunning The `runBagPacker()` method will continually parse and execute relevant commands (refer to Command Mechanisms in DG) until `isBagPackerRunning == false` which occurs upon the execution of the `byeCommand`. ---- #### Incorrect Command `IncorrectCommand` is a special type command that is returned by `Parser.parse()` when an exception is thrown by one of the methods in `Parse`. These exceptions are thrown when an error is detected in the user's input, consist of many types, such as a blank input, incorrect command format, or a missing parameter. See [Exceptions](#exceptions). -Depending on the error, `IncorrectCommand` will be constructed with an `errorType` and `helpMessage`. -Mechanism: `IncorrectCommand.execute()` will print the relevant error message to the user by calling `Ui.errorMessage`. +Depending on the error, `IncorrectCommand` will be constructed with an `errorType` and `helpMessage` to be shown to the user with `errorMessage()` +Mechanism: `IncorrectCommand.execute()` will print the relevant error message to the user by calling `Ui.errorMessage`. --- @@ -716,6 +697,29 @@ You can run a few commands; refer to the [User Guide]() for the full list of com * This command will show different results if all items are fully packed, or if there are no items in your packing list. +* Try fully packing an item using the `packall` command + * Example: `packall /of 1` + * Expected: A message showing that the first item has been fully packed. + * This command will work on other items. + + +* Try fully unpacking an item using the `unpackall` command + * Example: `unpackall /of 1` + * Expected: A message showing that the first item has been fully unpacked. + * This command will work on other items. + + +* Try deleting your entire list using the `deletelist` command + * Example: `deletelist` + * Expected: + ```text + ________________________________________________________________________________________________________________________ + Packing list deleted + ________________________________________________________________________________________________________________________ + ``` + * This command will replace your packing list with an empty one. + + * To exit `BagPacker`, use the `bye` command * Example: `bye` * Expected: diff --git a/docs/team/coregano.md b/docs/team/coregano.md index dcea849d6e..0618415951 100644 --- a/docs/team/coregano.md +++ b/docs/team/coregano.md @@ -29,14 +29,12 @@ ___ LoC contributed ([tP Code Dashboard](https://nus-cs2113-ay2223s2.github.io/t --- ### Contributions to the [DG](../DeveloperGuide.md) -1. Add Instructions for Manual Testing ([]()) +1. Add Instructions for Manual Testing 2. --- ### Contributions to team-based tasks - ---- -### Review/Mentoring Contributions +1. Helped with [shannentan](https://github.com/shannentan) to implement items with quantity feature ([#61](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/61/commits)) --- From be61520dee37de7c20e35f8641a40bdf575331e6 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 21:24:41 +0800 Subject: [PATCH 185/207] Update PPP --- docs/team/shannentan.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/team/shannentan.md b/docs/team/shannentan.md index 68dfa75a70..224b84b48d 100644 --- a/docs/team/shannentan.md +++ b/docs/team/shannentan.md @@ -33,12 +33,16 @@ Enhancements to existing features Documentation * User Guide * Formatted the User Guide - * Added the tables of contents, links to different sections within the User Guide, and colours to the headers + * Added the table of contents, links to different sections within the User Guide, and colours to the headers * Added description of command, format, example usage and important notes to some commands * `add`, `delete`, `pack`, `unpack`, `editquantity`, `list`, `deletelist` and `find` - * Added the command summary + * Added the command summary + * PR [#166](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/166), [#174](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/174), [#177](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/177), [#178](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/178) * Developer Guide * Formatted the Developer Guide + * Formatted the table of contents and links to different sections within the Developer Guide + * Added the section on `EditQuantityCommand` + * PR [#181](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/181), [#186](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/186), [PR #190](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/190) Community * Reported bugs and gave suggestions to other teams in the class during [PE-D](https://github.com/shannentan/ped/issues) From 26e8c696f9e0dc45bbf46e1b3c5b8818029baacd Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 21:34:49 +0800 Subject: [PATCH 186/207] Fix typo in PPP --- docs/team/shannentan.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/shannentan.md b/docs/team/shannentan.md index 224b84b48d..7f03a6f3e7 100644 --- a/docs/team/shannentan.md +++ b/docs/team/shannentan.md @@ -42,7 +42,7 @@ Documentation * Formatted the Developer Guide * Formatted the table of contents and links to different sections within the Developer Guide * Added the section on `EditQuantityCommand` - * PR [#181](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/181), [#186](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/186), [PR #190](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/190) + * PR [#181](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/181), [#186](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/186), [#190](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/190) Community * Reported bugs and gave suggestions to other teams in the class during [PE-D](https://github.com/shannentan/ped/issues) From ef945a4bf0d8a83cd9814afc3c9bbaa814cb4dbc Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 21:43:10 +0800 Subject: [PATCH 187/207] Update Developer guide with packingfunc --- build.gradle | 4 + docs/DeveloperGuide.md | 73 +++++++++++++------ .../bagpacker/packingfunc/PackingList.java | 23 ++++-- 3 files changed, 71 insertions(+), 29 deletions(-) diff --git a/build.gradle b/build.gradle index 2166549d0a..2cdc3fdf97 100644 --- a/build.gradle +++ b/build.gradle @@ -44,3 +44,7 @@ checkstyle { run{ standardInput = System.in } + +run { + enableAssertions = true +} \ No newline at end of file diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index db67e8d738..1e01455535 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -4,9 +4,9 @@ ## Table of contents * [**Acknowledgements**](#acknowledgements) * [**Setting up, getting started**](#setting-up-getting-started) -* [**Design**](#design) +* [**Design**](#span-stylecolor00a36c-design-span) * [Architecture](#architecture) - * [*Commands component*](#commands-component) + * [*Commands Package*](#commands-package) * [*Command*](#command) * [*AddCommand*](#add-command) * [*Preventing duplicate items*](#preventing-duplicate-items) @@ -458,7 +458,7 @@ all createCommandObj methods except for commands without input variables (i.e. e --- -### IOHandler +### IOHandler Package The `IOHandler` package contains three main classes, which are [Parser](#parser-class), [Storage](#storage) and [Ui](#ui). These classes are used to handle input from and output to the user through the CLI, while managing the storage and retrieval of the associated `item`'s in the user's `packingList`. @@ -489,33 +489,33 @@ All erroneous inputs will instead return `IncorrectCommand()` with respective er The following show the respective create methods for each command. The `command` object they return will be executed in `BagPacker()` -`createAddObj()` - returns new `AddCommand(item)` +- `createAddObj()` - returns new `AddCommand(item)` -`createDeleteObj()` - returns new `DeleteCommand(itemIndex)` +- `createDeleteObj()` - returns new `DeleteCommand(itemIndex)` -`createPackObj()` - returns new `PackCommand(itemQuantity, itemIndex)` +- `createPackObj()` - returns new `PackCommand(itemQuantity, itemIndex)` -`createUnpackObj()` - returns new `UnpackCommand(itemQuantity, itemIndex)` +- `createUnpackObj()` - returns new `UnpackCommand(itemQuantity, itemIndex)` -`createListObj()` - returns new `ListCommand()` +- `createListObj()` - returns new `ListCommand()` -`createListUnpackedObj()` - returns new `ListUnpackedCommand()` +- `createListUnpackedObj()` - returns new `ListUnpackedCommand()` -`createHelpObj()` - returns new `HelpCommand()` +- `createHelpObj()` - returns new `HelpCommand()` -`createDeleteListObj()` - returns new `DeleteListCommand()` +- `createDeleteListObj()` - returns new `DeleteListCommand()` -`createPackAllObj()` - returns new `PackAllCommand(itemIndex)` +- `createPackAllObj()` - returns new `PackAllCommand(itemIndex)` -`createUnpackAllObj()` - returns new `UnpackAllCommand(itemIndex)` +- `createUnpackAllObj()` - returns new `UnpackAllCommand(itemIndex)` -`createEditQuantityObj()` - returns new `EditQuantityCommand(newTotalQuantity, itemIndex)` +- `createEditQuantityObj()` - returns new `EditQuantityCommand(newTotalQuantity, itemIndex)` -`createFindObj()` - returns new `FindCommand(keyword)` +- `createFindObj()` - returns new `FindCommand(keyword)` -`createByeObj()` - returns new `ByeCommand()` +- `createByeObj()` - returns new `ByeCommand()` -`IncorrectCommand()` - of format `IncorrectCommand(errorType, helpMessage)` is returned for any [Exceptions](#exceptions) caught. +- `IncorrectCommand()` - of format `IncorrectCommand(errorType, helpMessage)` is returned for any [Exceptions](#exceptions) caught. @@ -531,11 +531,11 @@ The constructor of this class, which is called in `BagPacker`, will set the `fil Each `item` is written on a newline with a format using `.toString()`, which is `[PACKED_QUANTITY/TOTAL_QUANTITY] ITEM_NAME`. Example: - ``` - [0/4] jackets - [2/4] cats - [0/3] toothbrush - ``` +``` +[0/4] jackets +[2/4] cats +[0/3] toothbrush +``` `load()` is called at the start of `main()` in `BagPacker`. This method reads in the file in `file_path` and translates each line to construct an `item`. @@ -557,7 +557,7 @@ Some important methods are: `errorMessage()` - shows the error type and help message to the user in the case an error occurs --- -### Packingfunc +### Packingfunc Package The `Packingfunc` package consists of `Item` and `PackingList` classes, which are used to manage the main packing list of `BagPacker`, and its individual items. #### Item @@ -581,7 +581,34 @@ It is used in multiple [commands](#commands-package) and [storage](#storage) to #### PackingList +`PackingList()` contains a `static ArrayList itemList` which is the user's packing list. +The `PackingList()` class' methods are used to search through and manipulate this `itemList`. + +Methods: + +- `getItemList()` and `setItemList(ArrayList itemList)` - normal getter and setter for `itemList` + +- `itemFinder(String itemName)` - checks if item of the same name as itemName is found in the current packing list and returns true if found + +- `getItemByName(String itemName)` - checks if item of the same name as itemName is found in the current packing list and returns the pointer to item + +- `keywordFinder(String keyword)` - checks if items contain keyword in their names in the current packing list, returns true if any item contains the keyword + +- `getExistingItem(String itemName)` - checks if item of the same name as itemName is found in the current packing list and returns true if found + +- `addToItemQuantity(String itemName, int addQty)` - adds `addQty` to the current total quantity of an item matching the `itemName` in the itemList + +- `editTotalQuantity(String itemName, int addQty)` - adds `addQty` to the current total quantity of an item matching the `itemName` in the itemList + +- `addItem(Item toAdd)` - adds `toAdd` of class `Item` to the packing list + +- `deleteItem(Item toDelete)` - deletes `toDelete` of class `Item` from the packing list + +- `packItem(Item toPack, int quantity)` - packs the item `toPack` by a certain `quantity` by increasing the packed quantity of `toPack` by `quantity`'s value + +- `unpackItem(Item toPack, int quantity)` - unpacks the item `toUnpack` by a certain `quantity` by reducing the packed quantity of `toUnpack` by `quantity`'s value +- `size()` - returns size of packing list --- diff --git a/src/main/java/bagpacker/packingfunc/PackingList.java b/src/main/java/bagpacker/packingfunc/PackingList.java index 92ba544ea0..28e0a9be7d 100644 --- a/src/main/java/bagpacker/packingfunc/PackingList.java +++ b/src/main/java/bagpacker/packingfunc/PackingList.java @@ -8,10 +8,10 @@ public class PackingList { private static ArrayList itemList = new ArrayList<>(); /** - * Checks if item of the same name as itemName is found in the current packing list and returns that item + * Checks if item of the same name as itemName is found in the current packing list and returns true * * @param itemName name of item to return - * @return the Item of same name as itemName if found, else null + * @return the true if found, else null */ public static boolean itemFinder(String itemName) { for (Item item : itemList) { @@ -66,7 +66,12 @@ public static void addToItemQuantity(String itemName, int addQty) { int totalQuantity = itemToAdd.getTotalQuantity(); itemToAdd.setTotalQuantity(totalQuantity + addQty); } - + /** + * Edits the itemToEdit's total quantity to the newTotalQuantity + * + * @param itemToEdit name of the item to edit total quantity + * @param newTotalQuantity the total quantity to change to + */ public static void editTotalQuantity(Item itemToEdit, int newTotalQuantity) { itemToEdit.setTotalQuantity(newTotalQuantity); } @@ -86,6 +91,7 @@ public static ArrayList getItemList() { /** * Adds an item to the list. + * @param toAdd item to be added to the packing list */ public void addItem(Item toAdd) { itemList.add(toAdd); @@ -93,13 +99,16 @@ public void addItem(Item toAdd) { /** * Removes an item from the list. + * @param toDelete item to be deleted from the packing list */ public void deleteItem(Item toDelete) { itemList.remove(toDelete); } /** - * Marks an item as packed in the list. + * Packs an item by a certain quantity + * @param toPack the item to pack + * @param quantity value to increase the packed quantity of the given item toPack by */ public void packItem(Item toPack, int quantity) { toPack.setPacked(quantity); @@ -107,9 +116,11 @@ public void packItem(Item toPack, int quantity) { /** * Marks an item as unpacked in the list. + * @param toUnpack the item to unpack + * @param quantity value to decrease the packed quantity of the given item toPack by */ - public void unpackItem(Item toPack, int quantity) { - toPack.setUnpacked(quantity); + public void unpackItem(Item toUnpack, int quantity) { + toUnpack.setUnpacked(quantity); } /** From fd74f7332ba0cae97a70017336b3d2abe69f4ba0 Mon Sep 17 00:00:00 2001 From: Sophie Date: Mon, 10 Apr 2023 21:51:16 +0800 Subject: [PATCH 188/207] Update PPP --- docs/team/tangphi.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/team/tangphi.md b/docs/team/tangphi.md index fddf3fa1cb..aa73d60489 100644 --- a/docs/team/tangphi.md +++ b/docs/team/tangphi.md @@ -3,9 +3,10 @@ # Yinxuan (Sophie) Tang - Project Portfolio Page ## Overview -BagPacker is a desktop packing list application used to manage a user's list of items to pack. The user interacts with it using a CLI to add, delete, edit, find, list out the items and many more. It is written in Java, and has about 2kLoC. - -My contributions of the projects are given below. +BagPacker is a desktop Command Line Interface (CLI) application used to manage a user's packing list. +It stores a packing list, edit the quantities packed and the total quantity packed of an item, and searches the packing +list for items. +It is written in Java, and has about 4k LoC. ### Summary of Contributions @@ -59,9 +60,9 @@ V2.1 --- ##### Contributions to team-based tasks - Contributed to the planning of BagPacker by brainstorming features to implement -- Labelled, assigned and set milestones for issues on Github [issues](https://github.com/AY2223S2-CS2113-T14-2/tp/issues?q=is%3Aissue+author%3Atangphi+is%3Aclosed) +- Contributed to labelling, assigning and setting milestones for issues on Github [issues](https://github.com/AY2223S2-CS2113-T14-2/tp/issues?q=is%3Aissue+author%3Atangphi+is%3Aclosed) - Helped resolve bugs from the PE-Dry run -- Documenting the target user profile in the developer doc +- Documented the target user profile in the developer doc --- ##### Contributions beyond the project team From 5bc72677c46830d542b88e82a31fbd81fd507721 Mon Sep 17 00:00:00 2001 From: coregano Date: Mon, 10 Apr 2023 22:01:06 +0800 Subject: [PATCH 189/207] Final PPP upload --- docs/team/coregano.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/team/coregano.md b/docs/team/coregano.md index 0618415951..f2806f2bdf 100644 --- a/docs/team/coregano.md +++ b/docs/team/coregano.md @@ -8,14 +8,12 @@ It is written in Java, and has about 4k LoC. ## Summary of Contributions ---- - ### Code contributed -___ LoC contributed ([tP Code Dashboard](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=t14&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=coregano&tabRepo=AY2223S2-CS2113-T14-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)) -- __ Documentation -- __ functional-code -- __ test-code +543 LoC contributed ([tP Code Dashboard](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=t14&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=coregano&tabRepo=AY2223S2-CS2113-T14-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)) +- 42 Documentation +- 456 functional-code +- 40 test-code --- ### Enhancements implemented @@ -30,7 +28,7 @@ ___ LoC contributed ([tP Code Dashboard](https://nus-cs2113-ay2223s2.github.io/t --- ### Contributions to the [DG](../DeveloperGuide.md) 1. Add Instructions for Manual Testing -2. +2. Add explanation for `Storage`, `Item`, `Command`, `IncorrectCommand`, `Find command` --- ### Contributions to team-based tasks From 9408258b391157c1426f248dd14536ace1f6ffc9 Mon Sep 17 00:00:00 2001 From: Sophie Date: Mon, 10 Apr 2023 22:02:10 +0800 Subject: [PATCH 190/207] Update naming of quantities in UG --- docs/UserGuide.md | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 00c0b830df..82eb14191d 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -14,9 +14,9 @@ is unpacked and travel with an ease of mind. * [Adding a new item](#adding-a-new-item-add) * [Deleting an item](#deleting-an-item-delete) * [Packing an item](#packing-an-item-pack) - * [Packing all of an item](#packing-all-of-an-item-packall) + * [Packing all quantities of an item](#packing-all-quantities-of-an-item-packall) * [Unpacking an item](#unpacking-an-item-unpack) - * [Unpacking all of an item](#unpacking-all-of-an-item-unpackall) + * [Unpacking all quantities of an item](#unpacking-all-quantities-of-an-item-unpackall) * [Editing item quantity](#editing-item-quantity-editquantity) * [Listing all items](#listing-all-items-list) * [Listing all unpacked items](#listing-all-unpacked-items-listunpacked) @@ -200,7 +200,7 @@ Example: Item packed: [2/3] jackets ``` -### Packing all of an item: `packall` +### Packing all quantities of an item: `packall` Packs the total quantity of that item in the packing list. Format: `packall /of INDEX` @@ -241,7 +241,7 @@ Example: Item unpacked: [2/10] shirts ``` -### Unpacking all of an item: `unpackall` +### Unpacking all quantities of an item: `unpackall` Unpacks the total quantity of that item in the packing list. Format: `unpackall /of INDEX` @@ -431,20 +431,20 @@ Example: ## Command Summary -| Action description | Syntax | Remarks | -|:---------------------------|:----------------------------------|:---------------------------------------------------------------------------------------------------------------------| -| Help | `help` | Additional parameters will be ignored | -| Adding a new item | `add QUANTITY /of NAME` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000 | -| Deleting an item | `delete INDEX` | `INDEX` must be a valid list index | -| Packing an item | `pack QUANTITY /of INDEX` | Adding `QUANTITY` should not cause the quantity to exceed the total quantity
    `INDEX` must be a valid list index | -| Packing all of an item | `packall /of INDEX` | `INDEX` must be a valid list index | -| Unpacking an item | `unpack QUANTITY /of INDEX` | Subtracting `QUANTITY` should not cause the quantity to be less than 0
    `INDEX` must be a valid list index | -| Unpacking all of an item | `unpackall /of INDEX` | `INDEX` must be a valid list index | -| Editing item quantity | `editquantity QUANTITY /of INDEX` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000
    `INDEX` must be a valid list index | -| Listing all items | `list` | Additional parameters will be ignored | -| Listing all unpacked items | `listunpacked` | Additional parameters will be ignored | -| Deleting the entire list | `deletelist` | Additional parameters will be ignored | -| Finding an item | `help` | Additional parameters will be ignored | -| Exiting the application | `bye` | Additional parameters will be ignored | +| Action description | Syntax | Remarks | +|:------------------------------------|:----------------------------------|:---------------------------------------------------------------------------------------------------------------------| +| Help | `help` | Additional parameters will be ignored | +| Adding a new item | `add QUANTITY /of NAME` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000 | +| Deleting an item | `delete INDEX` | `INDEX` must be a valid list index | +| Packing an item | `pack QUANTITY /of INDEX` | Adding `QUANTITY` should not cause the quantity to exceed the total quantity
    `INDEX` must be a valid list index | +| Packing all quantities of an item | `packall /of INDEX` | `INDEX` must be a valid list index | +| Unpacking an item | `unpack QUANTITY /of INDEX` | Subtracting `QUANTITY` should not cause the quantity to be less than 0
    `INDEX` must be a valid list index | +| Unpacking all quantities of an item | `unpackall /of INDEX` | `INDEX` must be a valid list index | +| Editing item quantity | `editquantity QUANTITY /of INDEX` | `QUANTITY` must be between 0 and 1,000,000, not inclusive of 0 and 1,000,000
    `INDEX` must be a valid list index | +| Listing all items | `list` | Additional parameters will be ignored | +| Listing all unpacked items | `listunpacked` | Additional parameters will be ignored | +| Deleting the entire list | `deletelist` | Additional parameters will be ignored | +| Finding an item | `help` | Additional parameters will be ignored | +| Exiting the application | `bye` | Additional parameters will be ignored | [⏫ Go to Table of Contents](#table-of-contents) | [⏫ Go to Features](#features) \ No newline at end of file From c277df25c19bac9181af4702a7951cc526bf47a4 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 22:02:49 +0800 Subject: [PATCH 191/207] Refactor code and fix links in UG --- docs/UserGuide.md | 34 +++++++++++------------ docs/team/linuspuah.md | 3 +- src/main/java/bagpacker/iohandler/Ui.java | 4 +-- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 00c0b830df..1a4de791a6 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -8,23 +8,23 @@ is unpacked and travel with an ease of mind. --- ## Table of contents -* [Quick Start](#quick-start) -* [Features](#features) - * [Help message](#help-message-help) - * [Adding a new item](#adding-a-new-item-add) - * [Deleting an item](#deleting-an-item-delete) - * [Packing an item](#packing-an-item-pack) - * [Packing all of an item](#packing-all-of-an-item-packall) - * [Unpacking an item](#unpacking-an-item-unpack) - * [Unpacking all of an item](#unpacking-all-of-an-item-unpackall) - * [Editing item quantity](#editing-item-quantity-editquantity) - * [Listing all items](#listing-all-items-list) - * [Listing all unpacked items](#listing-all-unpacked-items-listunpacked) - * [Deleting the entire list](#deleting-the-entire-list-deletelist) - * [Finding an item](#finding-an-item-find) - * [Exiting the application](#exiting-the-application-bye) -* [Frequently Asked Questions (FAQ)](#frequently-asked-questions-faq) -* [Command Summary](#command-summary) +* [Quick Start](#span-stylecolor00a36c-quick-start-span) +* [Features](#span-stylecolor00a36c-features-span) + * [Help message](#span-stylecolor6495ed-help-message--span-help) + * [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) + * [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) + * [Packing an item](#span-stylecolor6495ed-packing-an-item--span-pack) + * [Packing all of an item](#span-stylecolor6495ed-packing-all-of-an-item--span-packall) + * [Unpacking an item](#span-stylecolor6495ed-unpacking-an-item--span-unpack) + * [Unpacking all of an item](#span-stylecolor6495ed-unpacking-all-of-an-item--span-unpackall) + * [Editing item quantity](#span-stylecolor6495ed-editing-item-quantity--span-editquantity) + * [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) + * [Listing all unpacked items](#span-stylecolor6495ed-listing-all-unpacked-items--span-listunpacked) + * [Deleting the entire list](#span-stylecolor6495ed-deleting-the-entire-list--span-deletelist) + * [Finding an item](#span-stylecolor6495ed-finding-an-item--span-find) + * [Exiting the application](#span-stylecolor6495ed-exiting-the-application--span-bye) +* [Frequently Asked Questions (FAQ)](#span-stylecolor00a36c-frequently-asked-questions--faq--span) +* [Command Summary](#span-stylecolor00a36c-command-summary-span) --- diff --git a/docs/team/linuspuah.md b/docs/team/linuspuah.md index 8a8b3cb458..bc06940c4a 100644 --- a/docs/team/linuspuah.md +++ b/docs/team/linuspuah.md @@ -45,9 +45,10 @@ It is written in Java, and has about 4k LoC. 2. Add explanation of overall command mechanism for the whole application ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) 3. Add explanation for Exceptions ([#179](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/179/files#diff-1a95edf069a4136e9cb71bee758b0dc86996f6051f0d438ec2c424557de7160b)) 4. Add explanation for Parser Class ([#184](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/184/files)) -5. Add explanation and [sequence diagram](#contributions-to-the-developer-guide--extracts--) for feature of +5. Add explanation and [sequence diagram](#span-stylecolordarkgreen-contributions-to-the-developer-guide--extracts---span) for feature of - adding repeated items in `AddCommand` ([#138](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/138),[#158](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/158/commits/6d154b8464ba4d57e8d19a958e8be0b554e73cd6#diff-60cb84c47c48c2d69d1f587d9c9ed3af7d99acf2c3b11cd94c8d86eb532e32e2)) - `runBagPacker()` overall Sequence Diagram ([#176](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/176/commits/0ae5782514e02b5c755b689550d1c595449d1128)) +- `PackCommand` and `UnpackCommand` sequence Diagram --- ### Contributions to team-based tasks diff --git a/src/main/java/bagpacker/iohandler/Ui.java b/src/main/java/bagpacker/iohandler/Ui.java index d91d934db0..2261a6bea5 100644 --- a/src/main/java/bagpacker/iohandler/Ui.java +++ b/src/main/java/bagpacker/iohandler/Ui.java @@ -31,12 +31,12 @@ public class Ui { public static void printErrorLine() { System.out.println("///////////////////////////////////////////////////////////////////////////" + - "///////////////////////////////////////////////"); + "////////////////////////////"); } public static void printLine() { System.out.println("___________________________________________________________________________" + - "_____________________________________________"); + "_____________________________"); } /** From 9043c8b63d9f41cf958972ca9e78faac5afe2724 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 22:09:25 +0800 Subject: [PATCH 192/207] Fix DG bugs --- docs/DeveloperGuide.md | 67 +++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 780ee0ad84..25a0647c9b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,12 +1,14 @@ [DeveloperGuide.md](DeveloperGuide.md) + # Developer Guide ## Table of contents + * [**Acknowledgements**](#acknowledgements) * [**Setting up, getting started**](#setting-up-getting-started) * [**Design**](#design) * [Architecture](#architecture) - * [*Commands component*](#commands-component) + * [*Commands Package*](#commands-package) * [*Command*](#command) * [*AddCommand*](#add-command) * [*Preventing duplicate items*](#preventing-duplicate-items) @@ -15,7 +17,7 @@ * [*PackAllCommand*](#packall-command) * [*UnpackCommand*](#unpack-command) * [*UnpackAllCommand*](#unpackall-command) - * [*EditQuantityCommand*](#edit-quantity-command) + * [*EditQuantityCommand*](#editquantity-command) * [*HelpCommand*](#help-command) * [*ListCommand*](#list-command) * [*ListUnpackedCommand*](#list-unpacked-command) @@ -29,21 +31,21 @@ * [*InvalidQuantityException*](#invalidquantityexception) * [*InvalidVariablesException*](#invalidvariablesexception) * [iohandler Package](#iohandler-package) - * [*Parser*](#parser-class) + * [*Parser*](#parser) * [*Storage*](#storage) * [*Ui*](#ui) * [packingfunc Package](#packingfunc-package) * [*Item*](#item) * [*PackingList*](#packinglist) -* [**Appendix A: Product Scope**](#appendix-a--product-scope) -* [**Appendix B: User Stories**](#appendix-b--user-stories) -* [**Appendix C: Non-Functional Requirements**](#appendix-c--non-functional-requirements) -* [**Appendix D: Glossary**](#appendix-d--glossary) -* [**Appendix E: Instructions for Manual Testing**](#appendix-e--instructions-for-manual-testing) +* [**Appendix A: Product Scope**](#appendix-a-product-scope) +* [**Appendix B: User Stories**](#appendix-b-user-stories) +* [**Appendix C: Non-Functional Requirements**](#appendix-c-non-functional-requirements) +* [**Appendix D: Glossary**](#appendix-d-glossary) +* [**Appendix E: Instructions for Manual Testing**](#appendix-e-instructions-for-manual-testing) --- -## Acknowledgements +## Acknowledgements This project is based on the AddressBook-Level3 project created by the SE-EDU initiative. * The design and structure of our User Guide and Developer Guide is referenced from the AddressBook-Level3 (AB3) User Guide and Developer Guide. @@ -52,14 +54,14 @@ This project is based on the AddressBook-Level3 project created by the SE-EDU in --- -## Setting up, getting started +## Setting up, getting started Refer to the [UserGuide.md](UserGuide.md) for more details --- ## Design -##### Architecture +### Architecture ![BagPackerClassDiagram.png](diagrams%2FBagPackerClassDiagram.png) ![ExceptionClassDiagram.png](diagrams%2FExceptionClassDiagram.png) @@ -76,7 +78,7 @@ The Architecture of BagPacker Application can be seen from the diagrams above co - Running the main app: Calls 'BagPacker.runBagPacker()' which runs the main program for BagPacker application. (including execution of commands) - At shut down: Shuts down the components and invokes cleanup methods where necessary. Saves the current packing list. -##### runBagPacker() Mechanism +### runBagPacker() Mechanism Run Condition: ByeCommand.isBagPackerRunning @@ -211,7 +213,7 @@ After which the ```PackingList.getPackedQuantity()``` method is called in ```Pac Lastly `Ui.printToUser(MSG_SUCCESS_UNPACKALL, item)` from `Ui` class is called to print a message to the user signifying that the `unpackall` command has been executed successfully. -#### Edit Quantity Command +#### EditQuantity Command `EditQuantityCommand` is used to edit the total quantity of an item in the packing list. @@ -228,7 +230,6 @@ Next, the `PackingList.editTotalQuantity()` method is called in `PackingList`, w `Item.setTotalQuantity()` will set the `totalQuantity` attribute to the `QUANTITY` input given. Last, `Ui.printToUser()` from `Ui` class is called to print a message to the user signifying that the Edit Quantity command has been executed successfully. - #### Help Command Help command is used to display all the possible commands in the BagPacker application for the user. @@ -271,7 +272,6 @@ All Commands: ____________________________________________________________ ``` - #### List Command List command is used to list out all items in the packing list. @@ -342,7 +342,6 @@ ________________________________________________________________________________ Mechanism: `FindCommand.execute()` calls `PackingList.keywordFinder()` with the given `keyword`. This method loops through every `item` in `packingList` to see if the `itemName` for each `item` contains the keyword(s) given. The `item`(s) that contain the keyword are placed into an ArrayList with their `itemIndex` then used in `printToUser`. - #### DeleteList Command `DeleteListCommand` is used to delete all items inside `packingList`. @@ -439,12 +438,14 @@ all createCommandObj methods except for commands without input variables (i.e. e --- -### IOHandler +### IOHandler Package The `IOHandler` package contains three main classes, which are [Parser](#parser-class), [Storage](#storage) and [Ui](#ui). These classes are used to handle input from and output to the user through the CLI, while managing the storage and retrieval of the associated `item`'s in the user's `packingList`. -### Parser Class +--- + +### Parser The Parser class has 2 main functions: 1. Reading and retrieving the relevant command, and command variables from the users input (get*CommandVariable()*) 2. Creating a command object based on the retrieved command and command variables (create*Command*Obj()) @@ -502,7 +503,7 @@ The following show the respective create methods for each command. The `command` --- -#### Storage +### Storage The `Storage` class consists of two main methods: `save()` and `load()`. The constructor of this class, which is called in `BagPacker`, will set the `file_path` of storage, which is default at "packingList.txt". @@ -527,7 +528,8 @@ Each `item` is returned to `load()` and added to the packingList. --- -#### Ui +### Ui + The `Ui` class is the main component of `BagPacker`'s Command Line Interface (CLI) interface. It is responsible for handling most of start-up and farewell messages, the CLI output, including error messages, information messages, and confirmation prompts after every `command.execute()`. @@ -538,10 +540,13 @@ Some important methods are: `errorMessage()` - shows the error type and help message to the user in the case an error occurs --- -### Packingfunc + +### Packingfunc package + The `Packingfunc` package consists of `Item` and `PackingList` classes, which are used to manage the main packing list of `BagPacker`, and its individual items. #### Item + The `Item` class contains methods used to manage and manipulate the variables `packedQuantity` and `totalQuantity`. There are two constructors of `Item`: @@ -566,8 +571,8 @@ It is used in multiple [commands](#commands-package) and [storage](#storage) to --- -## Appendix: Requirements -## Appendix A: Product scope + +## Appendix A: Product scope **Target user profile** * Has a need to pack items for travel purposes @@ -581,7 +586,7 @@ BagPacker aims to help busy students simplify their packing process by allowing --- -## Appendix B: User Stories +## Appendix B: User Stories | Version | As a ... | I want to ... | So that I can ... | @@ -602,20 +607,20 @@ BagPacker aims to help busy students simplify their packing process by allowing --- -## Appendix C: Non-Functional Requirements +## Appendix C: Non-Functional Requirements - be able to retrieve the user's packing list quickly and accurately - the quantity of each item to be packed should not be unreasonably large --- -## Appendix D: Glossary +## Appendix D: Glossary * *CLI* - Command Line Interface --- -## Appendix E: Instructions for Manual Testing +## Appendix E: Instructions for Manual Testing Download the jar file from [here](https://github.com/AY2223S2-CS2113-T14-2/tp/releases/tag/v2.1) and run `BagPacker` in a terminal with the command ``` @@ -623,7 +628,7 @@ java -jar bagpacker.jar ``` You will see a greeting screen: -```text +``` ________________________________________________________________________________________________________________________ Hi this is, ____ _____ _ @@ -647,7 +652,7 @@ You can run a few commands; refer to the [User Guide]() for the full list of com * Try adding a few items using the `add` command * Example: `add 4 /of jackets` * Expected: - ```text + ``` ________________________________________________________________________________________________________________________ New item added: [0/4] jackets ________________________________________________________________________________________________________________________ @@ -712,7 +717,8 @@ You can run a few commands; refer to the [User Guide]() for the full list of com * Try deleting your entire list using the `deletelist` command * Example: `deletelist` * Expected: - ```text + + ``` ________________________________________________________________________________________________________________________ Packing list deleted ________________________________________________________________________________________________________________________ @@ -723,6 +729,7 @@ You can run a few commands; refer to the [User Guide]() for the full list of com * To exit `BagPacker`, use the `bye` command * Example: `bye` * Expected: + ``` ________________________________________________________________________________________________________________________ Bye thanks for using, From 89f0c500ce61fb2ce4af1e36b4fb2a2e556e1403 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 22:26:53 +0800 Subject: [PATCH 193/207] Update PPP --- docs/team/linuspuah.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/team/linuspuah.md b/docs/team/linuspuah.md index bc06940c4a..c2383d4c76 100644 --- a/docs/team/linuspuah.md +++ b/docs/team/linuspuah.md @@ -43,9 +43,11 @@ It is written in Java, and has about 4k LoC. ### Contribution to the [DG](../DeveloperGuide.md) 1. Update User Stories ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) 2. Add explanation of overall command mechanism for the whole application ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) -3. Add explanation for Exceptions ([#179](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/179/files#diff-1a95edf069a4136e9cb71bee758b0dc86996f6051f0d438ec2c424557de7160b)) -4. Add explanation for Parser Class ([#184](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/184/files)) -5. Add explanation and [sequence diagram](#span-stylecolordarkgreen-contributions-to-the-developer-guide--extracts---span) for feature of +3. Add explanation for `Exceptions` ([#179](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/179/files#diff-1a95edf069a4136e9cb71bee758b0dc86996f6051f0d438ec2c424557de7160b)) +4. Add explanation for `Parser` Class ([#184](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/184/files)) +5. Add explanation for `Packall` and `Unpackall` Commands ([#195](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/195)) +6. Add explanation for `packingfunc.PackingList()` ([#191]()) +7. Add explanation and [sequence diagram](#span-stylecolordarkgreen-contributions-to-the-developer-guide--extracts---span) for feature of - adding repeated items in `AddCommand` ([#138](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/138),[#158](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/158/commits/6d154b8464ba4d57e8d19a958e8be0b554e73cd6#diff-60cb84c47c48c2d69d1f587d9c9ed3af7d99acf2c3b11cd94c8d86eb532e32e2)) - `runBagPacker()` overall Sequence Diagram ([#176](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/176/commits/0ae5782514e02b5c755b689550d1c595449d1128)) - `PackCommand` and `UnpackCommand` sequence Diagram @@ -66,6 +68,7 @@ Managed internal deadlines for group tasking ### Review/mentoring contributions - Maintain code standard before merging ([#139](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/139)) - Suggest improvements to code ([#22](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/22)) + --- ### Contributions to the Developer Guide (Extracts): ![AddExistingItemDiagram.png](..%2Fdiagrams%2FAddExistingItemDiagram.png)![BagPackerClassDiagram.png](..%2Fdiagrams%2FBagPackerClassDiagram.png)![BagPackerSequenceDiagram.png](..%2Fdiagrams%2FBagPackerSequenceDiagram.png) From 125a8f08ebac4406d8ad9132aa750e0a946cdda5 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 22:29:57 +0800 Subject: [PATCH 194/207] Fix UG table of contents links --- docs/UserGuide.md | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 067365f736..8ea0da1466 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -8,23 +8,24 @@ is unpacked and travel with an ease of mind. --- ## Table of contents -* [Quick Start](#span-stylecolor00a36c-quick-start-span) -* [Features](#span-stylecolor00a36c-features-span) - * [Help message](#span-stylecolor6495ed-help-message--span-help) - * [Adding a new item](#span-stylecolor6495ed-adding-a-new-item--span-add) - * [Deleting an item](#span-stylecolor6495ed-deleting-an-item--span-delete) - * [Packing an item](#span-stylecolor6495ed-packing-an-item--span-pack) - * [Packing all of an item](#span-stylecolor6495ed-packing-all-of-an-item--span-packall) - * [Unpacking an item](#span-stylecolor6495ed-unpacking-an-item--span-unpack) - * [Unpacking all of an item](#span-stylecolor6495ed-unpacking-all-of-an-item--span-unpackall) - * [Editing item quantity](#span-stylecolor6495ed-editing-item-quantity--span-editquantity) - * [Listing all items](#span-stylecolor6495ed-listing-all-items--span-list) - * [Listing all unpacked items](#span-stylecolor6495ed-listing-all-unpacked-items--span-listunpacked) - * [Deleting the entire list](#span-stylecolor6495ed-deleting-the-entire-list--span-deletelist) - * [Finding an item](#span-stylecolor6495ed-finding-an-item--span-find) - * [Exiting the application](#span-stylecolor6495ed-exiting-the-application--span-bye) -* [Frequently Asked Questions (FAQ)](#span-stylecolor00a36c-frequently-asked-questions--faq--span) -* [Command Summary](#span-stylecolor00a36c-command-summary-span) + +* [Quick Start](#quick-start) +* [Features](#features) + * [Help message](#help-message-help) + * [Adding a new item](#adding-a-new-item-add) + * [Deleting an item](#deleting-an-item-delete) + * [Packing an item](#packing-an-item-pack) + * [Packing all of an item](#packing-all-quantities-of-an-item-packall) + * [Unpacking an item](#unpacking-an-item-unpack) + * [Unpacking all of an item](#unpacking-all-quantities-of-an-item-unpackall) + * [Editing item quantity](#editing-item-quantity-editquantity) + * [Listing all items](#listing-all-items-list) + * [Listing all unpacked items](#listing-all-unpacked-items-listunpacked) + * [Deleting the entire list](#deleting-the-entire-list-deletelist) + * [Finding an item](#finding-an-item-find) + * [Exiting the application](#exiting-the-application-bye) +* [Frequently Asked Questions (FAQ)](#frequently-asked-questions-faq) +* [Command Summary](#command-summary) --- @@ -405,26 +406,32 @@ Example: **A**: Please check that there are no typos in the command. To check the correct spelling of the commands, please type `help` and hit enter. + **Q**: I am following the suggested input, why is it still giving me an error? **A**: For command inputs that have item quantity and item index, the / character is necessary before the of (e.g. `pack 1 /of 1` is valid but `pack 1 of 1` is not) + **Q**: Why are some commands affected by extra random inputs before or after the full command while others aren't? **A**: The commands that are not affected by extra inputs are those that have no variables (e.g. `list`, `listunpacked`, `bye`, and `help`) + **Q**: Why does `editquantity` command give me an error for a positive integer quantity? **A**: Your new input quantity may be considered invalid as it is smaller than the current packed amount of the item. (You cannot set the total quantity to be less than what is currently packed) + **Q**: Why does my list have duplicate items? **A**: Item names are caps sensitive, you could have accidentally input two items with the same name but differing in capitalisation. + **Q**: Why is the list indexes for `find` command not sequential? **A**: The index printed for `find` comes from the full packing list which can be retrieved from `list` command. + [⏫ Go to Table of Contents](#table-of-contents) | --- From 9cf400649adcb5da730e299f3f06647ff5cbc317 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 22:32:34 +0800 Subject: [PATCH 195/207] Refactor Linus' PPP --- docs/team/linuspuah.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/team/linuspuah.md b/docs/team/linuspuah.md index c2383d4c76..0c7e4d167f 100644 --- a/docs/team/linuspuah.md +++ b/docs/team/linuspuah.md @@ -8,6 +8,7 @@ It stores a packing list, edit the quantities packed and the total quantity pack It is written in Java, and has about 4k LoC. --- + ## Summary of Contributions @@ -18,6 +19,7 @@ It is written in Java, and has about 4k LoC. - 770 test-code --- + ### Enhancements implemented 1. Added `ioHandler` package - Reading in from CLI in `Parser` class ([#8](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/8/commits)) @@ -37,9 +39,12 @@ It is written in Java, and has about 4k LoC. 7. Add JavaDocs ([#163](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/163/commits)) --- + ### Contributions to the [UG](../UserGuide.md) 1. Update UG to include max integer supported by BagPacker ([#154](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/154)) + --- + ### Contribution to the [DG](../DeveloperGuide.md) 1. Update User Stories ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) 2. Add explanation of overall command mechanism for the whole application ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) @@ -51,7 +56,9 @@ It is written in Java, and has about 4k LoC. - adding repeated items in `AddCommand` ([#138](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/138),[#158](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/158/commits/6d154b8464ba4d57e8d19a958e8be0b554e73cd6#diff-60cb84c47c48c2d69d1f587d9c9ed3af7d99acf2c3b11cd94c8d86eb532e32e2)) - `runBagPacker()` overall Sequence Diagram ([#176](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/176/commits/0ae5782514e02b5c755b689550d1c595449d1128)) - `PackCommand` and `UnpackCommand` sequence Diagram + --- + ### Contributions to team-based tasks Plan and create the framework for BagPacker application @@ -65,11 +72,13 @@ Issues tracking IC Managed internal deadlines for group tasking --- + ### Review/mentoring contributions - Maintain code standard before merging ([#139](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/139)) - Suggest improvements to code ([#22](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/22)) --- + ### Contributions to the Developer Guide (Extracts): ![AddExistingItemDiagram.png](..%2Fdiagrams%2FAddExistingItemDiagram.png)![BagPackerClassDiagram.png](..%2Fdiagrams%2FBagPackerClassDiagram.png)![BagPackerSequenceDiagram.png](..%2Fdiagrams%2FBagPackerSequenceDiagram.png) ![ExceptionClassDiagram.png](..%2Fdiagrams%2FExceptionClassDiagram.png)![ExecutePackCommandSequenceDiagram.png](..%2Fdiagrams%2FExecutePackCommandSequenceDiagram.png)![ExecuteUnpackCommandSequenceDiagram.png](..%2Fdiagrams%2FExecuteUnpackCommandSequenceDiagram.png) From 46d3685f854c29ac541e06f5ab845f52c9a584d9 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 22:35:02 +0800 Subject: [PATCH 196/207] Refactor PPP --- docs/team/linuspuah.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/team/linuspuah.md b/docs/team/linuspuah.md index 0c7e4d167f..a3a4577b18 100644 --- a/docs/team/linuspuah.md +++ b/docs/team/linuspuah.md @@ -46,16 +46,16 @@ It is written in Java, and has about 4k LoC. --- ### Contribution to the [DG](../DeveloperGuide.md) -1. Update User Stories ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) +1. Update user stories ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) 2. Add explanation of overall command mechanism for the whole application ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) 3. Add explanation for `Exceptions` ([#179](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/179/files#diff-1a95edf069a4136e9cb71bee758b0dc86996f6051f0d438ec2c424557de7160b)) 4. Add explanation for `Parser` Class ([#184](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/184/files)) -5. Add explanation for `Packall` and `Unpackall` Commands ([#195](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/195)) +5. Add explanation for `Packall` and `Unpackall` commands ([#195](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/195)) 6. Add explanation for `packingfunc.PackingList()` ([#191]()) -7. Add explanation and [sequence diagram](#span-stylecolordarkgreen-contributions-to-the-developer-guide--extracts---span) for feature of +7. Add explanation and [sequence diagram](#span-stylecolordarkgreen-contributions-to-the-developer-guide--extracts---span) for - adding repeated items in `AddCommand` ([#138](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/138),[#158](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/158/commits/6d154b8464ba4d57e8d19a958e8be0b554e73cd6#diff-60cb84c47c48c2d69d1f587d9c9ed3af7d99acf2c3b11cd94c8d86eb532e32e2)) -- `runBagPacker()` overall Sequence Diagram ([#176](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/176/commits/0ae5782514e02b5c755b689550d1c595449d1128)) -- `PackCommand` and `UnpackCommand` sequence Diagram +- `runBagPacker()` overall sequence diagram ([#176](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/176/commits/0ae5782514e02b5c755b689550d1c595449d1128)) +- `PackCommand` and `UnpackCommand` sequence diagram --- From df11cfc27cca4aee76d27d833f4a12d366fdbee2 Mon Sep 17 00:00:00 2001 From: linuspuah Date: Mon, 10 Apr 2023 22:36:28 +0800 Subject: [PATCH 197/207] Refactor PPP --- docs/team/linuspuah.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/team/linuspuah.md b/docs/team/linuspuah.md index a3a4577b18..484df2c50b 100644 --- a/docs/team/linuspuah.md +++ b/docs/team/linuspuah.md @@ -3,6 +3,7 @@ # Linus Puah Jia He - Project Portfolio Page ## Overview + BagPacker is a desktop Command Line Interface (CLI) application used to manage a user's packing list. It stores a packing list, edit the quantities packed and the total quantity packed of an item, and searches the packing list for items. It is written in Java, and has about 4k LoC. @@ -13,6 +14,7 @@ It is written in Java, and has about 4k LoC. ### Code Contributed + 2266 LOC contributed ([tP Code Dashboard](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=linuspuah&tabRepo=AY2223S2-CS2113-T14-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)) - 628 lines documentation - 868 function-code @@ -21,6 +23,7 @@ It is written in Java, and has about 4k LoC. --- ### Enhancements implemented + 1. Added `ioHandler` package - Reading in from CLI in `Parser` class ([#8](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/8/commits)) - Printing out to CLI in `Ui` class ([#8](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/8/commits)) @@ -41,11 +44,13 @@ It is written in Java, and has about 4k LoC. --- ### Contributions to the [UG](../UserGuide.md) + 1. Update UG to include max integer supported by BagPacker ([#154](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/154)) --- ### Contribution to the [DG](../DeveloperGuide.md) + 1. Update user stories ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) 2. Add explanation of overall command mechanism for the whole application ([#44](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/44/commits)) 3. Add explanation for `Exceptions` ([#179](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/179/files#diff-1a95edf069a4136e9cb71bee758b0dc86996f6051f0d438ec2c424557de7160b)) @@ -74,12 +79,14 @@ Managed internal deadlines for group tasking --- ### Review/mentoring contributions + - Maintain code standard before merging ([#139](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/139)) - Suggest improvements to code ([#22](https://github.com/AY2223S2-CS2113-T14-2/tp/pull/22)) --- ### Contributions to the Developer Guide (Extracts): + ![AddExistingItemDiagram.png](..%2Fdiagrams%2FAddExistingItemDiagram.png)![BagPackerClassDiagram.png](..%2Fdiagrams%2FBagPackerClassDiagram.png)![BagPackerSequenceDiagram.png](..%2Fdiagrams%2FBagPackerSequenceDiagram.png) ![ExceptionClassDiagram.png](..%2Fdiagrams%2FExceptionClassDiagram.png)![ExecutePackCommandSequenceDiagram.png](..%2Fdiagrams%2FExecutePackCommandSequenceDiagram.png)![ExecuteUnpackCommandSequenceDiagram.png](..%2Fdiagrams%2FExecuteUnpackCommandSequenceDiagram.png) --- From 9d2ea03dda8e0a057bab1705e4ec9ba0ebaa3df0 Mon Sep 17 00:00:00 2001 From: Sophie Date: Mon, 10 Apr 2023 22:37:49 +0800 Subject: [PATCH 198/207] Correct error message output --- src/main/java/bagpacker/iohandler/Parser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/bagpacker/iohandler/Parser.java b/src/main/java/bagpacker/iohandler/Parser.java index 2388dcd58f..4d50c073e6 100644 --- a/src/main/java/bagpacker/iohandler/Parser.java +++ b/src/main/java/bagpacker/iohandler/Parser.java @@ -222,7 +222,7 @@ public static Command createAddObj() { } catch (NumberFormatException | InvalidVariablesException | ArrayIndexOutOfBoundsException | StringIndexOutOfBoundsException e) { return new IncorrectCommand("Invalid Add Command Input", - "How to use add command:\n" + PackCommand.HELP_MSG); + "How to use add command:\n" + AddCommand.HELP_MSG); } catch (InvalidQuantityException e) { return new IncorrectCommand("Invalid Item Quantity", "Can only add a positive quantity, where the total quantity of an item is at most 1,000,000"); From bbcfe008971ab6f241605833afa92af866715f5b Mon Sep 17 00:00:00 2001 From: Sophie Date: Mon, 10 Apr 2023 22:42:15 +0800 Subject: [PATCH 199/207] Update README --- docs/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index bbcc99c1e7..2181985c53 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,7 @@ -# Duke +# BagPacker + +BagPacker is a desktop application to helps you manage your packing list via a Command Line Interface (CLI)! You can add items of varying quantities, delete items, view your packing list and much more. With BagPacker, you never need to worry about packing wrongly again. Simply use BagPacker to remind you of what is unpacked and travel with an ease of mind! -{Give product intro here} Useful links: * [User Guide](UserGuide.md) From 7f5b495e3c58f8f5efda4e1aa6af675b5f9684a1 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Mon, 10 Apr 2023 22:54:15 +0800 Subject: [PATCH 200/207] Fix bug - characters get cut off in pdf Add line breaks --- docs/UserGuide.md | 81 ++++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 8ea0da1466..8e1ff1d6b8 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -27,7 +27,7 @@ is unpacked and travel with an ease of mind. * [Frequently Asked Questions (FAQ)](#frequently-asked-questions-faq) * [Command Summary](#command-summary) ---- +