{"id":"packages-larger-program","slug":"larger-program","title":"A larger program across packages","text":"Step 4's quiz asked a fixed set of questions once. This step's quiz is a whole small application: the user adds questions, players take turns, and the program remembers who did best. It has four classes in three packages, and Main:\n\n- `quiz.domain`: Question, as before, and a new class Player, with a name and points.\n- `quiz.logic`: Quiz, which keeps the questions and the players, checks the answers and finds the best player.\n- `quiz.ui`: TextUI, which reads the commands.\n\nThe commands, each on a line of its own:\n\n- `add`, then three lines: the question, its answer and its points; it prints how many questions there are\n- `play`, then the player's name, then a reply to each question in turn\n- `best`, for the player with the most points so far\n- `quit`\n\n```java\nimport java.util.Scanner;\nimport quiz.logic.Quiz;\nimport quiz.ui.TextUI;\n\npublic class Main {\n    public static void main(String[] args) {\n        TextUI ui = new TextUI(new Scanner(System.in), new Quiz());\n        ui.start();\n    }\n}\n// ==== quiz/ui/TextUI.java ====\npackage quiz.ui;\n\nimport java.util.Scanner;\nimport quiz.domain.Player;\nimport quiz.domain.Question;\nimport quiz.logic.Quiz;\n\npublic class TextUI {\n    private Scanner scanner;\n    private Quiz quiz;\n\n    public TextUI(Scanner scanner, Quiz quiz) {\n        this.scanner = scanner;\n        this.quiz = quiz;\n    }\n\n    public void start() {\n        while (true) {\n            System.out.print(\"> \");\n            String command = this.scanner.nextLine();\n            if (command.equals(\"quit\")) {\n                System.out.println(\"Bye!\");\n                break;\n            }\n            if (command.equals(\"add\")) {\n                this.addQuestion();\n            } else if (command.equals(\"play\")) {\n                this.play();\n            } else if (command.equals(\"best\")) {\n                this.printBest();\n            } else {\n                System.out.println(\"Unknown command: \" + command);\n            }\n        }\n    }\n\n    private void addQuestion() {\n        String prompt = this.scanner.nextLine();\n        String answer = this.scanner.nextLine();\n        int points = Integer.valueOf(this.scanner.nextLine());\n        this.quiz.addQuestion(new Question(prompt, answer, points));\n        System.out.println(\"Questions: \" + this.quiz.getQuestions().size());\n    }\n\n    private void play() {\n        String name = this.scanner.nextLine();\n        Player player = this.quiz.newPlayer(name);\n        for (Question question : this.quiz.getQuestions()) {\n            System.out.println(question);\n            String reply = this.scanner.nextLine();\n            if (this.quiz.answer(player, question, reply)) {\n                System.out.println(\"Right!\");\n            } else {\n                System.out.println(\"Not quite.\");\n            }\n        }\n        System.out.println(player);\n    }\n\n    private void printBest() {\n        Player best = this.quiz.best();\n        if (best == null) {\n            System.out.println(\"No one has played yet\");\n        } else {\n            System.out.println(\"Best: \" + best);\n        }\n    }\n}\n// ==== quiz/logic/Quiz.java ====\npackage quiz.logic;\n\nimport java.util.ArrayList;\nimport quiz.domain.Player;\nimport quiz.domain.Question;\n\npublic class Quiz {\n    private ArrayList<Question> questions;\n    private ArrayList<Player> players;\n\n    public Quiz() {\n        this.questions = new ArrayList<>();\n        this.players = new ArrayList<>();\n    }\n\n    public void addQuestion(Question question) {\n        this.questions.add(question);\n    }\n\n    public ArrayList<Question> getQuestions() {\n        return this.questions;\n    }\n\n    public Player newPlayer(String name) {\n        Player player = new Player(name);\n        this.players.add(player);\n        return player;\n    }\n\n    public boolean answer(Player player, Question question, String reply) {\n        if (question.isRight(reply)) {\n            player.addPoints(question.getPoints());\n            return true;\n        }\n        return false;\n    }\n\n    public Player best() {\n        Player best = null;\n        for (Player player : this.players) {\n            if (best == null || player.getPoints() > best.getPoints()) {\n                best = player;\n            }\n        }\n        return best;\n    }\n}\n// ==== quiz/domain/Question.java ====\npackage quiz.domain;\n\npublic class Question {\n    private String prompt;\n    private String answer;\n    private int points;\n\n    public Question(String prompt, String answer, int points) {\n        this.prompt = prompt;\n        this.answer = answer;\n        this.points = points;\n    }\n\n    public boolean isRight(String reply) {\n        return reply.trim().equalsIgnoreCase(this.answer);\n    }\n\n    public int getPoints() {\n        return this.points;\n    }\n\n    @Override\n    public String toString() {\n        return this.prompt + \" (\" + this.points + \" points)\";\n    }\n}\n// ==== quiz/domain/Player.java ====\npackage quiz.domain;\n\npublic class Player {\n    private String name;\n    private int points;\n\n    public Player(String name) {\n        this.name = name;\n        this.points = 0;\n    }\n\n    public void addPoints(int points) {\n        this.points += points;\n    }\n\n    public int getPoints() {\n        return this.points;\n    }\n\n    @Override\n    public String toString() {\n        return this.name + \", \" + this.points + \" points\";\n    }\n}\n```\n\n```input\nbest\nadd\nWhich planet is the largest?\nJupiter\n2\nadd\nWhat is the chemical symbol for gold?\nAu\n3\nplay\nAda\njupiter\nAu\nplay\nBen\nSaturn\nau\nbest\nquit\n```\n\n```output\n> No one has played yet\n> Questions: 1\n> Questions: 2\n> Which planet is the largest? (2 points)\nRight!\nWhat is the chemical symbol for gold? (3 points)\nRight!\nAda, 5 points\n> Which planet is the largest? (2 points)\nNot quite.\nWhat is the chemical symbol for gold? (3 points)\nRight!\nBen, 3 points\n> Best: Ada, 5 points\n> Bye!\n```\n\n### Following a command through the packages\n\nHere's what happens for `play`, package by package:\n\n1. TextUI reads the name and asks the logic for a new player: `this.quiz.newPlayer(name)`. Quiz creates the Player, a domain object, keeps it in its list of players, and returns it.\n2. For each question, TextUI prints the question and reads the reply. `this.quiz.answer(player, question, reply)` decides: Quiz asks the Question whether the reply is right, and if it is, gives the Player the points.\n3. TextUI prints `Right!` or `Not quite.`, and at the end the player.\n\nEach package does its own part. The ui talks with the user, the logic decides, and the domain holds the data and knows its own rules. TextUI uses the domain objects only to show them and to pass them on: it never adds points itself.\n\nMain is short again. It only makes the objects that the others need and starts the user interface. It imports only what it names itself: Scanner, Quiz and TextUI. Question and Player appear nowhere in `Main.java`, so they need no import there.\n\n### Private helper methods\n\nIn TextUI, `start()` only reads a command and picks what to do. The work of each command is in a method of its own: `addQuestion()`, `play()` and `printBest()`. They're `private`, because nothing outside TextUI needs them, and they keep `start()` short enough to read at a glance, however many commands the program gets.\n\n### Growing the program: find the package first\n\nBefore writing a new feature, decide where each part of it belongs. Say the quiz should list every player. The players are already kept by Quiz, so giving them out is the logic's part. Printing them is the user interface's part. That's your task.\n","task":"Add the command `players` to the quiz. It prints each player who has played, in the order they played, one per line, like `Ada, 5 points`, or `No one has played yet` if no one has. Split the work between the packages:\n\n- in `Quiz.java`, the method `getPlayers()`, which returns the list of players\n- in `TextUI.java`, the command, which uses `getPlayers()` and prints\n\nFor the input shown, the program prints:\n\n```\n> No one has played yet\n> Questions: 1\n> How many legs does a spider have? (2 points)\nRight!\nAda, 2 points\n> How many legs does a spider have? (2 points)\nNot quite.\nBen, 0 points\n> Ada, 2 points\nBen, 0 points\n> Bye!\n```\n","kind":"code","seed":"// ==== quiz/ui/TextUI.java ====\npackage quiz.ui;\n\nimport java.util.Scanner;\nimport quiz.domain.Player;\nimport quiz.domain.Question;\nimport quiz.logic.Quiz;\n\npublic class TextUI {\n    private Scanner scanner;\n    private Quiz quiz;\n\n    public TextUI(Scanner scanner, Quiz quiz) {\n        this.scanner = scanner;\n        this.quiz = quiz;\n    }\n\n    public void start() {\n        while (true) {\n            System.out.print(\"> \");\n            String command = this.scanner.nextLine();\n            if (command.equals(\"quit\")) {\n                System.out.println(\"Bye!\");\n                break;\n            }\n            if (command.equals(\"add\")) {\n                this.addQuestion();\n            } else if (command.equals(\"play\")) {\n                this.play();\n            } else if (command.equals(\"best\")) {\n                this.printBest();\n            } else {\n                System.out.println(\"Unknown command: \" + command);\n            }\n        }\n    }\n\n    private void addQuestion() {\n        String prompt = this.scanner.nextLine();\n        String answer = this.scanner.nextLine();\n        int points = Integer.valueOf(this.scanner.nextLine());\n        this.quiz.addQuestion(new Question(prompt, answer, points));\n        System.out.println(\"Questions: \" + this.quiz.getQuestions().size());\n    }\n\n    private void play() {\n        String name = this.scanner.nextLine();\n        Player player = this.quiz.newPlayer(name);\n        for (Question question : this.quiz.getQuestions()) {\n            System.out.println(question);\n            String reply = this.scanner.nextLine();\n            if (this.quiz.answer(player, question, reply)) {\n                System.out.println(\"Right!\");\n            } else {\n                System.out.println(\"Not quite.\");\n            }\n        }\n        System.out.println(player);\n    }\n\n    private void printBest() {\n        Player best = this.quiz.best();\n        if (best == null) {\n            System.out.println(\"No one has played yet\");\n        } else {\n            System.out.println(\"Best: \" + best);\n        }\n    }\n}\n\n// ==== quiz/logic/Quiz.java ====\npackage quiz.logic;\n\nimport java.util.ArrayList;\nimport quiz.domain.Player;\nimport quiz.domain.Question;\n\npublic class Quiz {\n    private ArrayList<Question> questions;\n    private ArrayList<Player> players;\n\n    public Quiz() {\n        this.questions = new ArrayList<>();\n        this.players = new ArrayList<>();\n    }\n\n    public void addQuestion(Question question) {\n        this.questions.add(question);\n    }\n\n    public ArrayList<Question> getQuestions() {\n        return this.questions;\n    }\n\n    public Player newPlayer(String name) {\n        Player player = new Player(name);\n        this.players.add(player);\n        return player;\n    }\n\n    public boolean answer(Player player, Question question, String reply) {\n        if (question.isRight(reply)) {\n            player.addPoints(question.getPoints());\n            return true;\n        }\n        return false;\n    }\n\n    public Player best() {\n        Player best = null;\n        for (Player player : this.players) {\n            if (best == null || player.getPoints() > best.getPoints()) {\n                best = player;\n            }\n        }\n        return best;\n    }\n}\n\n// ==== quiz/domain/Question.java ====\npackage quiz.domain;\n\npublic class Question {\n    private String prompt;\n    private String answer;\n    private int points;\n\n    public Question(String prompt, String answer, int points) {\n        this.prompt = prompt;\n        this.answer = answer;\n        this.points = points;\n    }\n\n    public boolean isRight(String reply) {\n        return reply.trim().equalsIgnoreCase(this.answer);\n    }\n\n    public int getPoints() {\n        return this.points;\n    }\n\n    @Override\n    public String toString() {\n        return this.prompt + \" (\" + this.points + \" points)\";\n    }\n}\n\n// ==== quiz/domain/Player.java ====\npackage quiz.domain;\n\npublic class Player {\n    private String name;\n    private int points;\n\n    public Player(String name) {\n        this.name = name;\n        this.points = 0;\n    }\n\n    public void addPoints(int points) {\n        this.points += points;\n    }\n\n    public int getPoints() {\n        return this.points;\n    }\n\n    @Override\n    public String toString() {\n        return this.name + \", \" + this.points + \" points\";\n    }\n}\n\n// ==== Main.java ====\nimport java.util.Scanner;\nimport quiz.logic.Quiz;\nimport quiz.ui.TextUI;\n\npublic class Main {\n    public static void main(String[] args) {\n        TextUI ui = new TextUI(new Scanner(System.in), new Quiz());\n        ui.start();\n    }\n}\n","solution":"// ==== quiz/ui/TextUI.java ====\npackage quiz.ui;\n\nimport java.util.Scanner;\nimport quiz.domain.Player;\nimport quiz.domain.Question;\nimport quiz.logic.Quiz;\n\npublic class TextUI {\n    private Scanner scanner;\n    private Quiz quiz;\n\n    public TextUI(Scanner scanner, Quiz quiz) {\n        this.scanner = scanner;\n        this.quiz = quiz;\n    }\n\n    public void start() {\n        while (true) {\n            System.out.print(\"> \");\n            String command = this.scanner.nextLine();\n            if (command.equals(\"quit\")) {\n                System.out.println(\"Bye!\");\n                break;\n            }\n            if (command.equals(\"add\")) {\n                this.addQuestion();\n            } else if (command.equals(\"play\")) {\n                this.play();\n            } else if (command.equals(\"best\")) {\n                this.printBest();\n            } else if (command.equals(\"players\")) {\n                this.printPlayers();\n            } else {\n                System.out.println(\"Unknown command: \" + command);\n            }\n        }\n    }\n\n    private void addQuestion() {\n        String prompt = this.scanner.nextLine();\n        String answer = this.scanner.nextLine();\n        int points = Integer.valueOf(this.scanner.nextLine());\n        this.quiz.addQuestion(new Question(prompt, answer, points));\n        System.out.println(\"Questions: \" + this.quiz.getQuestions().size());\n    }\n\n    private void play() {\n        String name = this.scanner.nextLine();\n        Player player = this.quiz.newPlayer(name);\n        for (Question question : this.quiz.getQuestions()) {\n            System.out.println(question);\n            String reply = this.scanner.nextLine();\n            if (this.quiz.answer(player, question, reply)) {\n                System.out.println(\"Right!\");\n            } else {\n                System.out.println(\"Not quite.\");\n            }\n        }\n        System.out.println(player);\n    }\n\n    private void printBest() {\n        Player best = this.quiz.best();\n        if (best == null) {\n            System.out.println(\"No one has played yet\");\n        } else {\n            System.out.println(\"Best: \" + best);\n        }\n    }\n\n    private void printPlayers() {\n        if (this.quiz.getPlayers().isEmpty()) {\n            System.out.println(\"No one has played yet\");\n            return;\n        }\n        for (Player player : this.quiz.getPlayers()) {\n            System.out.println(player);\n        }\n    }\n}\n\n// ==== quiz/logic/Quiz.java ====\npackage quiz.logic;\n\nimport java.util.ArrayList;\nimport quiz.domain.Player;\nimport quiz.domain.Question;\n\npublic class Quiz {\n    private ArrayList<Question> questions;\n    private ArrayList<Player> players;\n\n    public Quiz() {\n        this.questions = new ArrayList<>();\n        this.players = new ArrayList<>();\n    }\n\n    public void addQuestion(Question question) {\n        this.questions.add(question);\n    }\n\n    public ArrayList<Question> getQuestions() {\n        return this.questions;\n    }\n\n    public ArrayList<Player> getPlayers() {\n        return this.players;\n    }\n\n    public Player newPlayer(String name) {\n        Player player = new Player(name);\n        this.players.add(player);\n        return player;\n    }\n\n    public boolean answer(Player player, Question question, String reply) {\n        if (question.isRight(reply)) {\n            player.addPoints(question.getPoints());\n            return true;\n        }\n        return false;\n    }\n\n    public Player best() {\n        Player best = null;\n        for (Player player : this.players) {\n            if (best == null || player.getPoints() > best.getPoints()) {\n                best = player;\n            }\n        }\n        return best;\n    }\n}\n\n// ==== quiz/domain/Question.java ====\npackage quiz.domain;\n\npublic class Question {\n    private String prompt;\n    private String answer;\n    private int points;\n\n    public Question(String prompt, String answer, int points) {\n        this.prompt = prompt;\n        this.answer = answer;\n        this.points = points;\n    }\n\n    public boolean isRight(String reply) {\n        return reply.trim().equalsIgnoreCase(this.answer);\n    }\n\n    public int getPoints() {\n        return this.points;\n    }\n\n    @Override\n    public String toString() {\n        return this.prompt + \" (\" + this.points + \" points)\";\n    }\n}\n\n// ==== quiz/domain/Player.java ====\npackage quiz.domain;\n\npublic class Player {\n    private String name;\n    private int points;\n\n    public Player(String name) {\n        this.name = name;\n        this.points = 0;\n    }\n\n    public void addPoints(int points) {\n        this.points += points;\n    }\n\n    public int getPoints() {\n        return this.points;\n    }\n\n    @Override\n    public String toString() {\n        return this.name + \", \" + this.points + \" points\";\n    }\n}\n\n// ==== Main.java ====\nimport java.util.Scanner;\nimport quiz.logic.Quiz;\nimport quiz.ui.TextUI;\n\npublic class Main {\n    public static void main(String[] args) {\n        TextUI ui = new TextUI(new Scanner(System.in), new Quiz());\n        ui.start();\n    }\n}\n","hints":["In Quiz, `getPlayers()` returns `this.players`, an `ArrayList<Player>`, like `getQuestions()` returns the questions.","In TextUI, add `else if (command.equals(\"players\"))` to the chain in `start()`, and put the work in a private method like `printBest()`. If `this.quiz.getPlayers().isEmpty()`, print the message; otherwise print each player with a for-each loop."],"tests":[{"name":"Test 1","stdin":"players\nadd\nHow many legs does a spider have?\n8\n2\nplay\nAda\n8\nplay\nBen\nsix\nplayers\nquit\n","expect":"> No one has played yet\n> Questions: 1\n> How many legs does a spider have? (2 points)\nRight!\nAda, 2 points\n> How many legs does a spider have? (2 points)\nNot quite.\nBen, 0 points\n> Ada, 2 points\nBen, 0 points\n> Bye!","hidden":false},{"name":"Test 2","stdin":"add\nWhich planet is the largest?\nJupiter\n2\nadd\nWhat is the chemical symbol for gold?\nAu\n3\nplay\nCleo\nMars\nAu\nplay\nDev\njupiter\nau\nplay\nEli\nno\nno\nplayers\nbest\nquit\n","expect":"> Questions: 1\n> Questions: 2\n> Which planet is the largest? (2 points)\nNot quite.\nWhat is the chemical symbol for gold? (3 points)\nRight!\nCleo, 3 points\n> Which planet is the largest? (2 points)\nRight!\nWhat is the chemical symbol for gold? (3 points)\nRight!\nDev, 5 points\n> Which planet is the largest? (2 points)\nNot quite.\nWhat is the chemical symbol for gold? (3 points)\nNot quite.\nEli, 0 points\n> Cleo, 3 points\nDev, 5 points\nEli, 0 points\n> Best: Dev, 5 points\n> Bye!","hidden":true},{"name":"Test 3","stdin":"","call":"Quiz quiz = new Quiz();\nSystem.out.println(quiz.getPlayers().size());\nquiz.newPlayer(\"Ada\");\nquiz.newPlayer(\"Ben\");\nSystem.out.println(quiz.getPlayers().size() + \" \" + quiz.getPlayers().get(1));\n","expect":"0\n2 Ben, 0 points","hidden":true}],"require":[],"forbid":[{"pattern":"==== quiz/logic/Quiz\\.java ====(?:(?!// ====)[\\s\\S])*System\\.out","raw":true,"message":"Quiz is logic: `getPlayers()` returns the list, and TextUI prints it."}],"more":[{"task":"A tailor's shop takes in clothes to alter, and its program is in three packages: `tailor.domain` with the class Garment, `tailor.logic` with the class Workroom, and `tailor.ui` with a TextUI. Main gives the user interface a Scanner that reads a String, as in module 25, so the program runs without anyone typing. What does it print?\n","kind":"predict","seed":"import java.util.Scanner;\nimport tailor.logic.Workroom;\nimport tailor.ui.TextUI;\n\npublic class Main {\n    public static void main(String[] args) {\n        Scanner input = new Scanner(\"drop\\nNadia\\ntrousers\\ndrop\\nHugo\\njacket\\npickup\\n1\\npickup\\n1\\ndrop\\nGreta\\nskirt\\nquit\\n\");\n        TextUI ui = new TextUI(input, new Workroom());\n        ui.start();\n    }\n}\n// ==== tailor/ui/TextUI.java ====\npackage tailor.ui;\n\nimport java.util.Scanner;\nimport tailor.domain.Garment;\nimport tailor.logic.Workroom;\n\npublic class TextUI {\n    private Scanner scanner;\n    private Workroom workroom;\n\n    public TextUI(Scanner scanner, Workroom workroom) {\n        this.scanner = scanner;\n        this.workroom = workroom;\n    }\n\n    public void start() {\n        while (true) {\n            String command = this.scanner.nextLine();\n            if (command.equals(\"quit\")) {\n                System.out.println(this.workroom.count() + \" garments waiting\");\n                break;\n            }\n            if (command.equals(\"drop\")) {\n                String customer = this.scanner.nextLine();\n                String item = this.scanner.nextLine();\n                System.out.println(\"Order \" + this.workroom.drop(customer, item));\n            } else if (command.equals(\"pickup\")) {\n                int number = Integer.valueOf(this.scanner.nextLine());\n                Garment garment = this.workroom.pickUp(number);\n                if (garment == null) {\n                    System.out.println(\"Nothing for order \" + number);\n                } else {\n                    System.out.println(garment.getItem() + \" for \" + garment.getCustomer());\n                }\n            }\n        }\n    }\n}\n// ==== tailor/logic/Workroom.java ====\npackage tailor.logic;\n\nimport java.util.ArrayList;\nimport tailor.domain.Garment;\n\npublic class Workroom {\n    private ArrayList<Garment> garments;\n    private int nextNumber;\n\n    public Workroom() {\n        this.garments = new ArrayList<>();\n        this.nextNumber = 1;\n    }\n\n    public int drop(String customer, String item) {\n        Garment garment = new Garment(customer, item, this.nextNumber);\n        this.garments.add(garment);\n        this.nextNumber++;\n        return garment.getNumber();\n    }\n\n    public Garment pickUp(int number) {\n        for (Garment garment : this.garments) {\n            if (garment.getNumber() == number) {\n                this.garments.remove(garment);\n                return garment;\n            }\n        }\n        return null;\n    }\n\n    public int count() {\n        return this.garments.size();\n    }\n}\n// ==== tailor/domain/Garment.java ====\npackage tailor.domain;\n\npublic class Garment {\n    private String customer;\n    private String item;\n    private int number;\n\n    public Garment(String customer, String item, int number) {\n        this.customer = customer;\n        this.item = item;\n        this.number = number;\n    }\n\n    public String getCustomer() {\n        return this.customer;\n    }\n\n    public String getItem() {\n        return this.item;\n    }\n\n    public int getNumber() {\n        return this.number;\n    }\n}\n","solution":"import java.util.Scanner;\nimport tailor.logic.Workroom;\nimport tailor.ui.TextUI;\n\npublic class Main {\n    public static void main(String[] args) {\n        Scanner input = new Scanner(\"drop\\nNadia\\ntrousers\\ndrop\\nHugo\\njacket\\npickup\\n1\\npickup\\n1\\ndrop\\nGreta\\nskirt\\nquit\\n\");\n        TextUI ui = new TextUI(input, new Workroom());\n        ui.start();\n    }\n}\n// ==== tailor/ui/TextUI.java ====\npackage tailor.ui;\n\nimport java.util.Scanner;\nimport tailor.domain.Garment;\nimport tailor.logic.Workroom;\n\npublic class TextUI {\n    private Scanner scanner;\n    private Workroom workroom;\n\n    public TextUI(Scanner scanner, Workroom workroom) {\n        this.scanner = scanner;\n        this.workroom = workroom;\n    }\n\n    public void start() {\n        while (true) {\n            String command = this.scanner.nextLine();\n            if (command.equals(\"quit\")) {\n                System.out.println(this.workroom.count() + \" garments waiting\");\n                break;\n            }\n            if (command.equals(\"drop\")) {\n                String customer = this.scanner.nextLine();\n                String item = this.scanner.nextLine();\n                System.out.println(\"Order \" + this.workroom.drop(customer, item));\n            } else if (command.equals(\"pickup\")) {\n                int number = Integer.valueOf(this.scanner.nextLine());\n                Garment garment = this.workroom.pickUp(number);\n                if (garment == null) {\n                    System.out.println(\"Nothing for order \" + number);\n                } else {\n                    System.out.println(garment.getItem() + \" for \" + garment.getCustomer());\n                }\n            }\n        }\n    }\n}\n// ==== tailor/logic/Workroom.java ====\npackage tailor.logic;\n\nimport java.util.ArrayList;\nimport tailor.domain.Garment;\n\npublic class Workroom {\n    private ArrayList<Garment> garments;\n    private int nextNumber;\n\n    public Workroom() {\n        this.garments = new ArrayList<>();\n        this.nextNumber = 1;\n    }\n\n    public int drop(String customer, String item) {\n        Garment garment = new Garment(customer, item, this.nextNumber);\n        this.garments.add(garment);\n        this.nextNumber++;\n        return garment.getNumber();\n    }\n\n    public Garment pickUp(int number) {\n        for (Garment garment : this.garments) {\n            if (garment.getNumber() == number) {\n                this.garments.remove(garment);\n                return garment;\n            }\n        }\n        return null;\n    }\n\n    public int count() {\n        return this.garments.size();\n    }\n}\n// ==== tailor/domain/Garment.java ====\npackage tailor.domain;\n\npublic class Garment {\n    private String customer;\n    private String item;\n    private int number;\n\n    public Garment(String customer, String item, int number) {\n        this.customer = customer;\n        this.item = item;\n        this.number = number;\n    }\n\n    public String getCustomer() {\n        return this.customer;\n    }\n\n    public String getItem() {\n        return this.item;\n    }\n\n    public int getNumber() {\n        return this.number;\n    }\n}\n","hints":["Follow the input line by line: `drop` reads a name and a garment and prints the order number that Workroom returns, and `pickup` reads an order number. `nextNumber` only grows: a garment that is picked up doesn't give its number back.","The second `pickup` of order 1 finds nothing, since Nadia's trousers left the list the first time. At `quit`, Hugo's jacket and Greta's skirt are still waiting."],"tests":[{"name":"Output","stdin":"","expect":"Order 1\nOrder 2\ntrousers for Nadia\nNothing for order 1\nOrder 3\n2 garments waiting","hidden":false}],"require":[],"forbid":[],"lines":["Order 1","Order 2","trousers for Nadia","Nothing for order 1","Order 3","2 garments waiting"]},{"task":"The shoe store's program gets its user interface. `Shoe.java` now also has `getModel()`, and `Stock.java` is the one from step 2. `Main.java` is ready. Two parts are yours:\n\n- In `Stock.java`, add `sell(String model, int size)`: if the stock has a pair of that model (exactly as written) and size, it removes one such pair and returns `true`; otherwise it returns `false`. Stock prints nothing.\n- In `shoestore/ui/TextUI.java`, write the class `TextUI`, in the package `shoestore.ui`. Its constructor takes a `Scanner` and a `Stock`, and `start()` reads commands, with the prompt `> ` before each one:\n  - `add`: the next two lines are a model and a size. Add the pair to the stock, and print `Added ` and the shoe, like `Added Loafer, size 42`.\n  - `sell`: the next two lines are a model and a size. Sell a pair and print `Sold Loafer, size 42`, or print `Not in stock: Loafer, size 42` if the stock has none.\n  - `size`: the next line is a size. Print `Pairs in size 42: ` and the number of pairs of that size.\n  - `quit`: print `Pairs left: ` and the number of pairs in the stock, and return.\n  - Anything else: print `Unknown command: ` and the command.\n\nFor the input shown, the program prints:\n\n```\n> Added Trail runner, size 42\n> Added Loafer, size 42\n> Added Trail runner, size 39\n> Pairs in size 42: 2\n> Not in stock: Loafer, size 40\n> Sold Loafer, size 42\n> Pairs in size 42: 1\n> Pairs left: 2\n```\n","kind":"code","seed":"// ==== shoestore/ui/TextUI.java ====\npackage shoestore.ui;\n\n// Write the imports and the class TextUI here.\n\n// ==== shoestore/logic/Stock.java ====\npackage shoestore.logic;\n\nimport java.util.ArrayList;\nimport shoestore.domain.Shoe;\n\npublic class Stock {\n    private ArrayList<Shoe> shoes;\n\n    public Stock() {\n        this.shoes = new ArrayList<>();\n    }\n\n    public void add(Shoe shoe) {\n        this.shoes.add(shoe);\n    }\n\n    public int count() {\n        return this.shoes.size();\n    }\n\n    public int countSize(int size) {\n        int count = 0;\n        for (Shoe shoe : this.shoes) {\n            if (shoe.getSize() == size) {\n                count++;\n            }\n        }\n        return count;\n    }\n\n    // Write the method sell here.\n}\n\n// ==== shoestore/domain/Shoe.java ====\npackage shoestore.domain;\n\npublic class Shoe {\n    private String model;\n    private int size;\n\n    public Shoe(String model, int size) {\n        this.model = model;\n        this.size = size;\n    }\n\n    public String getModel() {\n        return this.model;\n    }\n\n    public int getSize() {\n        return this.size;\n    }\n\n    @Override\n    public String toString() {\n        return this.model + \", size \" + this.size;\n    }\n}\n\n// ==== Main.java ====\nimport java.util.Scanner;\nimport shoestore.logic.Stock;\nimport shoestore.ui.TextUI;\n\npublic class Main {\n    public static void main(String[] args) {\n        TextUI ui = new TextUI(new Scanner(System.in), new Stock());\n        ui.start();\n    }\n}\n","solution":"// ==== shoestore/ui/TextUI.java ====\npackage shoestore.ui;\n\nimport java.util.Scanner;\nimport shoestore.domain.Shoe;\nimport shoestore.logic.Stock;\n\npublic class TextUI {\n    private Scanner scanner;\n    private Stock stock;\n\n    public TextUI(Scanner scanner, Stock stock) {\n        this.scanner = scanner;\n        this.stock = stock;\n    }\n\n    public void start() {\n        while (true) {\n            System.out.print(\"> \");\n            String command = this.scanner.nextLine();\n            if (command.equals(\"quit\")) {\n                System.out.println(\"Pairs left: \" + this.stock.count());\n                break;\n            }\n            if (command.equals(\"add\")) {\n                this.add();\n            } else if (command.equals(\"sell\")) {\n                this.sell();\n            } else if (command.equals(\"size\")) {\n                int size = Integer.valueOf(this.scanner.nextLine());\n                System.out.println(\"Pairs in size \" + size + \": \" + this.stock.countSize(size));\n            } else {\n                System.out.println(\"Unknown command: \" + command);\n            }\n        }\n    }\n\n    private void add() {\n        String model = this.scanner.nextLine();\n        int size = Integer.valueOf(this.scanner.nextLine());\n        Shoe shoe = new Shoe(model, size);\n        this.stock.add(shoe);\n        System.out.println(\"Added \" + shoe);\n    }\n\n    private void sell() {\n        String model = this.scanner.nextLine();\n        int size = Integer.valueOf(this.scanner.nextLine());\n        if (this.stock.sell(model, size)) {\n            System.out.println(\"Sold \" + model + \", size \" + size);\n        } else {\n            System.out.println(\"Not in stock: \" + model + \", size \" + size);\n        }\n    }\n}\n\n// ==== shoestore/logic/Stock.java ====\npackage shoestore.logic;\n\nimport java.util.ArrayList;\nimport shoestore.domain.Shoe;\n\npublic class Stock {\n    private ArrayList<Shoe> shoes;\n\n    public Stock() {\n        this.shoes = new ArrayList<>();\n    }\n\n    public void add(Shoe shoe) {\n        this.shoes.add(shoe);\n    }\n\n    public int count() {\n        return this.shoes.size();\n    }\n\n    public int countSize(int size) {\n        int count = 0;\n        for (Shoe shoe : this.shoes) {\n            if (shoe.getSize() == size) {\n                count++;\n            }\n        }\n        return count;\n    }\n\n    public boolean sell(String model, int size) {\n        for (Shoe shoe : this.shoes) {\n            if (shoe.getModel().equals(model) && shoe.getSize() == size) {\n                this.shoes.remove(shoe);\n                return true;\n            }\n        }\n        return false;\n    }\n}\n\n// ==== shoestore/domain/Shoe.java ====\npackage shoestore.domain;\n\npublic class Shoe {\n    private String model;\n    private int size;\n\n    public Shoe(String model, int size) {\n        this.model = model;\n        this.size = size;\n    }\n\n    public String getModel() {\n        return this.model;\n    }\n\n    public int getSize() {\n        return this.size;\n    }\n\n    @Override\n    public String toString() {\n        return this.model + \", size \" + this.size;\n    }\n}\n\n// ==== Main.java ====\nimport java.util.Scanner;\nimport shoestore.logic.Stock;\nimport shoestore.ui.TextUI;\n\npublic class Main {\n    public static void main(String[] args) {\n        TextUI ui = new TextUI(new Scanner(System.in), new Stock());\n        ui.start();\n    }\n}\n","hints":["`sell` goes through the shoes and compares both the model, with `equals`, and the size. At the first match it removes that shoe with `this.shoes.remove(shoe)` and returns `true` right away; after the loop, it returns `false`.","TextUI imports `java.util.Scanner`, `shoestore.domain.Shoe` and `shoestore.logic.Stock`. Read a size with `Integer.valueOf(this.scanner.nextLine())`. Private methods such as `add()` and `sell()` keep `start()` short, as in the lesson's quiz."],"tests":[{"name":"Test 1","stdin":"add\nTrail runner\n42\nadd\nLoafer\n42\nadd\nTrail runner\n39\nsize\n42\nsell\nLoafer\n40\nsell\nLoafer\n42\nsize\n42\nquit\n","expect":"> Added Trail runner, size 42\n> Added Loafer, size 42\n> Added Trail runner, size 39\n> Pairs in size 42: 2\n> Not in stock: Loafer, size 40\n> Sold Loafer, size 42\n> Pairs in size 42: 1\n> Pairs left: 2","hidden":false},{"name":"Test 2","stdin":"size\n38\nsell\nSandal\n38\nadd\nSandal\n38\nadd\nSandal\n38\nrestock\nsell\nsandal\n38\nsell\nSandal\n38\nsize\n38\nquit\n","expect":"> Pairs in size 38: 0\n> Not in stock: Sandal, size 38\n> Added Sandal, size 38\n> Added Sandal, size 38\n> Unknown command: restock\n> Not in stock: sandal, size 38\n> Sold Sandal, size 38\n> Pairs in size 38: 1\n> Pairs left: 1","hidden":true},{"name":"Test 3","stdin":"","call":"Stock stock = new Stock();\nstock.add(new Shoe(\"Boot\", 40));\nstock.add(new Shoe(\"Boot\", 41));\nstock.add(new Shoe(\"Boot\", 40));\nSystem.out.println(stock.sell(\"Boot\", 42) + \" \" + stock.sell(\"Boot\", 40) + \" \" + stock.countSize(40) + \" \" + stock.count());\n","expect":"false true 1 2","hidden":true},{"name":"Test 4","stdin":"","call":"Stock stock = new Stock();\nTextUI ui = new TextUI(new Scanner(\"add\\nClog\\n44\\nsell\\nClog\\n44\\nsell\\nClog\\n44\\nquit\\n\"), stock);\nui.start();\nSystem.out.println(stock.count());\n","expect":"> Added Clog, size 44\n> Sold Clog, size 44\n> Not in stock: Clog, size 44\n> Pairs left: 0\n0","hidden":true}],"require":[],"forbid":[{"pattern":"==== shoestore/logic/Stock\\.java ====(?:(?!// ====)[\\s\\S])*System\\.out","raw":true,"message":"Stock is logic: `sell` returns `true` or `false`, and TextUI prints the messages."}]}]}