A configuration parameter that specifies the number of dismissals to wait for before returning normally
from an await
call on a Waiter
.
A configuration parameter that specifies the number of dismissals to wait for before returning normally
from an await
call on a Waiter
.
the number of dismissals for which to wait
IllegalArgumentException
if specified value
is less than or equal to zero.
Configuration object for asynchronous constructs, such as those provided by traits Eventually
and
Waiters
.
Configuration object for asynchronous constructs, such as those provided by traits Eventually
and
Waiters
.
The default values for the parameters are:
Configuration Parameter | Default Value |
---|---|
timeout
|
scaled(150 milliseconds)
|
interval
|
scaled(15 milliseconds)
|
the maximum amount of time to wait for an asynchronous operation to complete before giving up and throwing
TestFailedException
.
the amount of time to sleep between each check of the status of an asynchronous operation when polling
Class that facilitates performing assertions outside the main test thread, such as assertions in callback methods that are invoked asynchronously.
Class that facilitates performing assertions outside the main test thread, such as assertions in callback methods that are invoked asynchronously.
To use Waiter
, create an instance of it in the main test thread:
val w = new Waiter // Do this in the main test thread
At some point later, call await
on the waiter:
w.await() // Call await() from the main test thread
The await
call will block until it either receives a report of a failed assertion from a different thread, at which
point it will complete abruptly with the same exception, or until it is dismissed by a different thread (or threads), at
which point it will return normally. You can optionally specify a timeout and/or a number
of dismissals to wait for. Here's an example:
import org.scalatest.time.SpanSugar._ w.await(timeout(300 millis), dismissals(2))
The default value for timeout
, provided via an implicit PatienceConfig
parameter, is 150 milliseconds. The default value for
dismissals
is 1. The await
method will block until either it is dismissed a sufficient number of times by other threads or
an assertion fails in another thread. Thus if you just want to perform assertions in just one other thread, only that thread will be
performing a dismissal, so you can use the default value of 1 for dismissals
.
Waiter
contains four overloaded forms of await
, two of which take an implicit
PatienceConfig
parameter. To change the default timeout configuration, override or hide
(if you imported the members of Waiters
companion object instead of mixing in the
trait) patienceConfig
with a new one that returns your desired configuration.
To dismiss a waiter, you just invoke dismiss
on it:
w.dismiss() // Call this from one or more other threads
You may want to put dismiss
invocations in a finally clause to ensure they happen even if an exception is thrown.
Otherwise if a dismissal is missed because of a thrown exception, an await
call will wait until it times out.
Finally, to perform an assertion in a different thread, you just apply the Waiter
to the assertion code. Here are
some examples:
w { assert(1 + 1 === 3) } // Can use assertions w { 1 + 1 should equal (3) } // Or matchers w { "hi".charAt(-1) } // Any exceptions will be forwarded to await
Here's a complete example:
import org.scalatest._ import concurrent.Waiters import scala.actors.Actor class ExampleSuite extends FunSuite with Matchers with Waiters { case class Message(text: String) class Publisher extends Actor { @volatile private var handle: Message => Unit = { (msg) => } def registerHandler(f: Message => Unit) { handle = f } def act() { var done = false while (!done) { react { case msg: Message => handle(msg) case "Exit" => done = true } } } } test("example one") { val publisher = new Publisher val message = new Message("hi") val w = new Waiter publisher.start() publisher.registerHandler { msg => w { msg should equal (message) } w.dismiss() } publisher ! message w.await() publisher ! "Exit" } }
Returns a Dismissals
configuration parameter containing the passed value, which
specifies the number of dismissals to wait for before returning normally from an await
call on a Waiter
.
Returns a Dismissals
configuration parameter containing the passed value, which
specifies the number of dismissals to wait for before returning normally from an await
call on a Waiter
.
Returns an Interval
configuration parameter containing the passed value, which
specifies the amount of time to sleep after a retry.
Returns an Interval
configuration parameter containing the passed value, which
specifies the amount of time to sleep after a retry.
Implicit PatienceConfig
value providing default configuration values.
Implicit PatienceConfig
value providing default configuration values.
To change the default configuration, override or hide this def
with another implicit
PatienceConfig
containing your desired default configuration values.
Scales the passed Span
by the Double
factor returned
by spanScaleFactor
.
Scales the passed Span
by the Double
factor returned
by spanScaleFactor
.
The Span
is scaled by invoking its scaledBy
method,
thus this method has the same behavior:
The value returned by spanScaleFactor
can be any positive number or zero,
including a fractional number. A number greater than one will scale the Span
up to a larger value. A fractional number will scale it down to a smaller value. A
factor of 1.0 will cause the exact same Span
to be returned. A
factor of zero will cause Span.ZeroLength
to be returned.
If overflow occurs, Span.Max
will be returned. If underflow occurs,
Span.ZeroLength
will be returned.
IllegalArgumentException
if the value returned from spanScaleFactor
is less than zero
The factor by which the scaled
method will scale Span
s.
The factor by which the scaled
method will scale Span
s.
The default implementation of this method will return the span scale factor that
was specified for the run, or 1.0 if no factor was specified. For example, you can specify a span scale factor when invoking ScalaTest
via the command line by passing a -F
argument to Runner
.
Returns a Timeout
configuration parameter containing the passed value, which
specifies the maximum amount to wait for an asynchronous operation to complete.
Returns a Timeout
configuration parameter containing the passed value, which
specifies the maximum amount to wait for an asynchronous operation to complete.
Trait that facilitates performing assertions outside the main test thread, such as assertions in callback methods that are invoked asynchronously.
Trait
Waiters
provides aWaiter
class that you can use to orchestrate the inter-thread communication required to perform assertions outside the main test thread, and a means to configure it.To use
Waiter
, create an instance of it in the main test thread:At some point later, call
await
on the waiter:w.await() // Call await() from the main test thread
The
await
call will block until it either receives a report of a failed assertion from a different thread, at which point it will complete abruptly with the same exception, or until it is dismissed by a different thread (or threads), at which point it will return normally. You can optionally specify a timeout and/or a number of dismissals to wait for. Here's an example:The default value for
timeout
, provided via an implicitPatienceConfig
parameter, is 150 milliseconds. The default value fordismissals
is 1. Theawait
method will block until either it is dismissed a sufficient number of times by other threads or an assertion fails in another thread. Thus if you just want to perform assertions in just one other thread, only that thread will be performing a dismissal, so you can use the default value of 1 fordismissals
.Waiter
contains four overloaded forms ofawait
, two of which take an implicitPatienceConfig
parameter. To change the default timeout configuration, override or hide (if you imported the members ofWaiters
companion object instead of mixing in the trait)patienceConfig
with a new one that returns your desired configuration.To dismiss a waiter, you just invoke
dismiss
on it:w.dismiss() // Call this from one or more other threads
You may want to put
dismiss
invocations in a finally clause to ensure they happen even if an exception is thrown. Otherwise if a dismissal is missed because of a thrown exception, anawait
call will wait until it times out.Note that if a
Waiter
receives more than the expected number of dismissals, it will not report this as an error: i.e., receiving greater than the number of expected dismissals without any failed assertion will simply cause the the test to complete, not to fail. The only way aWaiter
will cause a test to fail is if one of the asynchronous assertions to which it is applied fails.Finally, to perform an assertion in a different thread, you just apply the
Waiter
to the assertion code. Here are some examples:Here's a complete example: