Skip to content

Commit

Permalink
feat: simple expr casting
Browse files Browse the repository at this point in the history
  • Loading branch information
lbressler13 committed Feb 2, 2024
1 parent 46682fc commit 7d27759
Show file tree
Hide file tree
Showing 5 changed files with 165 additions and 115 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ package xyz.lbres.exactnumbers.expressions.expression

import xyz.lbres.exactnumbers.expressions.term.Term

/**
* Representation of an expression, consisting of at least one term
*/
abstract class Expression : Number() {
abstract operator fun unaryMinus(): Expression
abstract operator fun unaryPlus(): Expression
Expand All @@ -12,14 +15,6 @@ abstract class Expression : Number() {
// open operator fun times(other: Expression): Expression = MultiplicativeExpression(constMultiSetOf(this, other))
// open operator fun div(other: Expression): Expression = MultiplicativeExpression(constMultiSetOf(this, other.inverse()))

override fun toByte(): Byte = 0 // TODO
override fun toChar(): Char = '0' // TODO
override fun toShort(): Short = 0 // TODO
override fun toInt(): Int = 0 // TODO
override fun toLong(): Long = 0 // TODO
override fun toFloat(): Float = 0f // TODO
override fun toDouble(): Double = 0.0 // TODO

companion object {
val ZERO: Expression = SimpleExpression(Term.ZERO)
val ONE: Expression = SimpleExpression(Term.ONE)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,31 @@
package xyz.lbres.exactnumbers.expressions.expression

import xyz.lbres.exactnumbers.expressions.term.Term
import xyz.lbres.exactnumbers.utils.castToByte
import xyz.lbres.exactnumbers.utils.castToChar
import xyz.lbres.exactnumbers.utils.castToDouble
import xyz.lbres.exactnumbers.utils.castToFloat
import xyz.lbres.exactnumbers.utils.castToInt
import xyz.lbres.exactnumbers.utils.castToLong
import xyz.lbres.exactnumbers.utils.castToShort
import xyz.lbres.exactnumbers.utils.createHashCode

/**
* Expression consisting of a single term
*/
internal class SimpleExpression(private val term: Term) : Expression() {
override fun unaryMinus(): Expression = SimpleExpression(-term)

override fun unaryPlus(): Expression = this

override fun inverse(): Expression = SimpleExpression(term.inverse())

override fun equals(other: Any?): Boolean = other is SimpleExpression && term == other.term
override fun hashCode(): Int = createHashCode(listOf(term, "SimpleExpression"))

override fun toByte(): Byte = castToByte(term.getValue(), term, "SimpleExpression")
override fun toChar(): Char = castToChar(term.getValue(), term, "SimpleExpression")
override fun toShort(): Short = castToShort(term.getValue(), term, "SimpleExpression")
override fun toInt(): Int = castToInt(term.getValue(), term, "SimpleExpression")
override fun toLong(): Long = castToLong(term.getValue(), term, "SimpleExpression")
override fun toFloat(): Float = castToFloat(term.getValue(), term, "SimpleExpression")
override fun toDouble(): Double = castToDouble(term.getValue(), term, "SimpleExpression")
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package xyz.lbres.exactnumbers.expressions.expression

import xyz.lbres.exactnumbers.exactfraction.ExactFraction
import xyz.lbres.exactnumbers.expressions.expression.simple.* // ktlint-disable no-wildcard-imports no-unused-imports
import xyz.lbres.exactnumbers.expressions.term.Term
import xyz.lbres.exactnumbers.irrationals.log.Log
import xyz.lbres.exactnumbers.irrationals.sqrt.Sqrt
import xyz.lbres.exactnumbers.testutils.assertDivByZero
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotEquals
Expand Down Expand Up @@ -64,108 +64,15 @@ class SimpleExpressionTest {
assertNotEquals(SimpleExpression(term2), SimpleExpression(term1))
}

@Test
fun testUnaryMinus() {
var expr = SimpleExpression(Term.ZERO)
var expected = SimpleExpression(Term.ZERO)
assertEquals(expected, -expr)

expr = SimpleExpression(Term.fromValues(one, listOf(Log.ONE)))
expected = SimpleExpression(Term.fromValues(-one, listOf(Log.ONE)))
assertEquals(expected, -expr)

expr = SimpleExpression(Term.fromValues(one, listOf(pi)))
expected = SimpleExpression(Term.fromValues(-one, listOf(pi)))
assertEquals(expected, -expr)

expr = SimpleExpression(Term.fromValues(ExactFraction(44, 15), emptyList()))
expected = SimpleExpression(Term.fromValues(ExactFraction(-44, 15), emptyList()))
assertEquals(expected, -expr)

expr = SimpleExpression(
Term.fromValues(
ExactFraction(-15, 44),
listOf(log2, log3, log4, Sqrt(ExactFraction(64, 9)), pi, piInverse)
)
)
expected = SimpleExpression(
Term.fromValues(
ExactFraction(15, 44),
listOf(log2, log3, log4, Sqrt(ExactFraction(64, 9)), pi, piInverse)
)
)
assertEquals(expected, -expr)
}

@Test
fun testUnaryPlus() {
var expr = SimpleExpression(Term.ZERO)
assertEquals(expr, +expr)

expr = SimpleExpression(Term.fromValues(one, listOf(Log.ONE)))
assertEquals(expr, +expr)

expr = SimpleExpression(Term.fromValues(one, listOf(pi)))
assertEquals(expr, +expr)

expr = SimpleExpression(Term.fromValues(ExactFraction(44, 15), emptyList()))
assertEquals(expr, +expr)

expr = SimpleExpression(
Term.fromValues(
ExactFraction(-15, 44),
listOf(log2, log3, log4, Sqrt(ExactFraction(64, 9)), pi, piInverse)
)
)
assertEquals(expr, +expr)
}

@Test
fun testInverse() {
assertDivByZero { SimpleExpression(Term.ZERO).inverse() }

var expr1 = SimpleExpression(Term.ONE)
var expr2 = SimpleExpression(Term.ONE)
assertEquals(expr1, expr2.inverse())

expr1 = SimpleExpression(Term.fromValues(ExactFraction(17, 12), emptyList()))
expr2 = SimpleExpression(Term.fromValues(ExactFraction(12, 17), emptyList()))
assertEquals(expr1, expr2.inverse())
assertEquals(expr2, expr1.inverse())

expr1 = SimpleExpression(Term.fromValues(one, listOf(log3)))
expr2 = SimpleExpression(Term.fromValues(one, listOf(log3.inverse())))
assertEquals(expr1, expr2.inverse())
assertEquals(expr2, expr1.inverse())

expr1 = SimpleExpression(Term.fromValues(one, listOf(pi, piInverse, sqrt2)))
expr2 = SimpleExpression(Term.fromValues(one, listOf(pi, piInverse, sqrt2.inverse())))
assertEquals(expr1, expr2.inverse())
assertEquals(expr2, expr1.inverse())

expr1 = SimpleExpression(Term.fromValues(ExactFraction(-1, 9), listOf(testNumber2, testNumber2, pi, log4, pi, sqrt1)))
expr2 = SimpleExpression(
Term.fromValues(
-ExactFraction.NINE,
listOf(testNumber2.inverse(), testNumber2.inverse(), piInverse, piInverse, log4.inverse(), sqrt1.inverse())
)
)
assertEquals(expr1, expr2.inverse())
assertEquals(expr2, expr1.inverse())

expr1 = SimpleExpression(
Term.fromValues(
ExactFraction(100, 99999999999),
listOf(Log(4), pi, pi, Log(14, 3))
)
)
expr2 = SimpleExpression(
Term.fromValues(
ExactFraction(99999999999, 100),
listOf(Log(4).inverse(), piInverse, piInverse, Log(14, 3).inverse())
)
)
assertEquals(expr1, expr2.inverse())
assertEquals(expr2, expr1.inverse())
}
@Test fun testUnaryMinus() = runUnaryMinusTests()
@Test fun testUnaryPlus() = runUnaryPlusTests()
@Test fun testInverse() = runInverseTests()

@Test fun testToByte() = runToByteTests() // TODO
@Test fun testToChar() = runToCharTests() // TODO
@Test fun testToShort() = runToShortTests() // TODO
@Test fun testToInt() = runToIntTests() // TODO
@Test fun testToLong() = runToLongTests() // TODO
@Test fun testToFloat() = runToFloatTests() // TODO
@Test fun testToDouble() = runToDoubleTests() // TODO
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package xyz.lbres.exactnumbers.expressions.expression.simple

fun runToByteTests() {
}

fun runToCharTests() {
}

fun runToShortTests() {
}

fun runToIntTests() {
}

fun runToLongTests() {
}

fun runToFloatTests() {
}

fun runToDoubleTests() {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package xyz.lbres.exactnumbers.expressions.expression.simple

import xyz.lbres.exactnumbers.exactfraction.ExactFraction
import xyz.lbres.exactnumbers.expressions.expression.* // ktlint-disable no-wildcard-imports no-unused-imports
import xyz.lbres.exactnumbers.expressions.term.Term
import xyz.lbres.exactnumbers.irrationals.log.Log
import xyz.lbres.exactnumbers.irrationals.sqrt.Sqrt
import xyz.lbres.exactnumbers.testutils.assertDivByZero
import kotlin.test.assertEquals

fun runUnaryMinusTests() {
var expr = SimpleExpression(Term.ZERO)
var expected = SimpleExpression(Term.ZERO)
assertEquals(expected, -expr)

expr = SimpleExpression(Term.fromValues(one, listOf(Log.ONE)))
expected = SimpleExpression(Term.fromValues(-one, listOf(Log.ONE)))
assertEquals(expected, -expr)

expr = SimpleExpression(Term.fromValues(one, listOf(pi)))
expected = SimpleExpression(Term.fromValues(-one, listOf(pi)))
assertEquals(expected, -expr)

expr = SimpleExpression(Term.fromValues(ExactFraction(44, 15), emptyList()))
expected = SimpleExpression(Term.fromValues(ExactFraction(-44, 15), emptyList()))
assertEquals(expected, -expr)

expr = SimpleExpression(
Term.fromValues(
ExactFraction(-15, 44),
listOf(log2, log3, log4, Sqrt(ExactFraction(64, 9)), pi, piInverse)
)
)
expected = SimpleExpression(
Term.fromValues(
ExactFraction(15, 44),
listOf(log2, log3, log4, Sqrt(ExactFraction(64, 9)), pi, piInverse)
)
)
assertEquals(expected, -expr)
}

fun runUnaryPlusTests() {
var expr = SimpleExpression(Term.ZERO)
assertEquals(expr, +expr)

expr = SimpleExpression(Term.fromValues(one, listOf(Log.ONE)))
assertEquals(expr, +expr)

expr = SimpleExpression(Term.fromValues(one, listOf(pi)))
assertEquals(expr, +expr)

expr = SimpleExpression(Term.fromValues(ExactFraction(44, 15), emptyList()))
assertEquals(expr, +expr)

expr = SimpleExpression(
Term.fromValues(
ExactFraction(-15, 44),
listOf(log2, log3, log4, Sqrt(ExactFraction(64, 9)), pi, piInverse)
)
)
assertEquals(expr, +expr)
}

fun runInverseTests() {
assertDivByZero { SimpleExpression(Term.ZERO).inverse() }

var expr1 = SimpleExpression(Term.ONE)
var expr2 = SimpleExpression(Term.ONE)
assertEquals(expr1, expr2.inverse())

expr1 = SimpleExpression(Term.fromValues(ExactFraction(17, 12), emptyList()))
expr2 = SimpleExpression(Term.fromValues(ExactFraction(12, 17), emptyList()))
assertEquals(expr1, expr2.inverse())
assertEquals(expr2, expr1.inverse())

expr1 = SimpleExpression(Term.fromValues(one, listOf(log3)))
expr2 = SimpleExpression(Term.fromValues(one, listOf(log3.inverse())))
assertEquals(expr1, expr2.inverse())
assertEquals(expr2, expr1.inverse())

expr1 = SimpleExpression(Term.fromValues(one, listOf(pi, piInverse, sqrt2)))
expr2 = SimpleExpression(Term.fromValues(one, listOf(pi, piInverse, sqrt2.inverse())))
assertEquals(expr1, expr2.inverse())
assertEquals(expr2, expr1.inverse())

expr1 = SimpleExpression(Term.fromValues(ExactFraction(-1, 9), listOf(testNumber2, testNumber2, pi, log4, pi, sqrt1)))
expr2 = SimpleExpression(
Term.fromValues(
-ExactFraction.NINE,
listOf(testNumber2.inverse(), testNumber2.inverse(), piInverse, piInverse, log4.inverse(), sqrt1.inverse())
)
)
assertEquals(expr1, expr2.inverse())
assertEquals(expr2, expr1.inverse())

expr1 = SimpleExpression(
Term.fromValues(
ExactFraction(100, 99999999999),
listOf(Log(4), pi, pi, Log(14, 3))
)
)
expr2 = SimpleExpression(
Term.fromValues(
ExactFraction(99999999999, 100),
listOf(Log(4).inverse(), piInverse, piInverse, Log(14, 3).inverse())
)
)
assertEquals(expr1, expr2.inverse())
assertEquals(expr2, expr1.inverse())
}

0 comments on commit 7d27759

Please sign in to comment.