Skip to content

odd-poet/kotlin-expect

Repository files navigation

kotlin-expect

Build Statuscodecov

kotlin-expect is a assertion library for kotlin test. it's inspried by Rspec Expectation.

Setup

dependencies {
    testCompile("net.oddpoet:kotlin-expect:1.3.2")
}

Basic Usage

expect(s).to

You can write an assertion for a subject in the form expect(subject).to.

val list = listOf(1, 2, 3)
expect(list).to.haveSizeOf(3)
expect(list).to.satisfy { size == 3 }
expect(list).to.not.contain(5)
expect(list).to.containAll { it < 10 }
expect(list).to.not.beInstanceOf(Set::class)

should

Alternatively, you can write assertions in the form subject.should more simply.

"hello".should.startWith("h")
"hello".should.not.endWith("x", ignoreCase = true)
"believe".should.match("lie")
"hello".length.should.be(5)

expect(s) { ... }

You can also create multiple assertions for a subject in the form expect(s) {...}

expect(aList) {
    it.should.haveSizeOf(10)
    it.should.not.contain("hello")
    it.should.containAny { it.lenngth < 2 }
}

expect { }.throws()

An assertion for an exception can be written in the form expect { ... }.throws().

expect {
    throw IOExpection()
}.throws()

expect {
    throw NoSuchFileException("file.txt")
}.throws(IOExcpetion::class) {
    it.message.should.be("file.txt")
}

Write own your assertion

Kotlin-expect has built-in assertions for java base types(String, Collection, Map, Number and so on). You can define new assertions for your class. An assertion for a class is defined as an extension of the Expect class.

example

// for your classes
abstract class Person(
    val name: String,
    val birthdate: LocalDate
)

class Employee(
    name: String, birthdate: LocalDate,
    val empNo: String?,
    val dept: String?
) : Person(name, birthdate)
// you can write your own assertion
fun <T : Person> Expect<T>.beUnderage() =
    satisfyThat("be underage") {
        it.birthdate.plusYears(19) > LocalDate.now()
    }

fun Expect<Employee>.beValid() =
    satisfyThat("be valid") {
        it.empNo != null && it.dept != null
    }

fun Expect<Employee>.beAssignedTo(dept: String) =
    satisfyThat("be assigned to $dept") {
        it.dept == dept
    }
// then you can use your assertion.
val emp = Employee(
    "yunsang.choi",
    LocalDate.of(1976, 4, 2),
    "X00000",
    "DevTeam"
)
expect(emp) {
    it.should.beValid()
    it.should.not.beUnderage()
    it.should.not.beAssignedTo("DesignTeam")
}