Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions MODEL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
### class Basket

| Methods | Members | Scenario | Output |
|--------------------------------------|---------------------------|--------------------------------------------------------------------------------------------------|---------|
| `add(String bagelName)` | `ArrayList<String> items` | Adds a bagel item to basket<br>If basket is full, we tell the user it is | boolean |
| `remove(String bagleName)` | `ArrayList<String> items` | Removes a bagel item from the basket and returns true<br>In case the bagel is not in the list we | boolean |
| `changeBasketCapacity(int capacity)` | `int capacity` | Alters the basket's capacity | void |
41 changes: 41 additions & 0 deletions src/main/java/com/booleanuk/core/Basket.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,46 @@
package com.booleanuk.core;

import java.util.ArrayList;

public class Basket {
private int maxCapcity = 5;
private ArrayList<String> items = new ArrayList<>();

public boolean add(String bagelName) {
if (items.contains(bagelName) || maxCapcity < items.size()) return false;
items.add(bagelName);
return true;
}

public boolean remove(String bagelName) {
if (!items.contains(bagelName)) return false;
items.remove(bagelName);
return true;
}

public void changeBasketCapacity(int capacity) {
if (capacity <= 0) return;

maxCapcity = capacity;

if (maxCapcity < items.size()) {
ArrayList<String> _newItemListing = new ArrayList<>();

for (int i = 0; i < maxCapcity; i++)
_newItemListing.add(items.get(i));

items = _newItemListing;
}
}

public int getCapacity() {
return maxCapcity;
}

public String getItemsAsString() {
StringBuilder _sb = new StringBuilder();
for (String item : items)
_sb.append(" - ").append(item).append("\n");
return _sb.toString();
}
}
17 changes: 17 additions & 0 deletions src/main/java/com/migzus/terminal/menus/Button.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.migzus.terminal.menus;

public class Button {
public boolean disabled = false;
public final String displayName;

private final Callable callable;

public Button(String name, Callable callback) {
displayName = name;
callable = callback;
}

public void onSelect() {
callable.call();
}
}
39 changes: 39 additions & 0 deletions src/main/java/com/migzus/terminal/menus/Callable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.migzus.terminal.menus;

import java.lang.reflect.Method;

public class Callable {
private Method method;
private final Object obj;

public Callable(Object obj, String methodName) {
try {
method = obj.getClass().getMethod(methodName);
}
catch (Exception e) {
System.out.println(e.getMessage());
System.out.println("There are no methods with the name " + methodName + " in the " + obj.getClass().getName() + " class!");
}

this.obj = obj;
}

public Object call(Object...args) {
if (method == null) {
System.out.println("Invalid call. Method was not found therefore you cannot invoke the method.");
return null;
}

try {
return method.invoke(obj, args);
}
catch (Exception e) {
System.out.println(e.getMessage());
System.out.println("Cannot invoke call on callback! method variable is: " + method);
}

return null;
}

public Object getTargetReference() { return obj; }
}
119 changes: 119 additions & 0 deletions src/main/java/com/migzus/terminal/menus/Menu.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package com.migzus.terminal.menus;

import java.util.ArrayList;
import java.util.Scanner;

public class Menu {
public static Menu currentActiveMenu;
public Menu parentMenu;

public Callable afterMenuPrintCallback;

public String name = "Menu";

private int selectIndex;
private final ArrayList<Button> buttons = new ArrayList<>();
private boolean hasFocus;

public Menu(String newName) {
name = newName;
}

public void pushButton(Button btn) {
if (hasButton(btn.displayName)) return;
buttons.add(btn);
}

public void popButton(String btnName) {
for (Button b : buttons) {
if (btnName.equals(b.displayName)) {
buttons.remove(b);
return;
}
}
}

public boolean hasButton(String btnName) {
for (Button b : buttons)
if (btnName.equals(b.displayName))
return true;
return false;
}

public void update() {
while (hasFocus) {
try {
Scanner _scanner = new Scanner(System.in);

switch (_scanner.next()) {
case "c":
buttons.get(selectIndex).onSelect();
break;
case "q":
unfocus();
break;
case "w":
selectIndex = (selectIndex - 1) % buttons.size();
if (selectIndex < 0) selectIndex += buttons.size();
printMenu();
break;
case "s":
selectIndex = (selectIndex + 1) % buttons.size();
printMenu();
break;
default:
break;
}
}
catch (Exception e) {
System.out.println(e.getMessage() + " : Invalid key.");
}
}
}

public void focus() {
hasFocus = true;

if (Menu.currentActiveMenu != null) {
Menu.currentActiveMenu.unfocus();
parentMenu = Menu.currentActiveMenu;
}

Menu.currentActiveMenu = this;

printMenu();
update();
}

public boolean hasFocus() {
return hasFocus;
}

public void unfocus() {
hasFocus = false;

if (parentMenu != null) {
Menu.currentActiveMenu = null;
parentMenu.focus();
}
}

public void printMenu() {
Menu.clearScreen();

StringBuilder _buttonListing = new StringBuilder();
for (int i = 0; i < buttons.size(); i++)
_buttonListing.append(i == selectIndex ? " -> " : " ").append(buttons.get(i).displayName).append("\n");

System.out.println(" " + name + "\n" +
"-".repeat(name.length() + 6) + "\n" +
_buttonListing);

if (afterMenuPrintCallback != null)
afterMenuPrintCallback.call();
}

public static void clearScreen() {
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
}
}
54 changes: 53 additions & 1 deletion src/test/java/com/booleanuk/core/BasketTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,58 @@
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

class BasketTest {
public class BasketTest {
@Test
public void testAdding() {
Basket _basket = new Basket();

Assertions.assertTrue(_basket.add("plain_bagel"));
Assertions.assertTrue(_basket.add("everything_bagel"));
Assertions.assertTrue(_basket.add("egg_bagel"));

Assertions.assertFalse(_basket.add("everything_bagel"));
}

@Test
public void testRemoving() {
Basket _basket = new Basket();

_basket.add("plain_bagel");
_basket.add("everything_bagel");
_basket.add("egg_bagel");

Assertions.assertTrue(_basket.remove("everything_bagel"));
Assertions.assertFalse(_basket.remove("gluck_bagel"));
}

@Test
public void adjustBasketCapacity() {
Basket _basket = new Basket();

_basket.changeBasketCapacity(3);

Assertions.assertEquals(3, _basket.getCapacity());

_basket.changeBasketCapacity(10);

Assertions.assertNotEquals(3, _basket.getCapacity());

_basket.add("plain_bagel");
_basket.add("everything_bagel");
_basket.add("egg_bagel");

System.out.println("-----------------------------------\n" + _basket.getItemsAsString());
_basket.changeBasketCapacity(2);
System.out.println("After alteration:\n" + _basket.getItemsAsString());
}

@Test
public void testRemovingBeyond() {
Basket _basket = new Basket();

Assertions.assertTrue(_basket.add("plain_bagel"));

Assertions.assertTrue(_basket.remove("plain_bagel"));
Assertions.assertFalse(_basket.remove("plain_bagel"));
}
}