Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.revolut.interview.service.impl
- import com.revolut.interview.Address
- import com.revolut.interview.Box
- import com.revolut.interview.Flower
- import com.revolut.interview.FlowerDelivery
- import org.junit.jupiter.api.Assertions.assertTrue
- import org.junit.jupiter.api.BeforeEach
- import org.junit.jupiter.api.Test
- import org.junit.jupiter.api.assertThrows
- class FlowerDeliveryServiceTest {
- internal lateinit var flowerDeliveryService: FlowerDelivery
- @BeforeEach
- fun init() {
- flowerDeliveryService = FlowerDelivery()
- }
- @Test
- fun `negative test throws IllegalStateException on empty addresses or flowers`() {
- val addresses = listOf(
- Address("first"),
- Address("second")
- )
- val flowers = listOf(
- Flower(1, "color"),
- Flower(2, "color"),
- Flower(3, "color")
- )
- assertThrows<IllegalStateException> { flowerDeliveryService.distribute(emptyList(), flowers) }
- assertThrows<IllegalStateException> { flowerDeliveryService.distribute(addresses, emptyList()) }
- }
- @Test
- fun `negative test throws IllegalArgumentException on addresses more than flowers`() {
- val addresses = listOf(
- Address("first"),
- Address("second")
- )
- val flowers = listOf(
- Flower(1, "color")
- )
- assertThrows<IllegalArgumentException> { flowerDeliveryService.distribute(addresses, flowers) }
- }
- @Test
- fun `negative test throws IllegalStateException on non unique flowers`() {
- val addresses = listOf(
- Address("first"),
- Address("second")
- )
- val flowers = listOf(
- Flower(1, "color"),
- Flower(1, "color")
- )
- assertThrows<IllegalStateException> { flowerDeliveryService.distribute(addresses, flowers) }
- }
- @Test
- fun `test each box get unique color flower`() {
- val boxes = flowerDeliveryService.distribute(
- addresses = listOf(
- Address("address_1"),
- Address("address_2"),
- Address("address_3")
- ),
- flowers = listOf(
- Flower(1, "color_1"),
- Flower(2, "color_2"),
- Flower(3, "color_3")
- )
- )
- checkBoxes(boxes)
- }
- @Test
- fun `test each box get single color flower`() {
- val boxes = flowerDeliveryService.distribute(
- addresses = listOf(
- Address("address_1"),
- Address("address_2"),
- Address("address_3")
- ),
- flowers = listOf(
- Flower(1, "color_1"),
- Flower(2, "color_1"),
- Flower(3, "color_1")
- )
- )
- checkBoxes(boxes)
- }
- @Test
- fun `compound test each box get unique color flower`() {
- val boxes = flowerDeliveryService.distribute(
- listOf(
- Address("address_1"),
- Address("address_2"),
- Address("address_3")
- ),
- listOf(
- Flower(1, "color_1"),
- Flower(2, "color_2"),
- Flower(3, "color_3"),
- Flower(4, "color_1"),
- Flower(5, "color_2"),
- Flower(6, "color_3")
- )
- )
- checkBoxes(boxes)
- }
- private fun checkBoxes(boxes: List<Box>) {
- println("Checking boxes:\n" + boxes.asString())
- val eachBoxHasFlowers = boxes.all { it.flowers.isNotEmpty() }
- assertTrue(eachBoxHasFlowers)
- for ((index, box) in boxes.withIndex()) {
- val flowerColors = box.flowers.map { it.color }
- val uniqueColorFlowers = flowerColors.distinct()
- val boxHasOnlyUniqueColorFlowers = (uniqueColorFlowers.size - flowerColors.size) == 0
- assertTrue(boxHasOnlyUniqueColorFlowers) { "Box #$index has non unique colors: ${flowerColors - uniqueColorFlowers}" }
- }
- }
- private fun List<Box>.asString(): String = joinToString(separator = "\n") { box -> box.asString() }
- private fun Box.asString(): String = "" + address + flowers.joinToString(prefix = "[", postfix = "]") { "(${it.id}, ${it.color})" }
- }
Add Comment
Please, Sign In to add comment