diff --git a/native/native.tests/testData/samples/regular_multimodule.kt b/native/native.tests/testData/samples/regular_multimodule.kt index d4e1c78da4b..2df8df81664 100644 --- a/native/native.tests/testData/samples/regular_multimodule.kt +++ b/native/native.tests/testData/samples/regular_multimodule.kt @@ -1,35 +1,92 @@ -// MODULE: a -// FILE: addition.kt +// MODULE: distance +// FILE: entities.kt +value class Length(val meters: Double) +value class SurfaceArea(val squareMeters: Double) +value class Volume(val cubicMeters: Double) + +// FILE: extensions.kt +val Number.Meters: Length get() = Length(toDouble()) +val Number.SquareMeters: SurfaceArea get() = SurfaceArea(toDouble()) +val Number.CubicMeters: Volume get() = Volume(toDouble()) + +// FILE: operators.kt +operator fun Number.times(length: Length): Length = Length(toDouble() * length.meters) +operator fun Number.times(surfaceArea: SurfaceArea): SurfaceArea = SurfaceArea(toDouble() * surfaceArea.squareMeters) +operator fun Number.times(volume: Volume): Volume = Volume(toDouble() * volume.cubicMeters) + +operator fun Length.times(factor: Number): Length = Length(meters * factor.toDouble()) +operator fun Length.times(length: Length): SurfaceArea = SurfaceArea(meters * length.meters) +operator fun Length.times(surfaceArea: SurfaceArea): Volume = Volume(meters * surfaceArea.squareMeters) + +operator fun SurfaceArea.times(factor: Number): SurfaceArea = SurfaceArea(squareMeters * factor.toDouble()) +operator fun SurfaceArea.times(length: Length): Volume = Volume(squareMeters * length.meters) + +operator fun Volume.times(factor: Number): Volume = Volume(cubicMeters * factor.toDouble()) + +// MODULE: density +// FILE: entities.kt +value class Density(val kilogramsPerCubicMeter: Double) { + companion object { + val AIR: Density = 1.2.KilogramsPerCubicMeter + val WATER: Density = 1000.KilogramsPerCubicMeter + } +} + +// FILE: extensions.kt +val Number.KilogramsPerCubicMeter: Density get() = Density(toDouble()) + +// MODULE: mass(distance,density) +// FILE: entities.kt +value class Mass(val kilograms: Double) + +// FILE: extensions.kt +val Number.Kilograms: Mass get() = Mass(toDouble()) + +// FILE: operators.kt +operator fun Volume.times(density: Density): Mass = Mass(cubicMeters * density.kilogramsPerCubicMeter) +operator fun Density.times(volume: Volume): Mass = Mass(kilogramsPerCubicMeter * volume.cubicMeters) + +// MODULE: constants +// FILE: main.kt +const val TRIVIAL_PI = 3.14 + +// MODULE: shapes(mass,constants) +// FILE: default.kt +class Ball(private val radius: Length) { + val surfaceArea1: SurfaceArea get() = TRIVIAL_PI * radius * radius + val surfaceArea2: SurfaceArea get() = radius * TRIVIAL_PI * radius + val surfaceArea3: SurfaceArea get() = radius * radius * TRIVIAL_PI + + val volume1: Volume get() = 0.75 * surfaceArea1 * radius + val volume2: Volume get() = 0.75 * (radius * surfaceArea1) + val volume3: Volume get() = surfaceArea1 * radius * 0.75 +} + +// MODULE: assertions(shapes) +// FILE: checks.kt import kotlin.test.* @Test -fun addition() { - assertEquals(42, 40 + 2) +fun surfaceArea() { + with(Ball(10.Meters)) { + assertEquals(314.SquareMeters, surfaceArea1) + assertEquals(314.SquareMeters, surfaceArea2) + assertEquals(314.SquareMeters, surfaceArea3) + } } -// MODULE: m(a) -// FILE: multiplication.kt -import kotlin.test.* - @Test -fun multiplication () { - assertEquals(42, 21 * 2) +fun volume() { + with(Ball(20.Meters)) { + assertEquals(18840.CubicMeters, volume1) + assertEquals(18840.CubicMeters, volume2) + assertEquals(18840.CubicMeters, volume3) + } } -// MODULE: s(m)() -// FILE: subtraction.kt -import kotlin.test.* - @Test -fun subtraction () { - assertEquals(42, 50 - 8) +fun mass() { + assertEquals(6.Kilograms, 5.CubicMeters * Density.AIR) + assertEquals(3500.Kilograms, 3.5.CubicMeters * Density.WATER) } -// MODULE: d(s)(s) -// FILE: division.kt -import kotlin.test.* - -@Test -fun division () { - assertEquals(42, 126 / 3) -} diff --git a/native/native.tests/testData/samples/regular_multimodule_implicit_first_module.kt b/native/native.tests/testData/samples/regular_multimodule_implicit_first_module.kt index bd5fe624114..2458e6a0dd7 100644 --- a/native/native.tests/testData/samples/regular_multimodule_implicit_first_module.kt +++ b/native/native.tests/testData/samples/regular_multimodule_implicit_first_module.kt @@ -1,51 +1,91 @@ -// FILE: addition.kt +// FILE: entities.kt +value class Length(val meters: Double) +value class SurfaceArea(val squareMeters: Double) +value class Volume(val cubicMeters: Double) + +// FILE: extensions.kt +val Number.Meters: Length get() = Length(toDouble()) +val Number.SquareMeters: SurfaceArea get() = SurfaceArea(toDouble()) +val Number.CubicMeters: Volume get() = Volume(toDouble()) + +// FILE: operators.kt +operator fun Number.times(length: Length): Length = Length(toDouble() * length.meters) +operator fun Number.times(surfaceArea: SurfaceArea): SurfaceArea = SurfaceArea(toDouble() * surfaceArea.squareMeters) +operator fun Number.times(volume: Volume): Volume = Volume(toDouble() * volume.cubicMeters) + +operator fun Length.times(factor: Number): Length = Length(meters * factor.toDouble()) +operator fun Length.times(length: Length): SurfaceArea = SurfaceArea(meters * length.meters) +operator fun Length.times(surfaceArea: SurfaceArea): Volume = Volume(meters * surfaceArea.squareMeters) + +operator fun SurfaceArea.times(factor: Number): SurfaceArea = SurfaceArea(squareMeters * factor.toDouble()) +operator fun SurfaceArea.times(length: Length): Volume = Volume(squareMeters * length.meters) + +operator fun Volume.times(factor: Number): Volume = Volume(cubicMeters * factor.toDouble()) + +// MODULE: density +// FILE: entities.kt +value class Density(val kilogramsPerCubicMeter: Double) { + companion object { + val AIR: Density = 1.2.KilogramsPerCubicMeter + val WATER: Density = 1000.KilogramsPerCubicMeter + } +} + +// FILE: extensions.kt +val Number.KilogramsPerCubicMeter: Density get() = Density(toDouble()) + +// MODULE: mass(default,density) +// FILE: entities.kt +value class Mass(val kilograms: Double) + +// FILE: extensions.kt +val Number.Kilograms: Mass get() = Mass(toDouble()) + +// FILE: operators.kt +operator fun Volume.times(density: Density): Mass = Mass(cubicMeters * density.kilogramsPerCubicMeter) +operator fun Density.times(volume: Volume): Mass = Mass(kilogramsPerCubicMeter * volume.cubicMeters) + +// MODULE: constants +// FILE: main.kt +const val TRIVIAL_PI = 3.14 + +// MODULE: shapes(mass,constants) +// FILE: default.kt +class Ball(private val radius: Length) { + val surfaceArea1: SurfaceArea get() = TRIVIAL_PI * radius * radius + val surfaceArea2: SurfaceArea get() = radius * TRIVIAL_PI * radius + val surfaceArea3: SurfaceArea get() = radius * radius * TRIVIAL_PI + + val volume1: Volume get() = 0.75 * surfaceArea1 * radius + val volume2: Volume get() = 0.75 * (radius * surfaceArea1) + val volume3: Volume get() = surfaceArea1 * radius * 0.75 +} + +// MODULE: assertions(shapes) +// FILE: checks.kt import kotlin.test.* @Test -fun addition() { - assertEquals(42, 40 + 2) +fun surfaceArea() { + with(Ball(10.Meters)) { + assertEquals(314.SquareMeters, surfaceArea1) + assertEquals(314.SquareMeters, surfaceArea2) + assertEquals(314.SquareMeters, surfaceArea3) + } } -// FILE: multiplication.kt -import kotlin.test.* - @Test -fun multiplication () { - assertEquals(42, 21 * 2) +fun volume() { + with(Ball(20.Meters)) { + assertEquals(18840.CubicMeters, volume1) + assertEquals(18840.CubicMeters, volume2) + assertEquals(18840.CubicMeters, volume3) + } } -// MODULE: b(default) -// FILE: subtraction.kt -import kotlin.test.* - @Test -fun subtraction () { - assertEquals(42, 50 - 8) +fun mass() { + assertEquals(6.Kilograms, 5.CubicMeters * Density.AIR) + assertEquals(3500.Kilograms, 3.5.CubicMeters * Density.WATER) } -// MODULE: c(b) -// FILE: division.kt -import kotlin.test.* - -@Test -fun division () { - assertEquals(42, 126 / 3) -} - -// MODULE: d(default) -// FILE: division2.kt -import kotlin.test.* - -@Test -fun division2 () { - assertEquals(42, 126 / 3) -} - -// MODULE: e(d) -// FILE: division3.kt -import kotlin.test.* - -@Test -fun division3 () { - assertEquals(42, 126 / 3) -} diff --git a/native/native.tests/testData/samples/regular_multimodule_implicit_first_module_with_header_comment.kt b/native/native.tests/testData/samples/regular_multimodule_implicit_first_module_with_header_comment.kt index b952bc2f53c..f8efdc3afa3 100644 --- a/native/native.tests/testData/samples/regular_multimodule_implicit_first_module_with_header_comment.kt +++ b/native/native.tests/testData/samples/regular_multimodule_implicit_first_module_with_header_comment.kt @@ -1,37 +1,95 @@ /** - * This is a header comment that should be prepended to the addition.kt file. + * This is a header comment that should be prepended to the default/entities.kt file. */ -// FILE: addition.kt +// FILE: entities.kt +value class Length(val meters: Double) +value class SurfaceArea(val squareMeters: Double) +value class Volume(val cubicMeters: Double) + +// FILE: extensions.kt +val Number.Meters: Length get() = Length(toDouble()) +val Number.SquareMeters: SurfaceArea get() = SurfaceArea(toDouble()) +val Number.CubicMeters: Volume get() = Volume(toDouble()) + +// FILE: operators.kt +operator fun Number.times(length: Length): Length = Length(toDouble() * length.meters) +operator fun Number.times(surfaceArea: SurfaceArea): SurfaceArea = SurfaceArea(toDouble() * surfaceArea.squareMeters) +operator fun Number.times(volume: Volume): Volume = Volume(toDouble() * volume.cubicMeters) + +operator fun Length.times(factor: Number): Length = Length(meters * factor.toDouble()) +operator fun Length.times(length: Length): SurfaceArea = SurfaceArea(meters * length.meters) +operator fun Length.times(surfaceArea: SurfaceArea): Volume = Volume(meters * surfaceArea.squareMeters) + +operator fun SurfaceArea.times(factor: Number): SurfaceArea = SurfaceArea(squareMeters * factor.toDouble()) +operator fun SurfaceArea.times(length: Length): Volume = Volume(squareMeters * length.meters) + +operator fun Volume.times(factor: Number): Volume = Volume(cubicMeters * factor.toDouble()) + +// MODULE: density +// FILE: entities.kt +value class Density(val kilogramsPerCubicMeter: Double) { + companion object { + val AIR: Density = 1.2.KilogramsPerCubicMeter + val WATER: Density = 1000.KilogramsPerCubicMeter + } +} + +// FILE: extensions.kt +val Number.KilogramsPerCubicMeter: Density get() = Density(toDouble()) + +// MODULE: mass(default,density) +// FILE: entities.kt +value class Mass(val kilograms: Double) + +// FILE: extensions.kt +val Number.Kilograms: Mass get() = Mass(toDouble()) + +// FILE: operators.kt +operator fun Volume.times(density: Density): Mass = Mass(cubicMeters * density.kilogramsPerCubicMeter) +operator fun Density.times(volume: Volume): Mass = Mass(kilogramsPerCubicMeter * volume.cubicMeters) + +// MODULE: constants +// FILE: main.kt +const val TRIVIAL_PI = 3.14 + +// MODULE: shapes(mass,constants) +// FILE: default.kt +class Ball(private val radius: Length) { + val surfaceArea1: SurfaceArea get() = TRIVIAL_PI * radius * radius + val surfaceArea2: SurfaceArea get() = radius * TRIVIAL_PI * radius + val surfaceArea3: SurfaceArea get() = radius * radius * TRIVIAL_PI + + val volume1: Volume get() = 0.75 * surfaceArea1 * radius + val volume2: Volume get() = 0.75 * (radius * surfaceArea1) + val volume3: Volume get() = surfaceArea1 * radius * 0.75 +} + +// MODULE: assertions(shapes) +// FILE: checks.kt import kotlin.test.* @Test -fun addition() { - assertEquals(42, 40 + 2) +fun surfaceArea() { + with(Ball(10.Meters)) { + assertEquals(314.SquareMeters, surfaceArea1) + assertEquals(314.SquareMeters, surfaceArea2) + assertEquals(314.SquareMeters, surfaceArea3) + } } -// FILE: multiplication.kt -import kotlin.test.* - @Test -fun multiplication () { - assertEquals(42, 21 * 2) +fun volume() { + with(Ball(20.Meters)) { + assertEquals(18840.CubicMeters, volume1) + assertEquals(18840.CubicMeters, volume2) + assertEquals(18840.CubicMeters, volume3) + } } -// MODULE: b(default) -// FILE: subtraction.kt -import kotlin.test.* - @Test -fun subtraction () { - assertEquals(42, 50 - 8) +fun mass() { + assertEquals(6.Kilograms, 5.CubicMeters * Density.AIR) + assertEquals(3500.Kilograms, 3.5.CubicMeters * Density.WATER) } -// MODULE: c(default)(default) -// FILE: division.kt -import kotlin.test.* - -@Test -fun division () { - assertEquals(42, 126 / 3) -} diff --git a/native/native.tests/testData/samples/regular_multimodule_implicit_first_module_with_header_statement.kt b/native/native.tests/testData/samples/regular_multimodule_implicit_first_module_with_header_statement.kt index d557da6a151..2cc0843f97c 100644 --- a/native/native.tests/testData/samples/regular_multimodule_implicit_first_module_with_header_statement.kt +++ b/native/native.tests/testData/samples/regular_multimodule_implicit_first_module_with_header_statement.kt @@ -1,40 +1,90 @@ +// This is a statement that should go to main.kt in the default module: +const val TRIVIAL_PI = 3.14 + +// FILE: entities.kt +value class Length(val meters: Double) +value class SurfaceArea(val squareMeters: Double) +value class Volume(val cubicMeters: Double) + +// FILE: extensions.kt +val Number.Meters: Length get() = Length(toDouble()) +val Number.SquareMeters: SurfaceArea get() = SurfaceArea(toDouble()) +val Number.CubicMeters: Volume get() = Volume(toDouble()) + +// FILE: operators.kt +operator fun Number.times(length: Length): Length = Length(toDouble() * length.meters) +operator fun Number.times(surfaceArea: SurfaceArea): SurfaceArea = SurfaceArea(toDouble() * surfaceArea.squareMeters) +operator fun Number.times(volume: Volume): Volume = Volume(toDouble() * volume.cubicMeters) + +operator fun Length.times(factor: Number): Length = Length(meters * factor.toDouble()) +operator fun Length.times(length: Length): SurfaceArea = SurfaceArea(meters * length.meters) +operator fun Length.times(surfaceArea: SurfaceArea): Volume = Volume(meters * surfaceArea.squareMeters) + +operator fun SurfaceArea.times(factor: Number): SurfaceArea = SurfaceArea(squareMeters * factor.toDouble()) +operator fun SurfaceArea.times(length: Length): Volume = Volume(squareMeters * length.meters) + +operator fun Volume.times(factor: Number): Volume = Volume(cubicMeters * factor.toDouble()) + +// MODULE: density +// FILE: entities.kt +value class Density(val kilogramsPerCubicMeter: Double) { + companion object { + val AIR: Density = 1.2.KilogramsPerCubicMeter + val WATER: Density = 1000.KilogramsPerCubicMeter + } +} + +// FILE: extensions.kt +val Number.KilogramsPerCubicMeter: Density get() = Density(toDouble()) + +// MODULE: mass(default,density) +// FILE: entities.kt +value class Mass(val kilograms: Double) + +// FILE: extensions.kt +val Number.Kilograms: Mass get() = Mass(toDouble()) + +// FILE: operators.kt +operator fun Volume.times(density: Density): Mass = Mass(cubicMeters * density.kilogramsPerCubicMeter) +operator fun Density.times(volume: Volume): Mass = Mass(kilogramsPerCubicMeter * volume.cubicMeters) + +// MODULE: shapes(mass) +// FILE: default.kt +class Ball(private val radius: Length) { + val surfaceArea1: SurfaceArea get() = TRIVIAL_PI * radius * radius + val surfaceArea2: SurfaceArea get() = radius * TRIVIAL_PI * radius + val surfaceArea3: SurfaceArea get() = radius * radius * TRIVIAL_PI + + val volume1: Volume get() = 0.75 * surfaceArea1 * radius + val volume2: Volume get() = 0.75 * (radius * surfaceArea1) + val volume3: Volume get() = surfaceArea1 * radius * 0.75 +} + +// MODULE: assertions(shapes) +// FILE: checks.kt import kotlin.test.* @Test -fun foo() { - println("This is a statement that should go to main.kt in the default module") +fun surfaceArea() { + with(Ball(10.Meters)) { + assertEquals(314.SquareMeters, surfaceArea1) + assertEquals(314.SquareMeters, surfaceArea2) + assertEquals(314.SquareMeters, surfaceArea3) + } } -// FILE: addition.kt -import kotlin.test.* - @Test -fun addition() { - assertEquals(42, 40 + 2) +fun volume() { + with(Ball(20.Meters)) { + assertEquals(18840.CubicMeters, volume1) + assertEquals(18840.CubicMeters, volume2) + assertEquals(18840.CubicMeters, volume3) + } } -// FILE: multiplication.kt -import kotlin.test.* - @Test -fun multiplication () { - assertEquals(42, 21 * 2) +fun mass() { + assertEquals(6.Kilograms, 5.CubicMeters * Density.AIR) + assertEquals(3500.Kilograms, 3.5.CubicMeters * Density.WATER) } -// MODULE: b(default) -// FILE: subtraction.kt -import kotlin.test.* - -@Test -fun subtraction () { - assertEquals(42, 50 - 8) -} - -// MODULE: c(default)(default) -// FILE: division.kt -import kotlin.test.* - -@Test -fun division () { - assertEquals(42, 126 / 3) -} diff --git a/native/native.tests/testData/samples/regular_multimodule_with_header_comment.kt b/native/native.tests/testData/samples/regular_multimodule_with_header_comment.kt index 3b71451e1de..0c55236ee5f 100644 --- a/native/native.tests/testData/samples/regular_multimodule_with_header_comment.kt +++ b/native/native.tests/testData/samples/regular_multimodule_with_header_comment.kt @@ -1,39 +1,96 @@ /** - * This is a header comment that should be prepended to the addition.kt file. + * This is a header comment that should be prepended to the distance/entities.kt file. */ -// MODULE: a -// FILE: addition.kt +// MODULE: distance +// FILE: entities.kt +value class Length(val meters: Double) +value class SurfaceArea(val squareMeters: Double) +value class Volume(val cubicMeters: Double) + +// FILE: extensions.kt +val Number.Meters: Length get() = Length(toDouble()) +val Number.SquareMeters: SurfaceArea get() = SurfaceArea(toDouble()) +val Number.CubicMeters: Volume get() = Volume(toDouble()) + +// FILE: operators.kt +operator fun Number.times(length: Length): Length = Length(toDouble() * length.meters) +operator fun Number.times(surfaceArea: SurfaceArea): SurfaceArea = SurfaceArea(toDouble() * surfaceArea.squareMeters) +operator fun Number.times(volume: Volume): Volume = Volume(toDouble() * volume.cubicMeters) + +operator fun Length.times(factor: Number): Length = Length(meters * factor.toDouble()) +operator fun Length.times(length: Length): SurfaceArea = SurfaceArea(meters * length.meters) +operator fun Length.times(surfaceArea: SurfaceArea): Volume = Volume(meters * surfaceArea.squareMeters) + +operator fun SurfaceArea.times(factor: Number): SurfaceArea = SurfaceArea(squareMeters * factor.toDouble()) +operator fun SurfaceArea.times(length: Length): Volume = Volume(squareMeters * length.meters) + +operator fun Volume.times(factor: Number): Volume = Volume(cubicMeters * factor.toDouble()) + +// MODULE: density +// FILE: entities.kt +value class Density(val kilogramsPerCubicMeter: Double) { + companion object { + val AIR: Density = 1.2.KilogramsPerCubicMeter + val WATER: Density = 1000.KilogramsPerCubicMeter + } +} + +// FILE: extensions.kt +val Number.KilogramsPerCubicMeter: Density get() = Density(toDouble()) + +// MODULE: mass(distance,density) +// FILE: entities.kt +value class Mass(val kilograms: Double) + +// FILE: extensions.kt +val Number.Kilograms: Mass get() = Mass(toDouble()) + +// FILE: operators.kt +operator fun Volume.times(density: Density): Mass = Mass(cubicMeters * density.kilogramsPerCubicMeter) +operator fun Density.times(volume: Volume): Mass = Mass(kilogramsPerCubicMeter * volume.cubicMeters) + +// MODULE: constants +// FILE: main.kt +const val TRIVIAL_PI = 3.14 + +// MODULE: shapes(mass,constants) +// FILE: default.kt +class Ball(private val radius: Length) { + val surfaceArea1: SurfaceArea get() = TRIVIAL_PI * radius * radius + val surfaceArea2: SurfaceArea get() = radius * TRIVIAL_PI * radius + val surfaceArea3: SurfaceArea get() = radius * radius * TRIVIAL_PI + + val volume1: Volume get() = 0.75 * surfaceArea1 * radius + val volume2: Volume get() = 0.75 * (radius * surfaceArea1) + val volume3: Volume get() = surfaceArea1 * radius * 0.75 +} + +// MODULE: assertions(shapes) +// FILE: checks.kt import kotlin.test.* @Test -fun addition() { - assertEquals(42, 40 + 2) +fun surfaceArea() { + with(Ball(10.Meters)) { + assertEquals(314.SquareMeters, surfaceArea1) + assertEquals(314.SquareMeters, surfaceArea2) + assertEquals(314.SquareMeters, surfaceArea3) + } } -// MODULE: m(a) -// FILE: multiplication.kt -import kotlin.test.* - @Test -fun multiplication () { - assertEquals(42, 21 * 2) +fun volume() { + with(Ball(20.Meters)) { + assertEquals(18840.CubicMeters, volume1) + assertEquals(18840.CubicMeters, volume2) + assertEquals(18840.CubicMeters, volume3) + } } -// MODULE: s(m)() -// FILE: subtraction.kt -import kotlin.test.* - @Test -fun subtraction () { - assertEquals(42, 50 - 8) +fun mass() { + assertEquals(6.Kilograms, 5.CubicMeters * Density.AIR) + assertEquals(3500.Kilograms, 3.5.CubicMeters * Density.WATER) } -// MODULE: d(s)(s) -// FILE: division.kt -import kotlin.test.* - -@Test -fun division () { - assertEquals(42, 126 / 3) -} diff --git a/native/native.tests/testData/samples/regular_multimodule_with_header_statement.kt b/native/native.tests/testData/samples/regular_multimodule_with_header_statement.kt index 988cf111945..856dda2542c 100644 --- a/native/native.tests/testData/samples/regular_multimodule_with_header_statement.kt +++ b/native/native.tests/testData/samples/regular_multimodule_with_header_statement.kt @@ -1,42 +1,91 @@ +// This is a statement that should go to main.kt in the default module: +const val TRIVIAL_PI = 3.14 + +// MODULE: distance +// FILE: entities.kt +value class Length(val meters: Double) +value class SurfaceArea(val squareMeters: Double) +value class Volume(val cubicMeters: Double) + +// FILE: extensions.kt +val Number.Meters: Length get() = Length(toDouble()) +val Number.SquareMeters: SurfaceArea get() = SurfaceArea(toDouble()) +val Number.CubicMeters: Volume get() = Volume(toDouble()) + +// FILE: operators.kt +operator fun Number.times(length: Length): Length = Length(toDouble() * length.meters) +operator fun Number.times(surfaceArea: SurfaceArea): SurfaceArea = SurfaceArea(toDouble() * surfaceArea.squareMeters) +operator fun Number.times(volume: Volume): Volume = Volume(toDouble() * volume.cubicMeters) + +operator fun Length.times(factor: Number): Length = Length(meters * factor.toDouble()) +operator fun Length.times(length: Length): SurfaceArea = SurfaceArea(meters * length.meters) +operator fun Length.times(surfaceArea: SurfaceArea): Volume = Volume(meters * surfaceArea.squareMeters) + +operator fun SurfaceArea.times(factor: Number): SurfaceArea = SurfaceArea(squareMeters * factor.toDouble()) +operator fun SurfaceArea.times(length: Length): Volume = Volume(squareMeters * length.meters) + +operator fun Volume.times(factor: Number): Volume = Volume(cubicMeters * factor.toDouble()) + +// MODULE: density +// FILE: entities.kt +value class Density(val kilogramsPerCubicMeter: Double) { + companion object { + val AIR: Density = 1.2.KilogramsPerCubicMeter + val WATER: Density = 1000.KilogramsPerCubicMeter + } +} + +// FILE: extensions.kt +val Number.KilogramsPerCubicMeter: Density get() = Density(toDouble()) + +// MODULE: mass(distance,density) +// FILE: entities.kt +value class Mass(val kilograms: Double) + +// FILE: extensions.kt +val Number.Kilograms: Mass get() = Mass(toDouble()) + +// FILE: operators.kt +operator fun Volume.times(density: Density): Mass = Mass(cubicMeters * density.kilogramsPerCubicMeter) +operator fun Density.times(volume: Volume): Mass = Mass(kilogramsPerCubicMeter * volume.cubicMeters) + +// MODULE: shapes(mass,default) +// FILE: default.kt +class Ball(private val radius: Length) { + val surfaceArea1: SurfaceArea get() = TRIVIAL_PI * radius * radius + val surfaceArea2: SurfaceArea get() = radius * TRIVIAL_PI * radius + val surfaceArea3: SurfaceArea get() = radius * radius * TRIVIAL_PI + + val volume1: Volume get() = 0.75 * surfaceArea1 * radius + val volume2: Volume get() = 0.75 * (radius * surfaceArea1) + val volume3: Volume get() = surfaceArea1 * radius * 0.75 +} + +// MODULE: assertions(shapes) +// FILE: checks.kt import kotlin.test.* @Test -fun foo() { - println("This is a statement that should go to main.kt in the default module") +fun surfaceArea() { + with(Ball(10.Meters)) { + assertEquals(314.SquareMeters, surfaceArea1) + assertEquals(314.SquareMeters, surfaceArea2) + assertEquals(314.SquareMeters, surfaceArea3) + } } -// MODULE: a -// FILE: addition.kt -import kotlin.test.* - @Test -fun addition() { - assertEquals(42, 40 + 2) +fun volume() { + with(Ball(20.Meters)) { + assertEquals(18840.CubicMeters, volume1) + assertEquals(18840.CubicMeters, volume2) + assertEquals(18840.CubicMeters, volume3) + } } -// MODULE: m(a) -// FILE: multiplication.kt -import kotlin.test.* - @Test -fun multiplication () { - assertEquals(42, 21 * 2) +fun mass() { + assertEquals(6.Kilograms, 5.CubicMeters * Density.AIR) + assertEquals(3500.Kilograms, 3.5.CubicMeters * Density.WATER) } -// MODULE: s(m)() -// FILE: subtraction.kt -import kotlin.test.* - -@Test -fun subtraction () { - assertEquals(42, 50 - 8) -} - -// MODULE: d(s)(s) -// FILE: division.kt -import kotlin.test.* - -@Test -fun division () { - assertEquals(42, 126 / 3) -}