From 2c4102a93d5c1f84f05929da17088672c13f2027 Mon Sep 17 00:00:00 2001 From: jsbr Date: Thu, 6 Oct 2016 21:03:19 -0400 Subject: [PATCH] Add custom error message to "expect" and "should" --- .../kotlin/com/winterbe/expekt/ExpectAny.kt | 12 +++++-- .../com/winterbe/expekt/ExpectBoolean.kt | 7 +++- .../com/winterbe/expekt/ExpectCollection.kt | 9 +++-- .../com/winterbe/expekt/ExpectComparable.kt | 7 +++- .../com/winterbe/expekt/ExpectDouble.kt | 7 +++- .../kotlin/com/winterbe/expekt/ExpectMap.kt | 9 +++-- .../com/winterbe/expekt/ExpectString.kt | 9 +++-- src/main/kotlin/com/winterbe/expekt/Expekt.kt | 34 +++++++++---------- src/test/kotlin/com/example/ExampleTest.kt | 20 +++++++++++ 9 files changed, 85 insertions(+), 29 deletions(-) diff --git a/src/main/kotlin/com/winterbe/expekt/ExpectAny.kt b/src/main/kotlin/com/winterbe/expekt/ExpectAny.kt index d8d2794..fa52e2b 100644 --- a/src/main/kotlin/com/winterbe/expekt/ExpectAny.kt +++ b/src/main/kotlin/com/winterbe/expekt/ExpectAny.kt @@ -5,7 +5,7 @@ package com.winterbe.expekt * * @author Benjamin Winterberg */ -open class ExpectAny(protected val subject: T?, protected val flavor: Flavor) { +open class ExpectAny(protected val subject: T?, protected val flavor: Flavor, protected var message: String? = null) { internal val words = arrayListOf() @@ -45,7 +45,7 @@ open class ExpectAny(protected val subject: T?, protected val flavor: Flavor) /** * Assert that the subject of this expectation is an instance of the given type. */ - open fun instanceof(type: Class): ExpectAny { + open fun instanceof(type: Class): ExpectAny { words.add("instanceof") words.add(type.toString()) verify { type.isInstance(subject) } @@ -63,6 +63,11 @@ open class ExpectAny(protected val subject: T?, protected val flavor: Flavor) return this } + open fun withMessage(message:String): ExpectAny { + this.message = message + return this + } + /** * Assert that the subject of this expectation is equal to the given value, * such as the following is true: `subject == expected` @@ -98,7 +103,8 @@ open class ExpectAny(protected val subject: T?, protected val flavor: Flavor) } private fun fail() { - val message = words.joinToString(separator = " ") + + val message = if(this.message!=null) this.message else words.joinToString(separator = " ") throw AssertionError(message) } diff --git a/src/main/kotlin/com/winterbe/expekt/ExpectBoolean.kt b/src/main/kotlin/com/winterbe/expekt/ExpectBoolean.kt index df3ec85..4569a7a 100644 --- a/src/main/kotlin/com/winterbe/expekt/ExpectBoolean.kt +++ b/src/main/kotlin/com/winterbe/expekt/ExpectBoolean.kt @@ -5,7 +5,7 @@ package com.winterbe.expekt * * @author Benjamin Winterberg */ -class ExpectBoolean(subject: Boolean?, flavor: Flavor) : ExpectAny(subject, flavor) { +class ExpectBoolean(subject: Boolean?, flavor: Flavor, message: String?=null) : ExpectAny(subject, flavor, message) { /** * Assert that the subject of this expectation is `true`. @@ -132,4 +132,9 @@ class ExpectBoolean(subject: Boolean?, flavor: Flavor) : ExpectAny(subj super.satisfy(predicate) return this } + + override fun withMessage(message:String): ExpectBoolean { + super.withMessage(message) + return this + } } \ No newline at end of file diff --git a/src/main/kotlin/com/winterbe/expekt/ExpectCollection.kt b/src/main/kotlin/com/winterbe/expekt/ExpectCollection.kt index 2fb1107..4a285ba 100644 --- a/src/main/kotlin/com/winterbe/expekt/ExpectCollection.kt +++ b/src/main/kotlin/com/winterbe/expekt/ExpectCollection.kt @@ -3,7 +3,7 @@ package com.winterbe.expekt /** * @author Benjamin Winterberg */ -class ExpectCollection(subject: Collection?, flavor: Flavor): ExpectAny>(subject, flavor) { +class ExpectCollection(subject: Collection?, flavor: Flavor, message: String?=null): ExpectAny>(subject, flavor, message) { private var anyMode = false @@ -81,7 +81,7 @@ class ExpectCollection(subject: Collection?, flavor: Flavor): ExpectAny get() { words.add("size") - val expectInt = ExpectComparable(subject!!.size, flavor) + val expectInt = ExpectComparable(subject!!.size, flavor, message) expectInt.negated = negated expectInt.words.addAll(words) expectInt.words.removeAt(0) @@ -200,4 +200,9 @@ class ExpectCollection(subject: Collection?, flavor: Flavor): ExpectAny { + super.withMessage(message) + return this + } } \ No newline at end of file diff --git a/src/main/kotlin/com/winterbe/expekt/ExpectComparable.kt b/src/main/kotlin/com/winterbe/expekt/ExpectComparable.kt index 8b8e019..377fd68 100644 --- a/src/main/kotlin/com/winterbe/expekt/ExpectComparable.kt +++ b/src/main/kotlin/com/winterbe/expekt/ExpectComparable.kt @@ -5,7 +5,7 @@ package com.winterbe.expekt * * @author Benjamin Winterberg */ -open class ExpectComparable>(subject: T?, flavor: Flavor) : ExpectAny(subject, flavor) { +open class ExpectComparable>(subject: T?, flavor: Flavor, message: String?=null) : ExpectAny(subject, flavor, message) { /** * Assert that the subject of this expectation is within the given `min` and `max` value @@ -168,4 +168,9 @@ open class ExpectComparable>(subject: T?, flavor: Flavor) : Exp super.satisfy(predicate) return this } + + override fun withMessage(message:String): ExpectComparable { + super.withMessage(message) + return this + } } \ No newline at end of file diff --git a/src/main/kotlin/com/winterbe/expekt/ExpectDouble.kt b/src/main/kotlin/com/winterbe/expekt/ExpectDouble.kt index c294819..714aef7 100644 --- a/src/main/kotlin/com/winterbe/expekt/ExpectDouble.kt +++ b/src/main/kotlin/com/winterbe/expekt/ExpectDouble.kt @@ -5,7 +5,7 @@ package com.winterbe.expekt * * @author Benjamin Winterberg */ -class ExpectDouble(subject: Double?, flavor: Flavor) : ExpectComparable(subject, flavor) { +class ExpectDouble(subject: Double?, flavor: Flavor, message: String?=null) : ExpectComparable(subject, flavor, message) { /** * Assert that the subject of this expectation is equal or close to the given value. @@ -152,4 +152,9 @@ class ExpectDouble(subject: Double?, flavor: Flavor) : ExpectComparable( super.satisfy(predicate) return this } + + override fun withMessage(message:String): ExpectDouble { + super.withMessage(message) + return this + } } \ No newline at end of file diff --git a/src/main/kotlin/com/winterbe/expekt/ExpectMap.kt b/src/main/kotlin/com/winterbe/expekt/ExpectMap.kt index 6d80003..9e82293 100644 --- a/src/main/kotlin/com/winterbe/expekt/ExpectMap.kt +++ b/src/main/kotlin/com/winterbe/expekt/ExpectMap.kt @@ -3,7 +3,7 @@ package com.winterbe.expekt /** * @author Benjamin Winterberg */ -class ExpectMap(subject: Map?, flavor: Flavor): ExpectAny>(subject, flavor) { +class ExpectMap(subject: Map?, flavor: Flavor, message: String?=null): ExpectAny>(subject, flavor, message) { private var anyMode = false @@ -114,7 +114,7 @@ class ExpectMap(subject: Map?, flavor: Flavor): ExpectAny> val size: ExpectComparable get() { words.add("size") - val expectInt = ExpectComparable(subject!!.size, flavor) + val expectInt = ExpectComparable(subject!!.size, flavor, message) expectInt.negated = negated expectInt.words.addAll(words) expectInt.words.removeAt(0) @@ -233,4 +233,9 @@ class ExpectMap(subject: Map?, flavor: Flavor): ExpectAny> super.satisfy(predicate) return this } + + override fun withMessage(message:String): ExpectMap { + super.withMessage(message) + return this + } } \ No newline at end of file diff --git a/src/main/kotlin/com/winterbe/expekt/ExpectString.kt b/src/main/kotlin/com/winterbe/expekt/ExpectString.kt index aedf62a..b75f086 100644 --- a/src/main/kotlin/com/winterbe/expekt/ExpectString.kt +++ b/src/main/kotlin/com/winterbe/expekt/ExpectString.kt @@ -3,11 +3,11 @@ package com.winterbe.expekt /** * @author Benjamin Winterberg */ -class ExpectString(subject: String?, flavor: Flavor) : ExpectComparable(subject, flavor) { +class ExpectString(subject: String?, flavor: Flavor, message: String?=null) : ExpectComparable(subject, flavor, message) { val length: ExpectComparable get() { words.add("length") - val expectInt = ExpectComparable(subject!!.length, this.flavor) + val expectInt = ExpectComparable(subject!!.length, this.flavor, message) expectInt.words.addAll(words) expectInt.words.removeAt(0) expectInt.words.removeAt(0) @@ -190,4 +190,9 @@ class ExpectString(subject: String?, flavor: Flavor) : ExpectComparable( super.satisfy(predicate) return this } + + override fun withMessage(message:String): ExpectString { + super.withMessage(message) + return this + } } \ No newline at end of file diff --git a/src/main/kotlin/com/winterbe/expekt/Expekt.kt b/src/main/kotlin/com/winterbe/expekt/Expekt.kt index c01d895..811b6f3 100644 --- a/src/main/kotlin/com/winterbe/expekt/Expekt.kt +++ b/src/main/kotlin/com/winterbe/expekt/Expekt.kt @@ -1,35 +1,35 @@ package com.winterbe.expekt -fun expect(subject: T?): ExpectAny { - return ExpectAny(subject, Flavor.EXPECT) +fun expect(subject: T?, message: String? = null): ExpectAny { + return ExpectAny(subject, Flavor.EXPECT, message) } -fun expect(subject: Boolean?): ExpectBoolean { - return ExpectBoolean(subject, Flavor.EXPECT) +fun expect(subject: Boolean?, message: String? = null): ExpectBoolean { + return ExpectBoolean(subject, Flavor.EXPECT, message) } -fun > expect(subject: T?): ExpectComparable { - return ExpectComparable(subject, Flavor.EXPECT) +fun > expect(subject: T?, message: String? = null): ExpectComparable { + return ExpectComparable(subject, Flavor.EXPECT, message) } -fun expect(subject: Double?): ExpectDouble { - return ExpectDouble(subject, Flavor.EXPECT) +fun expect(subject: Double?, message: String? = null): ExpectDouble { + return ExpectDouble(subject, Flavor.EXPECT, message) } -fun expect(subject: String?): ExpectString { - return ExpectString(subject, Flavor.EXPECT) +fun expect(subject: String?, message: String? = null): ExpectString { + return ExpectString(subject, Flavor.EXPECT, message) } -fun expect(subject: Collection?): ExpectCollection { - return ExpectCollection(subject, Flavor.EXPECT) +fun expect(subject: Collection?, message: String? = null): ExpectCollection { + return ExpectCollection(subject, Flavor.EXPECT, message) } -fun expect(subject: Sequence?): ExpectCollection { - return ExpectCollection(subject?.toList(), Flavor.EXPECT) +fun expect(subject: Sequence?, message: String? = null): ExpectCollection { + return ExpectCollection(subject?.toList(), Flavor.EXPECT, message) } -fun expect(subject: Map?): ExpectMap { - return ExpectMap(subject, Flavor.EXPECT) +fun expect(subject: Map?, message: String? = null): ExpectMap { + return ExpectMap(subject, Flavor.EXPECT, message) } val T?.should: ExpectAny get() { @@ -44,7 +44,7 @@ val String?.should: ExpectString get() { return ExpectString(this, Flavor.SHOULD) } -val > T?.should: ExpectComparable get() { +val > T?.should: ExpectComparable get() { return ExpectComparable(this, Flavor.SHOULD) } diff --git a/src/test/kotlin/com/example/ExampleTest.kt b/src/test/kotlin/com/example/ExampleTest.kt index 951ecb8..2fc56f0 100644 --- a/src/test/kotlin/com/example/ExampleTest.kt +++ b/src/test/kotlin/com/example/ExampleTest.kt @@ -27,4 +27,24 @@ class ExampleTest { } } + @Test + fun failingTest3Message() { + try { + expect(3.4,"fail").to.be.closeTo(3.2, delta = 0.1) + Assert.fail() + } catch(e: AssertionError) { + expect(e.message).to.be.equal("fail") + } + } + + @Test + fun failingTest4withMessage() { + try { + 3.4.should.be.withMessage("fail").closeTo(3.2, delta = 0.1) + Assert.fail() + } catch(e: AssertionError) { + expect(e.message).to.be.equal("fail") + } + } + } \ No newline at end of file