/
ModifiablePayload.scala
61 lines (58 loc) · 2.63 KB
/
ModifiablePayload.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/*
* Copyright 2001-2013 Artima, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.scalatest.exceptions
/**
* Trait implemented by <a href="PayloadField.html"><code>PayloadField</code></a> exception types that can modify their payload.
*
* <p>
* This trait facilitates the <code>withPayload</code> construct provided by trait
* <a href="../Payloads.html"><code>Payloads</code></a>. This construct enables a payload object (or modified
* payload object) to be included as the payload of a thrown exception. The payload
* can then be included in the ScalaTest event that results from that exception. For
* example, the payload included in a <a href="TestFailedException.html"><code>TestFailedException</code></a> will be included
* as the payload of the resulting <a href="../events/TestFailed.html"><code>TestFailed</code></a> event. Here's an example in
* which a GUI snapshot is included as a payload when a test fails:
* </p>
*
* <pre class="stHighlighted">
* withPayload(generateGUISnapshot()) {
* <span class="stLiteral">1</span> + <span class="stLiteral">1</span> should === (<span class="stLiteral">3</span>)
* }
* </pre>
*
* <p>
* Exception types that mix in this trait have a <code>modifyPayload</code> method, which
* returns an exception identical to itself, except with the payload option replaced with
* the result of invoking the passed function, supplying the current payload option
* as the lone <code>Option[Any]</code> parameter.
* </p>
*/
trait ModifiablePayload[T <: Throwable] { this: Throwable with PayloadField =>
/**
* Returns an instance of this exception's class, identical to this exception,
* except with the payload option replaced with
* the result of invoking the passed function, <code>fun</code>, supplying the current payload option
* as the lone <code>Option[Any]</code> parameter.
*
* <p>
* Implementations of this method may either mutate this exception or return
* a new instance with the revised detail message.
* </p>
*
* @param fun A function that returns the new payload option given the old one
*/
def modifyPayload(fun: Option[Any] => Option[Any]): T
}