Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.baeldung.railwayorientedprogramming

data class Customer(val name: String, val emailAddress: String)

object ROP {
fun createAndSave(args: Array<String>): Result<String> {
return validateName(args.toList()) then ::validateEmail then ::createCustomerDAO then ::save
}

fun validateName(inp: List<String>): Result<List<String>> {
if(inp.get(0).length < 10) {
return Failure("Name validation failed. Name must be greater than 10 characters.")
}else{
return Success(inp)
}
}

fun validateEmail(inp: List<String>): Result<List<String>> {
if(inp.get(1).contains("@")) {
return Success(inp)
}else{
return Failure("Email validation failed. Email must contain '@' symbol.")
}
}

fun createCustomerDAO(inp: List<String>): Result<Customer> = Success(Customer(inp.get(0), inp.get(1)))

fun save(customer: Customer): Result<String> { return Success("Customer successfully saved: " + customer) }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.baeldung.railwayorientedprogramming

sealed class Result<T>
data class Success<T>(val value: T): Result<T>()
data class Failure<T>(val errorMessage: String): Result<T>()
infix fun <T,U> Result<T>.then(f: (T) -> Result<U>) =
when (this) {
is Success -> f(this.value)
is Failure -> Failure(this.errorMessage)
}

infix fun <T> Result<T>.otherwise(f: (String) -> Unit) =
if (this is Failure) f(this.errorMessage) else Unit
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.baeldung.railwayorientedprogramming

import org.junit.jupiter.api.Assertions.assertInstanceOf
import org.junit.jupiter.api.Test

class ROPUnitTest {
@Test
fun `create and save customer successfully`() {;
val customer = Customer("Zeeshan Arif Saeed"
, "zeesh.arif@gmail.com")
val res = ROP.createAndSave(arrayOf("Zeeshan Arif Saeed"
, "zeesh.arif@gmail.com"))
assertInstanceOf(res::class.java,
Success("Customer successfully saved: " + customer))
}

@Test
fun `create and save customer name validatation failure`() {;
val customer = Customer("Zeeshan"
, "zeesh.arif@gmail.com")
val res = ROP.createAndSave(arrayOf("Zeeshan"
, "zeesh.arif@gmail.com"))
assertInstanceOf(res::class.java,
Failure<String>("Name validation failed. Name must be greater than 10 characters.")
)
}

@Test
fun `create and save customer email validatation failure`() {;
val customer = Customer("Zeeshan Arif Saeed"
, "zeesh.arif@gmail.com")
val res = ROP.createAndSave(arrayOf("Zeeshan"
, "zeesh.arif@gmail.com"))
assertInstanceOf(res::class.java,
Failure<String>("Email validation failed. Email must contain '@' symbol.")
)
}
}