final class Expect[+R] extends LazyLogging
Expect allows you to invoke CLIs and ensure they return what you expect.
You can describe a cli interaction which will be executed when run
is invoked.
Each interaction is described inside an ExpectBlock
using When
s. Each When
states under which
circumstances the corresponding actions are to be executed. For example:
import work.martins.simon.core._ import scala.concurrent.ExecutionContext.Implicits.global val e = new Expect("bc -i", defaultValue = 5)( ExpectBlock( StringWhen("For details type `warranty'.")( Sendln("1 + 2") ) ), ExpectBlock( RegexWhen("""\n(\d+)\n""".r)( SendlnWithRegex { m => val previousAnswer = m.group(1) println(s"Got $$previousAnswer") s"$$previousAnswer + 3" } ) ), ExpectBlock( RegexWhen("""\n(\d+)\n""".r)( ReturningWithRegex(_.group(1).toInt) ) ) ) e.run() //Returns 6 inside a Future[Int]
We are executing the command bc -i
which is a cli calculator.
bc
, when it starts, writes to the terminal (more precisely to the standard out):
"For details type warranty'."
The expect we created reacts to it and sends to the terminal (more precisely to the standard in) the string "1 + 2".
However it only does so when the expect in ran, until then it does nothing, or in other words,
it only saves that it has to send "1 + 2" when the string "For details type
warranty'." appears on the StdOut.
If this interaction is successful it then proceeds to the next one defined by the next ExpectBlock
. This
interaction states that when bc
outputs text that matches the regex """\n(\d+)\n""" the expect should react by
sending the string "3 + 3" where the first 3 is obtained by inspecting the regex match and extracting the first group.
Finally the last interaction is very similar to the second one, with the only difference being the matched digit is
not used to send more text to bc
but rather to set the value the expect will return in the end of the execution.
If you find the syntax used to create the Expect
too verbose you should look at work.martins.simon.expect.fluent.Expect
or work.martins.simon.expect.dsl.Expect which provide a more terse syntax, especially dsl.Expect
which provides
a syntax very similar to Tcl Expect.
- R
the type this
Expect
returns.
- Source
- Expect.scala
- Grouped
- Alphabetic
- By Inheritance
- Expect
- LazyLogging
- AnyRef
- Any
- by any2stringadd
- by StringFormat
- by Ensuring
- by ArrowAssoc
- Hide All
- Show All
- Public
- All
Instance Constructors
- new Expect(command: String, defaultValue: R)(expectBlocks: ExpectBlock[R]*)
- new Expect(command: String, defaultValue: R, config: Config)(expectBlocks: ExpectBlock[R]*)
- new Expect(command: String, defaultValue: R, settings: Settings)(expectBlocks: ExpectBlock[R]*)
- new Expect(command: Seq[String], defaultValue: R, config: Config)(expects: ExpectBlock[R]*)
-
new
Expect(command: Seq[String], defaultValue: R, settings: Settings = new Settings())(expectBlocks: ExpectBlock[R]*)
- command
the command this
Expect
will execute.- defaultValue
the value that will be returned if no
Returning
action is executed.- settings
the settings that parameterize the execution of this
Expect
.- expectBlocks
the
ExpectBlock
s that describe the interactions thisExpect
will execute.
Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
- def +(other: String): String
- def ->[B](y: B): (Expect[R], B)
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
def
collect[T](pf: PartialFunction[R, T]): Expect[T]
Creates a new
Expect
by mapping the result of the currentExpect
, if the given partial function is defined at that value.Creates a new
Expect
by mapping the result of the currentExpect
, if the given partial function is defined at that value.If the current
Expect
contains a value for which the partial function is defined, the newExpect
will also hold that value. Otherwise, the resultingExpect
will fail with aNoSuchElementException
.- T
the type of the returned
Expect
- pf
the
PartialFunction
to apply to the result of thisExpect
- returns
an
Expect
holding the result of application of thePartialFunction
or aNoSuchElementException
- val command: Seq[String]
- val defaultValue: R
- def ensuring(cond: (Expect[R]) ⇒ Boolean, msg: ⇒ Any): Expect[R]
- def ensuring(cond: (Expect[R]) ⇒ Boolean): Expect[R]
- def ensuring(cond: Boolean, msg: ⇒ Any): Expect[R]
- def ensuring(cond: Boolean): Expect[R]
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(other: Any): Boolean
Returns whether
other
is anExpect
with the samecommand
, the samedefaultValue
, the samesettings
and the sameexpects
as thisExpect
.Returns whether
other
is anExpect
with the samecommand
, the samedefaultValue
, the samesettings
and the sameexpects
as thisExpect
.In the cases that
expects
contains an Action with a function, eg. Returning, this method will return false, because equality is not defined for functions.The method
structurallyEqual
can be used to test that two expects contain the same structure.- other
the other
Expect
to compare thisExpect
to.
- Definition Classes
- Expect → AnyRef → Any
- val expectBlocks: ExpectBlock[R]*
-
def
filter(p: (R) ⇒ Boolean): Expect[R]
Creates a new
Expect
by filtering its result with a predicate.Creates a new
Expect
by filtering its result with a predicate.If the current
Expect
result satisfies the predicate, the newExpect
will also hold that result. Otherwise, the resultingExpect
will fail with aNoSuchElementException
.- p
the predicate to apply to the result of this
Expect
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
def
flatMap[T](f: (R) ⇒ Expect[T]): Expect[T]
Creates a new
Expect
by applying a function to the returned result of thisExpect
, and returns the result of the function as the newExpect
.Creates a new
Expect
by applying a function to the returned result of thisExpect
, and returns the result of the function as the newExpect
.- T
the type of the returned
Expect
- f
the function which will be applied to the returned result of this
Expect
- returns
the
Expect
returned as the result of the application of the functionf
-
def
flatten[T](implicit ev: <:<[R, Expect[T]]): Expect[T]
Creates a new
Expect
with one level of nesting flattened, this method is equivalent toflatMap(identity)
.Creates a new
Expect
with one level of nesting flattened, this method is equivalent toflatMap(identity)
.- T
the type of the returned
Expect
- returns
an
Expect
with one level of nesting flattened
- def formatted(fmtstr: String): String
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
-
def
hashCode(): Int
- Definition Classes
- Expect → AnyRef → Any
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
lazy val
logger: Logger
- Attributes
- protected
- Definition Classes
- LazyLogging
-
def
map[T](f: (R) ⇒ T): Expect[T]
Creates a new
Expect
by applying a function to the returned result of thisExpect
.Creates a new
Expect
by applying a function to the returned result of thisExpect
.- T
the type of the returned
Expect
- f
the function which will be applied to the returned result of this
Expect
- returns
an
Expect
which will return the result of the application of the functionf
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- def run(process: RichProcess)(implicit ex: ExecutionContext): Future[R]
- def run(settings: Settings)(implicit ex: ExecutionContext): Future[R]
- def run(timeout: FiniteDuration = settings.timeout, charset: Charset = settings.charset)(implicit ex: ExecutionContext): Future[R]
- val settings: Settings
- def structurallyEquals[RR >: R](other: Expect[RR]): Boolean
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- Expect → AnyRef → Any
-
def
transform[T](flatMapPF: PartialFunction[R, Expect[T]], mapPF: PartialFunction[R, T]): Expect[T]
Transform this
Expect
result using the following strategy:Transform this
Expect
result using the following strategy:- if
flatMapPF
isDefinedAt
for this expect result then the result is flatMapped using flatMapPF. - otherwise, if
mapPF
isDefinedAt
for this expect result then the result is mapped using mapPF. - otherwise a NoSuchElementException is thrown where the result would be expected.
This function is very useful when we need to flatMap this
Expect
for some values of its result type and map thisExpect
for some other values of its result type.To ensure you don't get NoSuchElementException you should take special care in ensuring:
domain(flatMapPF) ∪ domain(mapPF) == domain(R)
Remember that in the domain of R the
defaultValue
is also included.- T
the type of the returned
Expect
- flatMapPF
the function that will be applied when a flatMap is needed
- mapPF
the function that will be applied when a map is needed
- returns
a new
Expect
whose result is either flatMapped or mapped according to whether flatMapPF or mapPF is defined for the given result
def countFilesInFolder(folder: String): Expect[Either[String, Int]] = { val e = new Expect(s"ls -1 $$folder", Left("unknownError"): Either[String, Int])( ExpectBlock( StringWhen("access denied")( Returning(Left("Access denied")) ), RegexWhen("(?s)(.*)".r)( ReturningWithRegex(_.group(1).split("\n").length) ) ) ) e } def ensureFolderIsEmpty(folder: String): Expect[Either[String, Unit]] = { countFilesInFolder(folder).transform({ case Right(numberOfFiles) => Expect(s"rm -r $$folder", Left("unknownError"): Either[String, Unit])( ExpectBlock( StringWhen("access denied")( Returning(Left("Access denied")) ), EndOfFileWhen( Returning(()) ) ) ) }, { case Left(l) => Left(l) case Right(numberOfFiles) if numberOfFiles == 0 => Right(()) }) }
Example: - if
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
def
withFilter(p: (R) ⇒ Boolean): Expect[R]
Used by for-comprehensions.
-
def
zip[T](that: Expect[T]): Expect[(R, T)]
Zips the results of
this
andthat
Expect
, and creates a newExpect
holding the tuple of their results.Zips the results of
this
andthat
Expect
, and creates a newExpect
holding the tuple of their results.- T
the type of the returned
Expect
- that
the other
Expect
- returns
an
Expect
with the results of bothExpect
s
-
def
zipWith[T, U](that: Expect[T])(f: (R, T) ⇒ U): Expect[U]
Zips the results of
this
andthat
Expect
using a functionf
, and creates a newExpect
holding the result.Zips the results of
this
andthat
Expect
using a functionf
, and creates a newExpect
holding the result.- T
the type of the other
Expect
- U
the type of the resulting
Expect
- that
the other
Expect
- f
the function to apply to the results of
this
andthat
- returns
an
Expect
with the result of the application off
to the results ofthis
andthat
- def →[B](y: B): (Expect[R], B)