From d7ac80103fa7382776b417baf9270428505fdb59 Mon Sep 17 00:00:00 2001 From: Emil Monrad Laursen Date: Tue, 16 May 2023 14:35:04 +0200 Subject: [PATCH] Added tests for all cases of MultDivMod visitor --- src/test/interpreter/VisitorUnitTest.java | 45 +++++++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/src/test/interpreter/VisitorUnitTest.java b/src/test/interpreter/VisitorUnitTest.java index ccc9fdc..418e930 100644 --- a/src/test/interpreter/VisitorUnitTest.java +++ b/src/test/interpreter/VisitorUnitTest.java @@ -4,8 +4,6 @@ import interpreter.types.*; import interpreter.utils.MockTerminalNode; import interpreter.utils.MockToken; -import org.antlr.v4.runtime.Token; -import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -18,7 +16,6 @@ import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; -import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; @ExtendWith(MockitoExtension.class) @@ -38,6 +35,7 @@ class VisitorUnitTest { @Mock private MineScriptParser.NegContext mockNegContext; @Mock private MineScriptParser.NotExprContext mockNotExprContext; @Mock private MineScriptParser.AddSubContext mockAddSubContext; + @Mock private MineScriptParser.MultDivModContext mockMultDivModContext; @@ -277,4 +275,45 @@ void visitAddSubValidInputReturnsNumber(int value1, int value2, String operator) } } + + @ParameterizedTest + @CsvSource ({"2,2,*", "2,2,/", "2,2,%"}) + void visitMultDivModValidInputReturnsNumber(int left, int right, String operator) { + mockMultDivModContext.op = new MockToken(operator); + Mockito.when(mockMultDivModContext.expression(0)).thenReturn(mockExpressionContext1); + Mockito.when(mockMultDivModContext.expression(1)).thenReturn(mockExpressionContext2); + Mockito.when(spyVisitor.visit(mockExpressionContext1)).thenReturn(new MSNumber(left)); + Mockito.when(spyVisitor.visit(mockExpressionContext2)).thenReturn(new MSNumber(right)); + + MSType result = spyVisitor.visitMultDivMod(mockMultDivModContext); + switch (operator) { + case "*" -> Assertions.assertEquals(left * right, ((MSNumber) result).getValue()); + case "/" -> Assertions.assertEquals(left / right, ((MSNumber) result).getValue()); + case "%" -> Assertions.assertEquals(left % right, ((MSNumber) result).getValue()); + } + } + + @ParameterizedTest + @CsvSource ({"2,0,/", "2,0,%"}) + void visitMultDivModDivByZeroThrowsRuntimeException(int left, int right, String operator) { + mockMultDivModContext.op = new MockToken(operator); + Mockito.when(mockMultDivModContext.expression(0)).thenReturn(mockExpressionContext1); + Mockito.when(mockMultDivModContext.expression(1)).thenReturn(mockExpressionContext2); + Mockito.when(spyVisitor.visit(mockExpressionContext1)).thenReturn(new MSNumber(left)); + Mockito.when(spyVisitor.visit(mockExpressionContext2)).thenReturn(new MSNumber(right)); + + Assertions.assertThrows(RuntimeException.class, () -> spyVisitor.visitMultDivMod(mockMultDivModContext)); + } + + @ParameterizedTest + @CsvSource ({"2,true,/", "2,true,%", "2,false,/", "2,false,%", "true,2,/", "true,2,%", "false,2,/", "false,2,%"}) + void visitMultDivModInvalidInputThrowsRuntimeException(String left, String right, String operator) { + mockMultDivModContext.op = new MockToken(operator); + Mockito.when(mockMultDivModContext.expression(0)).thenReturn(mockExpressionContext1); + Mockito.when(mockMultDivModContext.expression(1)).thenReturn(mockExpressionContext2); + Mockito.when(spyVisitor.visit(mockExpressionContext1)).thenReturn(new MSBool(Boolean.parseBoolean(left))); + Mockito.when(spyVisitor.visit(mockExpressionContext2)).thenReturn(new MSBool(Boolean.parseBoolean(right))); + + Assertions.assertThrows(RuntimeException.class, () -> spyVisitor.visitMultDivMod(mockMultDivModContext)); + } }