diff --git a/example-configs/balls2d.gddl b/example-configs/balls2d.gddl index 3d8b3fd..b07358c 100644 --- a/example-configs/balls2d.gddl +++ b/example-configs/balls2d.gddl @@ -94,12 +94,19 @@ floatType = "Float", oneUnit = "Meters per second", displayUnit = "Meters per second", + square = "SquareSpeed", displacement = "Displacement", acceleration = "Acceleration", mass = "Mass", momentum = "Momentum", createNumberExtensions = true }], + squareSpeed = [{ + className = "SquareSpeed", + floatType = "Double", + speed = "Speed", + createNumberExtensions = true + }], spins = [{ className = "Spin", floatType = "Float", diff --git a/example-configs/int16/fixed-units.json b/example-configs/int16/fixed-units.json index 51ca833..4f1c490 100644 --- a/example-configs/int16/fixed-units.json +++ b/example-configs/int16/fixed-units.json @@ -21,10 +21,16 @@ "number": "Fixed", "oneUnit": "Meters per second", "displayUnit": "Kilometers per second", + "square": "SquareSpeed", "displacement": "Displacement", "momentum": "Momentum", "createNumberExtensions": true }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "Float", + "createNumberExtensions": true + }], "volumes": [{ "className": "Volume", "floatType": "Double", diff --git a/example-configs/int16/float-connections.json b/example-configs/int16/float-connections.json index 877d8a3..81a0fe3 100644 --- a/example-configs/int16/float-connections.json +++ b/example-configs/int16/float-connections.json @@ -26,6 +26,12 @@ "acceleration": "Acceleration", "createNumberExtensions": false }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "%FLOAT_TYPE%", + "speed": "Speed", + "createNumberExtensions": true + }], "accelerations": [{ "className": "Acceleration", "floatType": "%FLOAT_TYPE%", diff --git a/example-configs/int32/fixed-units.json b/example-configs/int32/fixed-units.json index 46608bc..a4f4df0 100644 --- a/example-configs/int32/fixed-units.json +++ b/example-configs/int32/fixed-units.json @@ -26,6 +26,12 @@ "momentum": "Momentum", "createNumberExtensions": false }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "Float", + "speed": "Speed", + "createNumberExtensions": false + }], "volumes": [{ "className": "Volume", "floatType": "Float", diff --git a/example-configs/int32/float-connections.json b/example-configs/int32/float-connections.json index e396156..d381503 100644 --- a/example-configs/int32/float-connections.json +++ b/example-configs/int32/float-connections.json @@ -22,12 +22,19 @@ "floatType": "%FLOAT_TYPE%", "oneUnit": "Meters per second", "displayUnit": "Miles per hour", + "square": "SquareSpeed", "displacement": "Displacement", "acceleration": "Acceleration", "mass": "Mass", "momentum": "Momentum", "createNumberExtensions": true }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "Double", + "speed": "Speed", + "createNumberExtensions": true + }], "accelerations": [{ "className": "Acceleration", "floatType": "%FLOAT_TYPE%", diff --git a/example-configs/int64/fixed-units.json b/example-configs/int64/fixed-units.json index 48cf1a9..141bb2e 100644 --- a/example-configs/int64/fixed-units.json +++ b/example-configs/int64/fixed-units.json @@ -21,11 +21,18 @@ "number": "Fixed", "oneUnit": "Meters per second", "displayUnit": "Kilometers per hour", + "square": "SquareSpeed", "displacement": "Displacement", "mass": "Mass", "momentum": "Momentum", "createNumberExtensions": true }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "Float", + "speed": "Speed", + "createNumberExtensions": false + }], "volumes": [{ "className": "Volume", "floatType": "Double", diff --git a/example-configs/int64/float-connections.json b/example-configs/int64/float-connections.json index ef0d30d..e6bc05f 100644 --- a/example-configs/int64/float-connections.json +++ b/example-configs/int64/float-connections.json @@ -22,12 +22,19 @@ "floatType": "%FLOAT_TYPE%", "oneUnit": "Kilometers per second", "displayUnit": "Meters per second", + "square": "SquareSpeed", "displacement": "Displacement", "acceleration": "Acceleration", "mass": "Mass", "momentum": "Momentum", "createNumberExtensions": true }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "%FLOAT_TYPE%", + "speed": "Speed", + "createNumberExtensions": false + }], "accelerations": [{ "className": "Acceleration", "floatType": "%FLOAT_TYPE%", diff --git a/example-configs/int8/fixed-units.json b/example-configs/int8/fixed-units.json index 351874b..26ae4c2 100644 --- a/example-configs/int8/fixed-units.json +++ b/example-configs/int8/fixed-units.json @@ -20,11 +20,18 @@ "number": "Fixed", "oneUnit": "Kilometers per hour", "displayUnit": "Meters per second", + "square": "SquareSpeed", "displacement": "Displacement", "mass": "Mass", "momentum": "Momentum", "createNumberExtensions": false }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "Float", + "speed": "Speed", + "createNumberExtensions": false + }], "volumes": [{ "className": "Volume", "floatType": "Double", diff --git a/example-configs/int8/float-connections.json b/example-configs/int8/float-connections.json index bc78e76..73c1644 100644 --- a/example-configs/int8/float-connections.json +++ b/example-configs/int8/float-connections.json @@ -22,12 +22,19 @@ "floatType": "%FLOAT_TYPE%", "oneUnit": "Miles per hour", "displayUnit": "Meters per second", + "square": "SquareSpeed", "displacement": "Displacement", "acceleration": "Acceleration", "mass": "Mass", "momentum": "Momentum", "createNumberExtensions": true }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "Float", + "speed": "Speed", + "createNumberExtensions": false + }], "accelerations": [{ "className": "Acceleration", "floatType": "%FLOAT_TYPE%", diff --git a/example-configs/uint16/fixed-units.json b/example-configs/uint16/fixed-units.json index fc317e7..967b06d 100644 --- a/example-configs/uint16/fixed-units.json +++ b/example-configs/uint16/fixed-units.json @@ -21,10 +21,17 @@ "number": "Fixed", "oneUnit": "Miles per hour", "displayUnit": "Kilometers per hour", + "square": "SquareSpeed", "displacement": "Displacement", "mass": "Mass", "createNumberExtensions": false }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "Float", + "speed": "Speed", + "createNumberExtensions": false + }], "volumes": [{ "className": "Volume", "floatType": "Float", diff --git a/example-configs/uint16/float-connections.json b/example-configs/uint16/float-connections.json index 5a19281..d1e0ef5 100644 --- a/example-configs/uint16/float-connections.json +++ b/example-configs/uint16/float-connections.json @@ -27,6 +27,11 @@ "mass": "Mass", "createNumberExtensions": true }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "%FLOAT_TYPE%", + "createNumberExtensions": false + }], "accelerations": [{ "className": "Acceleration", "floatType": "%FLOAT_TYPE%", diff --git a/example-configs/uint32/float-connections.json b/example-configs/uint32/float-connections.json index 35144b3..19b414a 100644 --- a/example-configs/uint32/float-connections.json +++ b/example-configs/uint32/float-connections.json @@ -20,10 +20,16 @@ "floatType": "%FLOAT_TYPE%", "oneUnit": "Kilometers per hour", "displayUnit": "Miles per hour", + "square": "SquareSpeed", "displacement": "Displacement", "acceleration": "Acceleration", "createNumberExtensions": false }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "%FLOAT_TYPE%", + "createNumberExtensions": true + }], "accelerations": [{ "className": "Acceleration", "floatType": "%FLOAT_TYPE%", diff --git a/example-configs/uint64/fixed-units.json b/example-configs/uint64/fixed-units.json index b24db85..52e07c0 100644 --- a/example-configs/uint64/fixed-units.json +++ b/example-configs/uint64/fixed-units.json @@ -21,11 +21,18 @@ "number": "Fixed", "oneUnit": "Meters per second", "displayUnit": "Miles per hour", + "square": "SquareSpeed", "displacement": "Displacement", "mass": "Mass", "momentum": "Momentum", "createNumberExtensions": true }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "Double", + "speed": "Speed", + "createNumberExtensions": true + }], "volumes": [{ "className": "Volume", "floatType": "Float", diff --git a/example-configs/uint64/float-connections.json b/example-configs/uint64/float-connections.json index b218213..abb1429 100644 --- a/example-configs/uint64/float-connections.json +++ b/example-configs/uint64/float-connections.json @@ -22,12 +22,19 @@ "floatType": "%FLOAT_TYPE%", "oneUnit": "Kilometers per second", "displayUnit": "Kilometers per second", + "square": "SquareSpeed", "displacement": "Displacement", "acceleration": "Acceleration", "mass": "Mass", "momentum": "Momentum", "createNumberExtensions": false }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "%FLOAT_TYPE%", + "speed": "Speed", + "createNumberExtensions": true + }], "accelerations": [{ "className": "Acceleration", "floatType": "%FLOAT_TYPE%", diff --git a/example-configs/uint8/fixed-units.json b/example-configs/uint8/fixed-units.json index 48be4db..22b8014 100644 --- a/example-configs/uint8/fixed-units.json +++ b/example-configs/uint8/fixed-units.json @@ -20,11 +20,18 @@ "number": "Fixed", "oneUnit": "Miles per hour", "displayUnit": "Meters per second", + "square": "SquareSpeed", "displacement": "Displacement", "mass": "Mass", "momentum": "Momentum", "createNumberExtensions": false }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "Double", + "speed": "Speed", + "createNumberExtensions": false + }], "volumes": [{ "className": "Volume", "floatType": "Double", diff --git a/example-configs/uint8/float-connections.json b/example-configs/uint8/float-connections.json index 24e624e..c17260b 100644 --- a/example-configs/uint8/float-connections.json +++ b/example-configs/uint8/float-connections.json @@ -22,12 +22,19 @@ "floatType": "%FLOAT_TYPE%", "oneUnit": "Kilometers per second", "displayUnit": "Miles per hour", + "square": "SquareSpeed", "displacement": "Displacement", "acceleration": "Acceleration", "mass": "Mass", "momentum": "Momentum", "createNumberExtensions": false }], + "squareSpeed": [{ + "className": "SquareSpeed", + "floatType": "%FLOAT_TYPE%", + "speed": "Speed", + "createNumberExtensions": true + }], "accelerations": [{ "className": "Acceleration", "floatType": "%FLOAT_TYPE%", diff --git a/src/main/kotlin/fixie/generator/module/FixieModule.kt b/src/main/kotlin/fixie/generator/module/FixieModule.kt index 4a910bd..28e2a60 100644 --- a/src/main/kotlin/fixie/generator/module/FixieModule.kt +++ b/src/main/kotlin/fixie/generator/module/FixieModule.kt @@ -12,6 +12,7 @@ import fixie.generator.number.NumberClass import fixie.generator.parser.InvalidConfigException import fixie.generator.quantity.QuantityClass import fixie.generator.speed.SpeedClass +import fixie.generator.speed.SquareSpeedClass import fixie.generator.spin.SpinClass import fixie.generator.volume.VolumeClass @@ -28,6 +29,7 @@ class FixieModule( val squareMomenta: List = emptyList(), val displacements: List = emptyList(), val speed: List = emptyList(), + val squareSpeed: List = emptyList(), val spins: List = emptyList(), val densities: List = emptyList() ) { @@ -99,6 +101,7 @@ class FixieModule( resolve(displacements, volumes, { it.volumeClassName }) { displacement, volume -> displacement.volume = volume } resolve(displacements, areas, { it.areaClassName }) { displacement, area -> displacement.area = area } resolve(displacements, speed, { it.speedClassName }) { displacement, speed -> displacement.speed = speed } + resolve(squareSpeed, speed, { it.speedClassName }) { square, speed -> square.speed = speed } checkPresent(speed, numbers) { it.number } resolve(speed, momenta, { it.momentumClassName }) { speed, momentum -> speed.momentum = momentum} resolve(speed, masses, { it.massClassName }) { speed, mass -> speed.mass = mass } @@ -108,12 +111,13 @@ class FixieModule( resolve(speed, accelerations, { it.accelerationClassName }) { speed, acceleration -> speed.acceleration = acceleration } + resolve(speed, squareSpeed, { it.squareClassName }) { speed, square -> speed.square = square } resolve(spins, angles, { it.angleClassName }) { spin, angle -> spin.angle = angle } val allClassNames = numbers.map { it.className } + displacements.map { it.className } + areas.map { it.className } + volumes.map { it.className } + - speed.map { it.className } + accelerations.map { it.className } + masses.map { it.className } + - momenta.map { it.className } + squareMomenta.map { it.className } + + speed.map { it.className } + squareSpeed.map { it.className } + accelerations.map { it.className } + + masses.map { it.className } + momenta.map { it.className } + squareMomenta.map { it.className } + angles.map { it.className } + spins.map { it.className } + densities.map { it.className } for (className in allClassNames) { diff --git a/src/main/kotlin/fixie/generator/module/ModuleGenerator.kt b/src/main/kotlin/fixie/generator/module/ModuleGenerator.kt index 193d9d7..116e06a 100644 --- a/src/main/kotlin/fixie/generator/module/ModuleGenerator.kt +++ b/src/main/kotlin/fixie/generator/module/ModuleGenerator.kt @@ -25,9 +25,9 @@ import fixie.generator.number.NumberTestsGenerator import fixie.generator.quantity.QuantityClass import fixie.generator.quantity.QuantityClassGenerator import fixie.generator.quantity.QuantityTestsGenerator +import fixie.generator.speed.* import fixie.generator.speed.SpeedClassGenerator import fixie.generator.speed.SpeedTestsGenerator -import fixie.generator.speed.SpeedUnit import fixie.generator.spin.SpinClassGenerator import fixie.generator.spin.SpinTestsGenerator import fixie.generator.volume.VolumeClassGenerator @@ -105,6 +105,7 @@ fun generateModule(module: FixieModule, directory: File, clearExistingFiles: Boo generateQuantityFiles(module.volumes, ::VolumeClassGenerator, ::VolumeTestsGenerator) generateQuantityFiles(module.masses, ::MassClassGenerator, ::MassTestsGenerator) generateQuantityFiles(module.speed, ::SpeedClassGenerator, ::SpeedTestsGenerator) + generateQuantityFiles(module.squareSpeed, ::SquareSpeedClassGenerator, ::SquareSpeedTestsGenerator) generateQuantityFiles(module.accelerations, ::AccelerationClassGenerator, ::AccelerationTestsGenerator) generateQuantityFiles(module.angles, ::AngleClassGenerator, ::AngleTestsGenerator) generateQuantityFiles(module.spins, ::SpinClassGenerator, ::SpinTestsGenerator) diff --git a/src/main/kotlin/fixie/generator/parser/ModuleParser.kt b/src/main/kotlin/fixie/generator/parser/ModuleParser.kt index fe4b8ce..327ee5f 100644 --- a/src/main/kotlin/fixie/generator/parser/ModuleParser.kt +++ b/src/main/kotlin/fixie/generator/parser/ModuleParser.kt @@ -23,6 +23,7 @@ import fixie.generator.number.IntType import fixie.generator.number.NumberClass import fixie.generator.speed.SpeedClass import fixie.generator.speed.SpeedUnit +import fixie.generator.speed.SquareSpeedClass import fixie.generator.spin.SpinClass import fixie.generator.spin.SpinUnit import fixie.generator.uLongToBigInteger @@ -268,6 +269,7 @@ private class ModuleParser( floatType = optionalFloatType(properties, "floatType", path), oneUnit = requiredUnit(properties, "oneUnit", path, SpeedUnit.entries), displayUnit = requiredUnit(properties, "displayUnit", path, SpeedUnit.entries), + squareClassName = optionalString(properties, "square", path), displacementClassName = optionalString(properties, "displacement", path), accelerationClassName = optionalString(properties, "acceleration", path), massClassName = optionalString(properties, "mass", path), @@ -275,6 +277,13 @@ private class ModuleParser( createNumberExtensions = requiredBoolean(properties, "createNumberExtensions", path) ) + private fun loadSquareSpeed(properties: GddlMap, path: String) = SquareSpeedClass( + className = requiredString(properties, "className", path), + floatType = requiredFloatType(properties, "floatType", path), + speedClassName = optionalString(properties, "speed", path), + createNumberExtensions = requiredBoolean(properties, "createNumberExtensions", path) + ) + private fun loadSpin(properties: GddlMap, path: String) = SpinClass( className = requiredString(properties, "className", path), floatType = requiredFloatType(properties, "floatType", path), @@ -357,6 +366,7 @@ private class ModuleParser( val areas = mapList(root, "areas", "(root)", ::loadArea) val displacements = mapList(root, "displacements", "(root)", ::loadDisplacement) val speed = mapList(root, "speed", "(root)", ::loadSpeed) + val squareSpeed = mapList(root, "squareSpeed", "(root)", ::loadSquareSpeed) val spins = mapList(root, "spins", "(root)", ::loadSpin) val densities = mapList(root, "densities", "(root)", ::loadDensity) val masses = mapList(root, "masses", "(root)", ::loadMass) @@ -374,6 +384,7 @@ private class ModuleParser( areas = areas, displacements = displacements, speed = speed, + squareSpeed = squareSpeed, spins = spins, densities = densities, masses = masses, diff --git a/src/main/kotlin/fixie/generator/speed/SpeedClass.kt b/src/main/kotlin/fixie/generator/speed/SpeedClass.kt index 509e72a..192ecd6 100644 --- a/src/main/kotlin/fixie/generator/speed/SpeedClass.kt +++ b/src/main/kotlin/fixie/generator/speed/SpeedClass.kt @@ -18,6 +18,7 @@ class SpeedClass( floatType: FloatType?, val oneUnit: SpeedUnit, val displayUnit: SpeedUnit, + val squareClassName: String?, val displacementClassName: String?, val accelerationClassName: String?, val massClassName: String?, @@ -25,6 +26,7 @@ class SpeedClass( createNumberExtensions: Boolean ) : HybridQuantityClass(className, number, floatType, createNumberExtensions) { + var square: SquareSpeedClass? = null var displacement: DisplacementClass? = null var acceleration: AccelerationClass? = null var mass: MassClass? = null diff --git a/src/main/kotlin/fixie/generator/speed/SpeedClassGenerator.kt b/src/main/kotlin/fixie/generator/speed/SpeedClassGenerator.kt index 64fa795..c95b26f 100644 --- a/src/main/kotlin/fixie/generator/speed/SpeedClassGenerator.kt +++ b/src/main/kotlin/fixie/generator/speed/SpeedClassGenerator.kt @@ -56,6 +56,12 @@ internal class SpeedClassGenerator( writer.println("\toperator fun times(right: ${quantity.massClassName}) = " + "${quantity.momentumClassName}.NEWTON_SECOND * toDouble(SpeedUnit.METERS_PER_SECOND) * right.toDouble(MassUnit.KILOGRAM)") } + + if (quantity.square != null) { + writer.println() + writer.println("\toperator fun times(right: ${quantity.className}) = ${quantity.squareClassName}.SQUARE_METERS_PER_SECOND " + + "* toDouble(SpeedUnit.METERS_PER_SECOND) * right.toDouble(SpeedUnit.METERS_PER_SECOND)") + } } override fun generateCompanionContent() { diff --git a/src/main/kotlin/fixie/generator/speed/SpeedTestsGenerator.kt b/src/main/kotlin/fixie/generator/speed/SpeedTestsGenerator.kt index 1bed5eb..536a0d9 100644 --- a/src/main/kotlin/fixie/generator/speed/SpeedTestsGenerator.kt +++ b/src/main/kotlin/fixie/generator/speed/SpeedTestsGenerator.kt @@ -92,5 +92,13 @@ internal class SpeedTestsGenerator( writer.println("\t\tassertEquals(3.5, (0.5 * ${quantity.className}.METERS_PER_SECOND * (7000 * ${quantity.massClassName}.GRAM)).toDouble(), 0.1)") } } + + if (quantity.square != null) { + val mpsPair = quantity.computeSupportedUnits().find { it.first == SpeedUnit.METERS_PER_SECOND } + if (mpsPair != null && (mpsPair.second > BigInteger.TEN || quantity.number == null)) { + writer.println("\t\tassertEquals(0.35, ((0.5 * ${quantity.className}.METERS_PER_SECOND) " + + "* (0.7 * ${quantity.className}.METERS_PER_SECOND)).toDouble(), 0.01)") + } + } } } diff --git a/src/main/kotlin/fixie/generator/speed/SquareSpeedClass.kt b/src/main/kotlin/fixie/generator/speed/SquareSpeedClass.kt new file mode 100644 index 0000000..4d4782d --- /dev/null +++ b/src/main/kotlin/fixie/generator/speed/SquareSpeedClass.kt @@ -0,0 +1,19 @@ +package fixie.generator.speed + +import fixie.generator.number.FloatType +import fixie.generator.quantity.FloatQuantityClass +import fixie.generator.quantity.QuantityUnit + +class SquareSpeedClass( + className: String, + floatType: FloatType, + val speedClassName: String?, + createNumberExtensions: Boolean +) : FloatQuantityClass(className, floatType, createNumberExtensions) { + + var speed: SpeedClass? = null + + override fun getSupportedUnits() = listOf(QuantityUnit( + "SQUARE_METERS_PER_SECOND", "", "(m/s)^2", "squareMps", 0.0001, 1e6, 1.0 + )) +} diff --git a/src/main/kotlin/fixie/generator/speed/SquareSpeedClassGenerator.kt b/src/main/kotlin/fixie/generator/speed/SquareSpeedClassGenerator.kt new file mode 100644 index 0000000..fa67bbc --- /dev/null +++ b/src/main/kotlin/fixie/generator/speed/SquareSpeedClassGenerator.kt @@ -0,0 +1,45 @@ +package fixie.generator.speed + +import fixie.generator.quantity.FloatQuantityClassGenerator +import java.io.PrintWriter + +class SquareSpeedClassGenerator( + writer: PrintWriter, + quantity: SquareSpeedClass, + packageName: String +) : FloatQuantityClassGenerator(writer, quantity, packageName) { + + private fun shouldGenerateSqrt() = quantity.speed != null && + quantity.speed!!.computeSupportedUnits().find { it.first == SpeedUnit.METERS_PER_SECOND } != null + + override fun getImports() = + super.getImports() + if (shouldGenerateSqrt()) arrayOf("kotlin.math.sqrt") else emptyArray() + + override fun generateToDoubleComment() { + writer.println("\t/** Gets the square speed value, in (m/s)^2 */") + } + + override fun generateToString() { + writer.println() + writer.println("\toverride fun toString() = String.format(\"%.2f%s\", value, \"(m/s)^2\")") + } + + override fun generateArithmetic() { + super.generateArithmetic() + + if (shouldGenerateSqrt()) { + writer.println() + writer.println("\toperator fun div(right: ${quantity.speedClassName}) = " + + "${quantity.speedClassName}.METERS_PER_SECOND * toDouble() / right.toDouble(SpeedUnit.METERS_PER_SECOND)") + } + } + + override fun generateMathFunctions() { + super.generateMathFunctions() + + if (shouldGenerateSqrt()) { + writer.println() + writer.println("fun sqrt(x: ${quantity.className}) = ${quantity.speedClassName}.METERS_PER_SECOND * sqrt(x.value)") + } + } +} diff --git a/src/main/kotlin/fixie/generator/speed/SquareSpeedTestsGenerator.kt b/src/main/kotlin/fixie/generator/speed/SquareSpeedTestsGenerator.kt new file mode 100644 index 0000000..976a4b8 --- /dev/null +++ b/src/main/kotlin/fixie/generator/speed/SquareSpeedTestsGenerator.kt @@ -0,0 +1,49 @@ +package fixie.generator.speed + +import fixie.generator.quantity.FloatQuantityTestsGenerator +import java.io.PrintWriter +import java.math.BigInteger +import kotlin.math.max + +class SquareSpeedTestsGenerator( + writer: PrintWriter, + quantity: SquareSpeedClass, + packageName: String +) : FloatQuantityTestsGenerator(writer, quantity, packageName) { + + override fun generateToStringBody() { + writer.println("\t\tassertEquals(\"2.34(m/s)^2\", (${quantity.className}.SQUARE_METERS_PER_SECOND * 2.34).toString())") + } + + private fun shouldTestSqrt(): Double? { + quantity.speed?.let { speed -> + if (speed.number == null) return 0.001 + val mpsPair = speed.computeSupportedUnits().find { it.first == SpeedUnit.METERS_PER_SECOND } + if (mpsPair != null && mpsPair.second > BigInteger.valueOf(20)) { + return max(0.001, 3.0 / mpsPair.second.toDouble()) + } + } + + return null + } + + override fun generateArithmeticBody() { + super.generateArithmeticBody() + + val margin = shouldTestSqrt() + if (margin != null) { + writer.println("\t\tassertEquals(0.25, (0.1 * ${quantity.className}.SQUARE_METERS_PER_SECOND / " + + "(0.4 * ${quantity.speedClassName}.METERS_PER_SECOND)).toDouble(SpeedUnit.METERS_PER_SECOND), $margin)") + } + } + + override fun generateMathFunctionsBody() { + super.generateMathFunctionsBody() + + val margin = shouldTestSqrt() + if (margin != null) { + writer.println("\t\tassertEquals(0.5, sqrt(0.25 * ${quantity.className}.SQUARE_METERS_PER_SECOND)" + + ".toDouble(SpeedUnit.METERS_PER_SECOND), $margin)") + } + } +}