transcendental-lisp/src/test/kotlin/function/builtin/math/RemainderTest.kt

116 lines
2.7 KiB
Kotlin

package function.builtin.math
import function.ArgumentValidator.BadArgumentTypeException
import function.ArgumentValidator.TooFewArgumentsException
import function.ArgumentValidator.TooManyArgumentsException
import function.builtin.math.Divide.DivideByZeroException
import org.junit.jupiter.api.Assertions.assertThrows
import org.junit.jupiter.api.Test
import sexpression.LispNumber
import testutil.LispTestInstance
import testutil.SymbolAndFunctionCleaner
import testutil.TestUtilities.assertSExpressionsMatch
import testutil.TestUtilities.evaluateString
@LispTestInstance
class RemainderTest : SymbolAndFunctionCleaner() {
@Test
fun rem() {
val input = "(rem 5 3)"
assertSExpressionsMatch(LispNumber("2"), evaluateString(input))
}
@Test
fun remainder() {
val input = "(remainder 11 7)"
assertSExpressionsMatch(LispNumber("4"), evaluateString(input))
}
@Test
fun dividendGreaterThanDivisor() {
val input = "(rem 21 19)"
assertSExpressionsMatch(LispNumber("2"), evaluateString(input))
}
@Test
fun dividendLessThanDivisor() {
val input = "(rem 5 239)"
assertSExpressionsMatch(LispNumber("5"), evaluateString(input))
}
@Test
fun dividendEqualToDivisor() {
val input = "(rem 5 5)"
assertSExpressionsMatch(LispNumber("0"), evaluateString(input))
}
@Test
fun dividendMultipleOfDivisor() {
val input = "(rem 20 5)"
assertSExpressionsMatch(LispNumber("0"), evaluateString(input))
}
@Test
fun divisorOfOne() {
val input = "(rem 5 1)"
assertSExpressionsMatch(LispNumber("0"), evaluateString(input))
}
@Test
fun dividendOfZero() {
val input = "(rem 0 2309)"
assertSExpressionsMatch(LispNumber("0"), evaluateString(input))
}
@Test
fun negativeDividend() {
val input = "(rem -23 25)"
assertSExpressionsMatch(LispNumber("-23"), evaluateString(input))
}
@Test
fun negativeDivisor() {
val input = "(rem 5 -11)"
assertSExpressionsMatch(LispNumber("5"), evaluateString(input))
}
@Test
fun divisorOfZero() {
assertThrows(DivideByZeroException::class.java) {
evaluateString("(rem 5 0)")
}
}
@Test
fun remWithNonNumber() {
assertThrows(BadArgumentTypeException::class.java) {
evaluateString("(rem 'a 'b)")
}
}
@Test
fun remWithTooFewArguments() {
assertThrows(TooFewArgumentsException::class.java) {
evaluateString("(rem 1)")
}
}
@Test
fun remWithTooManyArguments() {
assertThrows(TooManyArgumentsException::class.java) {
evaluateString("(rem 1 2 3)")
}
}
}