Pihanya

FlowerDeliveryServiceTest.kt

Apr 21st, 2021 (edited)
421
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 4.33 KB | None | 0 0
  1. package com.revolut.interview.service.impl
  2.  
  3. import com.revolut.interview.Address
  4. import com.revolut.interview.Box
  5. import com.revolut.interview.Flower
  6. import com.revolut.interview.FlowerDelivery
  7. import org.junit.jupiter.api.Assertions.assertTrue
  8. import org.junit.jupiter.api.BeforeEach
  9. import org.junit.jupiter.api.Test
  10. import org.junit.jupiter.api.assertThrows
  11.  
  12. class FlowerDeliveryServiceTest {
  13.  
  14.     internal lateinit var flowerDeliveryService: FlowerDelivery
  15.  
  16.     @BeforeEach
  17.     fun init() {
  18.         flowerDeliveryService = FlowerDelivery()
  19.     }
  20.  
  21.     @Test
  22.     fun `negative test throws IllegalStateException on empty addresses or flowers`() {
  23.         val addresses = listOf(
  24.             Address("first"),
  25.             Address("second")
  26.         )
  27.         val flowers = listOf(
  28.             Flower(1, "color"),
  29.             Flower(2, "color"),
  30.             Flower(3, "color")
  31.         )
  32.         assertThrows<IllegalStateException> { flowerDeliveryService.distribute(emptyList(), flowers) }
  33.         assertThrows<IllegalStateException> { flowerDeliveryService.distribute(addresses, emptyList()) }
  34.     }
  35.  
  36.     @Test
  37.     fun `negative test throws IllegalArgumentException on addresses more than flowers`() {
  38.         val addresses = listOf(
  39.             Address("first"),
  40.             Address("second")
  41.         )
  42.         val flowers = listOf(
  43.             Flower(1, "color")
  44.         )
  45.         assertThrows<IllegalArgumentException> { flowerDeliveryService.distribute(addresses, flowers) }
  46.     }
  47.  
  48.     @Test
  49.     fun `negative test throws IllegalStateException on non unique flowers`() {
  50.         val addresses = listOf(
  51.             Address("first"),
  52.             Address("second")
  53.         )
  54.         val flowers = listOf(
  55.             Flower(1, "color"),
  56.             Flower(1, "color")
  57.         )
  58.         assertThrows<IllegalStateException> { flowerDeliveryService.distribute(addresses, flowers) }
  59.     }
  60.  
  61.     @Test
  62.     fun `test each box get unique color flower`() {
  63.         val boxes = flowerDeliveryService.distribute(
  64.             addresses = listOf(
  65.                 Address("address_1"),
  66.                 Address("address_2"),
  67.                 Address("address_3")
  68.             ),
  69.  
  70.             flowers = listOf(
  71.                 Flower(1, "color_1"),
  72.                 Flower(2, "color_2"),
  73.                 Flower(3, "color_3")
  74.             )
  75.         )
  76.         checkBoxes(boxes)
  77.     }
  78.  
  79.     @Test
  80.     fun `test each box get single color flower`() {
  81.         val boxes = flowerDeliveryService.distribute(
  82.             addresses = listOf(
  83.                 Address("address_1"),
  84.                 Address("address_2"),
  85.                 Address("address_3")
  86.             ),
  87.  
  88.             flowers = listOf(
  89.                 Flower(1, "color_1"),
  90.                 Flower(2, "color_1"),
  91.                 Flower(3, "color_1")
  92.             )
  93.         )
  94.         checkBoxes(boxes)
  95.     }
  96.  
  97.     @Test
  98.     fun `compound test each box get unique color flower`() {
  99.         val boxes = flowerDeliveryService.distribute(
  100.             listOf(
  101.                 Address("address_1"),
  102.                 Address("address_2"),
  103.                 Address("address_3")
  104.             ),
  105.             listOf(
  106.                 Flower(1, "color_1"),
  107.                 Flower(2, "color_2"),
  108.                 Flower(3, "color_3"),
  109.  
  110.                 Flower(4, "color_1"),
  111.                 Flower(5, "color_2"),
  112.                 Flower(6, "color_3")
  113.             )
  114.         )
  115.  
  116.         checkBoxes(boxes)
  117.     }
  118.  
  119.     private fun checkBoxes(boxes: List<Box>) {
  120.         println("Checking boxes:\n" + boxes.asString())
  121.  
  122.         val eachBoxHasFlowers = boxes.all { it.flowers.isNotEmpty() }
  123.         assertTrue(eachBoxHasFlowers)
  124.  
  125.         for ((index, box) in boxes.withIndex()) {
  126.             val flowerColors = box.flowers.map { it.color }
  127.             val uniqueColorFlowers = flowerColors.distinct()
  128.  
  129.             val boxHasOnlyUniqueColorFlowers = (uniqueColorFlowers.size - flowerColors.size) == 0
  130.             assertTrue(boxHasOnlyUniqueColorFlowers) { "Box #$index has non unique colors: ${flowerColors - uniqueColorFlowers}" }
  131.         }
  132.     }
  133.  
  134.     private fun List<Box>.asString(): String = joinToString(separator = "\n") { box -> box.asString() }
  135.  
  136.     private fun Box.asString(): String = "" + address + flowers.joinToString(prefix = "[", postfix = "]") { "(${it.id}, ${it.color})" }
  137. }
Add Comment
Please, Sign In to add comment