Skip to content

Commit

Permalink
Fix task1 and task2 - move functions that need to be implemented into…
Browse files Browse the repository at this point in the history
… a separated file
  • Loading branch information
nbirillo committed Aug 13, 2024
1 parent 3bba6e6 commit f6784ad
Show file tree
Hide file tree
Showing 8 changed files with 91 additions and 31 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package org.jetbrains.kotlin.course.culinary.game

import culinary.JsAction
import culinary.JsItemType
import org.jetbrains.kotlin.course.culinary.converters.toJsItemType
import org.jetbrains.kotlin.course.culinary.game.recipes.NUMBER_OF_TOMATOES
import org.jetbrains.kotlin.course.culinary.implementation.storage.FridgeImpl
import org.jetbrains.kotlin.course.culinary.models.food.FruitType
import org.jetbrains.kotlin.course.culinary.models.food.SpiceType
import org.jetbrains.kotlin.course.culinary.models.food.VegetableType
Expand All @@ -10,21 +14,37 @@ import org.springframework.web.bind.annotation.*
@RequestMapping("/api/functions/")
class CookingFunction(val service: CookingService) {
@CrossOrigin
@GetMapping("/test-task1")
fun task1(): List<JsAction> {
@GetMapping("/refill-fridge")
fun refillFridge(): List<JsItemType> {
FridgeImpl.refill()
return FridgeImpl.vegetables.map{ it.toJsItemType() }
}

@CrossOrigin
@GetMapping("/tomato-soup")
fun tomatoSoup(): List<JsAction> {
if (FridgeImpl.vegetables.count{ it.type == VegetableType.Tomato && it.isFresh } < NUMBER_OF_TOMATOES) {
// Show an error
return emptyList()
}

service.cookTomatoSoup()
clearKitchen()
return actions
}

@CrossOrigin
@GetMapping("/test-task2")
fun task2(): List<JsAction> {
@GetMapping("/soup-spices")
fun soupSpices(): List<JsAction> {
service.cookWithSpices()
clearKitchen()
return actions
}

@CrossOrigin
@GetMapping("/check-soup")
fun checkSoup(): Boolean = pot.doesTastePerfect()

@CrossOrigin
@GetMapping("/test-task3")
fun task3(): List<JsAction> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,22 @@
package org.jetbrains.kotlin.course.culinary.game

import org.jetbrains.kotlin.course.culinary.game.recipes.*
import org.jetbrains.kotlin.course.culinary.models.food.FruitType
import org.jetbrains.kotlin.course.culinary.models.food.SpiceType
import org.jetbrains.kotlin.course.culinary.models.food.VegetableType
import org.springframework.stereotype.Service

@Service
class CookingService {
// task#1
fun cookTomatoSoup() {
val vegetables = List(3) { fridge.getVegetable(what = VegetableType.Tomato) }
vegetables
.onEach { kitchen.put(it) }
.map { kitchen.cut(it) }
.forEach { pot.put(kitchen.take(it)) }
pot.simmer()
val tomatoes = getTomatoesForSoup()
prepareTomatoes(tomatoes)
cookSoup()
}

// task#2
fun cookWithSpices() {
val spices = generateSequence { SpiceType.entries.random() }
spices
.map { shelf.getSpice(it) }
.map { pot.put(it) }
.takeWhile { !pot.doesTastePerfect() }
.toList() // terminate
val spices = generateSpices()
addSpecies(spices)
pot.simmer()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.jetbrains.kotlin.course.culinary.game.recipes

import org.jetbrains.kotlin.course.culinary.game.fridge
import org.jetbrains.kotlin.course.culinary.game.kitchen
import org.jetbrains.kotlin.course.culinary.game.pot
import org.jetbrains.kotlin.course.culinary.game.shelf
import org.jetbrains.kotlin.course.culinary.models.food.SpiceType
import org.jetbrains.kotlin.course.culinary.models.food.Vegetable
import org.jetbrains.kotlin.course.culinary.models.food.VegetableType
import kotlin.random.Random

internal const val NUMBER_OF_TOMATOES = 3

// task#1
fun getTomatoesForSoup(): List<Vegetable> =
List(NUMBER_OF_TOMATOES) { fridge.getVegetable(what = VegetableType.Tomato) }

// task#1
fun prepareTomatoes(tomatoes: List<Vegetable>) {
tomatoes
.onEach { kitchen.put(it) }
.map { kitchen.cut(it) }
.forEach { pot.put(kitchen.take(it)) }
}

// task#1
fun cookSoup() {
pot.simmer()
}

// task#2
fun generateSpices(): Sequence<SpiceType> = generateSequence { SpiceType.entries.random() }

// task#2
fun addSpecies(spices: Sequence<SpiceType>) {
val howMuchToAdd = Random.nextInt(1, 10)
spices
.map { shelf.getSpice(it) }
.map { pot.put(it) }
.take(howMuchToAdd)
.toList() // terminate
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,11 @@ import org.jetbrains.kotlin.course.culinary.models.food.*

data object PotImpl : Pot {
val filling: MutableList<Ingredient> = mutableListOf()
var simmering = false
var simmering: Boolean = false

override fun <T: Ingredient> put(ingredient: T) {
if (filling.add(ingredient)) {
actions.add(buildJsAction(JsActionType.PUT_IN_POT, ingredient))
}
else {
error("You are trying to put the same $ingredient in the pot twice")
}
filling.add(ingredient)
actions.add(buildJsAction(JsActionType.PUT_IN_POT, ingredient))
}

override fun put(vegetable: CutVegetable) {
Expand All @@ -32,6 +28,7 @@ data object PotImpl : Pot {

private fun checkIfAllVegetablesFresh() = filling.filter{ it is Vegetable }.all{ (it as Vegetable).isFresh }

// task#2
override fun doesTastePerfect(): Boolean = checkIfManySpices() && checkIfAllVegetablesFresh()

override fun simmer() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.course.culinary.models.food.VegetableType

data object SaladBowlImpl : SaladBowl {
val filling: MutableList<Ingredient> = mutableListOf()
var mixing = false
var mixing: Boolean = false

override fun add(type: VegetableType, cuts: List<CutVegetable>) {
requireNotNull(cuts.all { it.type == type }) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,20 @@ data object FridgeImpl : Fridge {
private const val RANDOM_VEGETABLES_NUMBER = 7
private const val RANDOM_FRESH_VEGETABLES_NUMBER = 3

private val vegetables = generateRandomVegetables().toMutableList()
val vegetables: MutableList<Vegetable> = generateRandomVegetables().toMutableList()

private fun generateRandomVegetables() = buildList {
addAll(List(RANDOM_VEGETABLES_NUMBER) { Vegetable(VegetableType.entries.random(), Random.nextBoolean()) })
addAll(List(RANDOM_FRESH_VEGETABLES_NUMBER) { Vegetable(VegetableType.Tomato, true) })
}

// Task#0, student
fun refill() {
vegetables.clear()
vegetables.addAll(generateRandomVegetables())
}

// task#1, student
override fun getVegetable(what: VegetableType): Vegetable {
val vegetable = checkNotNull(vegetables.find { it.type == what && it.isFresh }) { "Fresh vegetable $what not found." }
vegetables.remove(vegetable)
Expand Down
2 changes: 2 additions & 0 deletions culinaryServer/culinaryServerTask1/task-info.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,5 @@ files:
visible: true
- name: src/main/kotlin/org/jetbrains/kotlin/course/culinary/game/GameActions.kt
visible: true
- name: src/main/kotlin/org/jetbrains/kotlin/course/culinary/game/recipes/TomatoSoup.kt
visible: true
13 changes: 9 additions & 4 deletions culinaryServer/culinaryServerTask1/test/Tests.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import org.jetbrains.kotlin.course.culinary.game.CookingService
import org.jetbrains.kotlin.course.culinary.game.clearKitchen
import org.jetbrains.kotlin.course.culinary.game.pot
import org.jetbrains.kotlin.course.culinary.implementation.cooking.BlenderImpl
import org.jetbrains.kotlin.course.culinary.implementation.cooking.PotImpl
import org.jetbrains.kotlin.course.culinary.implementation.cooking.SaladBowlImpl
Expand Down Expand Up @@ -28,10 +29,14 @@ class Test {

@Test
fun testTask2() {
clearKitchen()
CookingService().cookWithSpices()
assertTrue(PotImpl.doesTastePerfect(), "The soup in the pot does not taste perfect.")
assertTrue(PotImpl.simmering)
val tastes = List(100) {
clearKitchen()
CookingService().cookWithSpices()
assertTrue(PotImpl.simmering)
pot.doesTastePerfect()
}
assertTrue(tastes.toSet().size == 2, "The spices should be added randomly")

}

@Test
Expand Down

0 comments on commit f6784ad

Please sign in to comment.