
package ua;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import java.util.NoSuchElementException;

public class TqsStackTestAI {

	@Test
	void testStackIsEmptyOnConstruction() {
		TqsStack<Integer> stack = new TqsStack<>();
		assertTrue(stack.isEmpty(), "Stack should be empty on construction");
	}

	@Test
	void testStackHasSizeZeroOnConstruction() {
		TqsStack<Integer> stack = new TqsStack<>();
		assertEquals(0, stack.size(), "Stack size should be 0 on construction");
	}

	@Test
	void testPushNElementsStackNotEmptyAndSizeN() {
		TqsStack<Integer> stack = new TqsStack<>();
		int n = 5;
		for (int i = 0; i < n; i++) {
			stack.push(i);
		}
		assertFalse(stack.isEmpty(), "Stack should not be empty after pushes");
		assertEquals(n, stack.size(), "Stack size should be n after n pushes");
	}

	@Test
	void testPushThenPopReturnsSameElement() {
		TqsStack<String> stack = new TqsStack<>();
		String x = "element";
		stack.push(x);
		assertEquals(x, stack.pop(), "Popped value should be the same as pushed");
	}

	@Test
	void testPushThenPeekReturnsSameElementSizeUnchanged() {
		TqsStack<String> stack = new TqsStack<>();
		String x = "peeked";
		stack.push(x);
		int sizeBefore = stack.size();
		assertEquals(x, stack.peek(), "Peeked value should be the same as pushed");
		assertEquals(sizeBefore, stack.size(), "Stack size should not change after peek");
	}

	@Test
	void testPopAllElementsStackEmptyAndSizeZero() {
		TqsStack<Integer> stack = new TqsStack<>();
		int n = 3;
		for (int i = 0; i < n; i++) {
			stack.push(i);
		}
		for (int i = 0; i < n; i++) {
			stack.pop();
		}
		assertTrue(stack.isEmpty(), "Stack should be empty after popping all elements");
		assertEquals(0, stack.size(), "Stack size should be 0 after popping all elements");
	}

	@Test
	void testPopOnEmptyStackThrowsException() {
		TqsStack<Integer> stack = new TqsStack<>();
		assertThrows(NoSuchElementException.class, stack::pop, "Pop on empty stack should throw");
	}

	@Test
	void testPeekOnEmptyStackThrowsException() {
		TqsStack<Integer> stack = new TqsStack<>();
		assertThrows(NoSuchElementException.class, stack::peek, "Peek on empty stack should throw");
	}


}
