Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

I need help to understand how i should write the test in Stack test class. Down under I have included the stack interface, Linkedlist class

I need help to understand how i should write the test in Stack test class.

Down under I have included the stack interface, Linkedlist class that implements the stack test, the linkedList test that extends Stacktest and the Stacktest (with have i have wrote it). All the test goes through, but I just want to be sure that i have wrote the test right.

TODO: See if all the test in Stack test class that has //TESTT are right.

import org.junit.Test; import org.junit.Before; import org.junit.Rule; import org.junit.rules.Timeout; import static org.junit.Assert.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.CoreMatchers.*; import java.lang.Integer; import java.util.EmptyStackException; import java.util.stream.IntStream; /** * Abstract test class for Stack implementations. * * Implementing test classes must only implement the getIntegerStack * method. Be careful not to override ANY other methods! */ public abstract class StackTest{ @Rule public Timeout globalTimeout = Timeout.seconds(5); private Stack stack; private int[] valuesInStack; private int initialStackSize; private Stack emptyStack; @Before public void setUp() { valuesInStack = new int[] {3, 4, 1, -123, 4, 1}; initialStackSize = valuesInStack.length; stack = getIntegerStack(); pushArrayToStack(valuesInStack, stack); emptyStack = getIntegerStack(); } /** * Push an array to the stack, in order. * * @param array An int array. * @param stack A Stack. */ private void pushArrayToStack(int[] array, Stack stack) { for (int i = 0; i < array.length; i++) { stack.push(array[i]); } } /** * This is the only method that implementing classes need to override. * * @return An instance of Stack. */ protected abstract Stack getIntegerStack(); @Test public void topIsLastPushedValue() { // Arrange int value = 1338; // Act emptyStack.push(value); stack.push(value); int emptyStackTop = emptyStack.top(); int stackTop = stack.top(); // Assert assertThat(emptyStackTop, equalTo(value)); assertThat(stackTop, equalTo(value)); } @Test(expected = EmptyStackException.class) //TESTTT public void topExceptionWhenStackIsEmpty() { emptyStack.top(); } @Test(expected = EmptyStackException.class) //TESTTTT public void popExceptionWhenStackIsEmpty() { emptyStack.pop(); } @Test public void popReturnsPushedValuesInReverseOrder() { // Arrange int lastIndex = valuesInStack.length - 1; IntStream .range(0, initialStackSize) // Act .mapToObj(i -> new ResultPair(stack.pop(), valuesInStack[lastIndex - i])) // Assert .forEach(pair -> assertThat(pair.actual, equalTo(pair.expected))); } @Test public void popFiveTimesDecreasesSizeByFive() { /// TESTTT int val = 5; popElements(stack,val); assertThat(stack.size(),equalTo(stack.size())); } @Test public void pushFiveTimesIncreasesSizeByFive() { //TESTTT int val = 5; popElements(stack,val); assertThat(stack.size(),equalTo(stack.size())); } @Test public void stateIsValidWhenPushCalledOnce() { // Arrange int val = 2; // Act emptyStack.push(val); // Assert assertThat(emptyStack.size(), equalTo(1)); assertThat(emptyStack.top(), equalTo(val)); } @Test public void isEmptyIsFalseWhenStackIsNotEmpty() { // Act boolean stackIsEmpty = stack.isEmpty(); // Assert assertFalse(stackIsEmpty); } @Test public void isEmptyIsTrueWhenStackIsEmpty() { // Act boolean emptyStackIsEmpty = emptyStack.isEmpty(); // Assert assertTrue(emptyStackIsEmpty); } @Test public void isEmptyIsTrueWhenAllElementsHaveBeenPopped() { // Act popElements(stack, initialStackSize); boolean stackIsEmpty = stack.isEmpty(); // Assert assertTrue(stackIsEmpty); } @Test public void sizeIs0WhenStackIsEmpty() { /// TESTTTT emptyStack.isEmpty(); assertEquals(0,emptyStack.size()); } @Test public void sizeIs0WhenAllElementsHaveBeenPopped() { //TESTTT popElements(stack,initialStackSize); assertEquals(0,stack.size()); } // HELPERS /** * Pops the desired amount of elements. * * @param stack A Stack. * @param amountOfElements The amount of elements to pop. */ private void popElements(Stack stack, int amountOfElements) { for (int i = 0; i < amountOfElements; i++) { stack.pop(); } } /** * Class used for stream operations when both actual and expected values * need to be gather in conjunction. */ private class ResultPair { public final T actual; public final T expected; public ResultPair(T actual, T expected) { this.actual = actual; this.expected = expected; } } }

import org.junit.Test; import org.junit.Before; import static org.junit.Assert.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.CoreMatchers.*; import java.util.Arrays; import java.util.NoSuchElementException; /** * Test class for LinkedList * * The following invariants are checked for several different states and for * each of the methods that mutate the list. * */ public class LinkedListTest extends StackTest{ /* A sequence of integers */ private int[] elements; /* An empty linked list */ private LinkedList list; @Before public void setUp() { super.setUp(); list = new LinkedList(); elements = new int[]{-919, 388, 67, -248, -309, -725, 904, 53, 90, -469, -559, 256, 612, 366, -412, -221, 347, -921, -978, 324, -858, 480, -443, 891, 329, -5, 878, -538, 445, -366, 760, 52}; } /** * This is the only method that implementing classes need to override. * * @return An instance of Stack. */ @Override protected Stack getIntegerStack() { return new LinkedList(); } //.... }

public interface Stack { void push (T elem); T pop(); T top(); int size(); boolean isEmpty(); }
import java.util.EmptyStackException; import java.util.NoSuchElementException; /** * A singly linked list. */ public class LinkedList implements Stack { private ListElement first; // First element in list. private ListElement last; // Last element in list. private int size; // Number of elements in list. /** * A list element. */ private static class ListElement{ public T data; public ListElement next; public ListElement(T data) { this.data = data; this.next = null; } } /** * Creates an empty list. */ public LinkedList() { this.first = null; this.last = null; this.size = 0; } /** * Inserts the given element at the beginning of this list. * * @param element An element to insert into the list. */ public void addFirst(T element) { ListElement firstElement = new ListElement<>(element); if (this.size == 0){ this.first = firstElement; this.last = firstElement; } else{ firstElement.next = this.first; this.first = firstElement; } this.size ++; } /** * Inserts the given element at the end of this list. * * @param element An element to insert into the list. */ public void addLast(T element) { ListElement lastElement = new ListElement<>(element); if(this.size ==0){ this.first = lastElement; } else{ this.last.next = lastElement; } this.last = lastElement; this.size ++; } /** * @return The head of the list. * @throws NoSuchElementException if the list is empty. */ public T getFirst() { if (this.first != null){ return this.first.data; } else{ throw new NoSuchElementException(); } } /** * @return The tail of the list. * @throws NoSuchElementException if the list is empty. */ public T getLast() { if(this.last != null){ return this.last.data; } else{ throw new NoSuchElementException(); } } /** * Returns an element from a specified index. * * @param index A list index. * @return The element at the specified index. * @throws IndexOutOfBoundsException if the index is out of bounds. */ public T get(int index) { if(index < 0|| index >= this.size){ throw new IndexOutOfBoundsException(); } else{ ListElementelement = this.first; for(int i = 0; i < index; i++){ element = element.next; } return element.data; } } /** * Removes the first element from the list. * * @return The removed element. * @throws NoSuchElementException if the list is empty. */ public T removeFirst() { if(this.first != null || this.size != 0){ ListElement list = this.first; this.first = first.next; size --; if(size() == 0){ last = null; } return list.data; } else{ throw new NoSuchElementException(); } } /** * Removes all of the elements from the list. */ public void clear() { this.first = null; this.last = null; this.size =0; } /** * Adds the element to the top of the stock. * @param elem */ @Override public void push(T elem) { ListElement list = new ListElement<>(elem); if( first == null){ first = list; last = first; } else{ list.next = first; first = list; } size ++; } /** * Removes and returns the top element in stack, * that is the element that was last added. * Throws an EmptyStackException if stack is empty. * @return the top element in the stack. */ @Override public T pop(){ if(isEmpty()){ throw new EmptyStackException(); }else{ ListElement list = first; first = first.next; size --; if(size() == 0){ last = null; } return list.data; } } /** * returns the top element in the stack without removing it. * Throws an EmptyStackException if stack is empty. * @return the top element. */ @Override public T top() { if(isEmpty()){ throw new EmptyStackException(); }else{ return first.data; } } /** * Returns the number of elements in the stock * @return The number of elements in the stock. */ public int size() { return this.size; } /** * Note that by definition, the list is empty if both first and last * are null, regardless of what value the size field holds (it should * be 0, otherwise something is wrong). * * @return true if this list contains no elements. */ public boolean isEmpty() { return first == null && last == null; } /** * Creates a string representation of this list. The string * representation consists of a list of the elements enclosed in * square brackets ("[]"). Adjacent elements are separated by the * characters ", " (comma and space). Elements are converted to * strings by the method toString() inherited from Object. * * Examples: * "[1, 4, 2, 3, 44]" * "[]" * * @return A string representing the list. */ public String toString() { ListElement listOfElements = this.first; String returnString = "["; while(listOfElements != null) { returnString += listOfElements.data; if(listOfElements.next != null){ returnString += ", "; } listOfElements = listOfElements.next; } returnString += "]"; return returnString; } }

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Database Design Application And Administration

Authors: Michael Mannino, Michael V. Mannino

2nd Edition

0072880678, 9780072880670

More Books

Students also viewed these Databases questions