Skip to content

Commit a7abdac

Browse files
committed
switch from Specs2 to Scalatest
1 parent 42f3238 commit a7abdac

File tree

4 files changed

+107
-124
lines changed

4 files changed

+107
-124
lines changed

build.sbt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ lazy val coreDeps = Seq(
5959
"com.thenewmotion.ocpp" %% "ocpp-j-api" % "9.2.3",
6060
"com.typesafe.scala-logging" %% "scala-logging" % "3.9.0",
6161

62-
"org.specs2" %% "specs2-core" % "4.3.4" % "test"
62+
"org.scalatest" %% "scalatest" % "3.2.2" % "test",
63+
"org.scalamock" %% "scalamock" % "5.1.0" % "test"
6364
)
6465

6566
def loaderDeps(scalaVersion: String) = Seq(
Lines changed: 67 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,90 @@
11
package chargepoint.docile.dsl
22

33
import com.thenewmotion.ocpp.messages.v1x._
4-
import org.specs2.mutable.Specification
5-
import org.specs2.specification.Scope
6-
import org.specs2.concurrent.ExecutionEnv
7-
8-
class ReceivedMsgManagerSpec(implicit ee: ExecutionEnv) extends Specification {
9-
10-
"ReceivedMsgManager" should {
11-
12-
"pass on messages to those that requested them" in {
13-
val sut = new ReceivedMsgManager[
14-
CentralSystemReq,
15-
CentralSystemRes,
16-
CentralSystemReqRes,
17-
ChargePointReq,
18-
ChargePointRes,
19-
ChargePointReqRes
20-
]
21-
val testMsg = GenericIncomingMessage[
22-
CentralSystemReq,
23-
CentralSystemRes,
24-
CentralSystemReqRes,
25-
ChargePointReq,
26-
ChargePointRes,
27-
ChargePointReqRes
28-
](StatusNotificationRes)
29-
30-
val f = sut.dequeue(1)
31-
32-
f.isCompleted must beFalse
33-
34-
sut.enqueue(testMsg)
35-
36-
f must beEqualTo(List(testMsg)).await
37-
}
4+
import org.scalatest.flatspec.AnyFlatSpec
5+
import scala.concurrent.ExecutionContext.Implicits.global
386

39-
"remember incoming messages until someone dequeues them" in {
40-
val sut = new ReceivedMsgManager[
41-
CentralSystemReq,
42-
CentralSystemRes,
43-
CentralSystemReqRes,
44-
ChargePointReq,
45-
ChargePointRes,
46-
ChargePointReqRes
47-
]
48-
val testMsg = GenericIncomingMessage[
49-
CentralSystemReq,
50-
CentralSystemRes,
51-
CentralSystemReqRes,
52-
ChargePointReq,
53-
ChargePointRes,
54-
ChargePointReqRes
55-
](StatusNotificationRes)
56-
57-
sut.enqueue(testMsg)
58-
59-
sut.dequeue(1) must beEqualTo(List(testMsg)).await
60-
}
7+
class ReceivedMsgManagerSpec extends AnyFlatSpec {
618

62-
"fulfill request for messages once enough are available" in new TestScope {
63-
sut.enqueue(testMsg(1))
64-
sut.enqueue(testMsg(2))
9+
"ReceivedMsgManager" should "pass on messages to those that requested them" in {
10+
val sut = receivedMsgManager()
11+
val testMsg = GenericIncomingMessage[
12+
CentralSystemReq,
13+
CentralSystemRes,
14+
CentralSystemReqRes,
15+
ChargePointReq,
16+
ChargePointRes,
17+
ChargePointReqRes
18+
](StatusNotificationRes)
6519

66-
val f = sut.dequeue(3)
20+
val f = sut.dequeue(1)
6721

68-
f.isCompleted must beFalse
22+
assert(!f.isCompleted)
6923

70-
sut.enqueue(testMsg(3))
24+
sut.enqueue(testMsg)
7125

72-
f must beEqualTo(List(testMsg(1), testMsg(2), testMsg(3))).await
26+
f.map { dequeuedMsg =>
27+
assert(dequeuedMsg === List(testMsg))
7328
}
29+
}
30+
31+
it should "remember incoming messages until someone dequeues them" in {
32+
val sut = receivedMsgManager()
33+
val testMsg = GenericIncomingMessage[
34+
CentralSystemReq,
35+
CentralSystemRes,
36+
CentralSystemReqRes,
37+
ChargePointReq,
38+
ChargePointRes,
39+
ChargePointReqRes
40+
](StatusNotificationRes)
7441

75-
"allow a peek at what's in the queue" in new TestScope {
76-
sut.enqueue(testMsg(1))
77-
sut.enqueue(testMsg(2))
42+
sut.enqueue(testMsg)
7843

79-
sut.currentQueueContents mustEqual List(testMsg(1), testMsg(2))
44+
sut.dequeue(1) map { dequeuedMsgs =>
45+
assert(dequeuedMsgs === List(testMsg))
8046
}
47+
}
48+
49+
it should "fulfill request for messages once enough are available" in {
50+
val sut = receivedMsgManager()
51+
sut.enqueue(testMsg(1))
52+
sut.enqueue(testMsg(2))
8153

82-
"flush the queue" in new TestScope {
83-
sut.enqueue(testMsg(1))
84-
sut.enqueue(testMsg(2))
54+
val f = sut.dequeue(3)
8555

86-
sut.currentQueueContents mustEqual List(testMsg(1), testMsg(2))
56+
assert(!f.isCompleted)
8757

88-
sut.flush()
58+
sut.enqueue(testMsg(3))
8959

90-
sut.currentQueueContents must beEmpty
60+
f map { dequeuedMsgs =>
61+
assert(dequeuedMsgs === List(testMsg(1), testMsg(2), testMsg(3)))
9162
}
9263
}
9364

94-
private trait TestScope extends Scope {
95-
val testIdTagInfo = IdTagInfo(status = AuthorizationStatus.Accepted)
65+
it should "allow a peek at what's in the queue" in {
66+
val sut = receivedMsgManager()
67+
sut.enqueue(testMsg(1))
68+
sut.enqueue(testMsg(2))
69+
70+
assert(sut.currentQueueContents === List(testMsg(1), testMsg(2)))
71+
}
72+
73+
it should "flush the queue" in {
74+
val sut = receivedMsgManager()
75+
sut.enqueue(testMsg(1))
76+
sut.enqueue(testMsg(2))
9677

97-
val sut = new ReceivedMsgManager[
78+
assert(sut.currentQueueContents === List(testMsg(1), testMsg(2)))
79+
80+
sut.flush()
81+
82+
assert(sut.currentQueueContents.isEmpty)
83+
}
84+
85+
private val testIdTagInfo = IdTagInfo(status = AuthorizationStatus.Accepted)
86+
87+
private def receivedMsgManager() = new ReceivedMsgManager[
9888
CentralSystemReq,
9989
CentralSystemRes,
10090
CentralSystemReqRes,
@@ -103,7 +93,7 @@ class ReceivedMsgManagerSpec(implicit ee: ExecutionEnv) extends Specification {
10393
ChargePointReqRes
10494
]
10595

106-
def testMsg(seqNo: Int) = GenericIncomingMessage[
96+
private def testMsg(seqNo: Int) = GenericIncomingMessage[
10797
CentralSystemReq,
10898
CentralSystemRes,
10999
CentralSystemReqRes,
@@ -114,6 +104,4 @@ class ReceivedMsgManagerSpec(implicit ee: ExecutionEnv) extends Specification {
114104
transactionId = seqNo,
115105
idTag = testIdTagInfo
116106
))
117-
118-
}
119107
}

core/src/test/scala/chargepoint/docile/dsl/expectations/OpsSpec.scala

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,27 @@ import com.thenewmotion.ocpp.Version1X
88
import com.thenewmotion.ocpp.VersionFamily.{V1X, V1XCentralSystemMessages, V1XChargePointMessages}
99
import com.thenewmotion.ocpp.json.api.OcppError
1010
import com.thenewmotion.ocpp.messages.v1x._
11-
import org.specs2.mutable.Specification
11+
import org.scalatest.flatspec.AnyFlatSpec
1212

13-
class OpsSpec extends Specification {
13+
class OpsSpec extends AnyFlatSpec {
1414

15-
"Ops" should {
16-
"await for messages ignoring not matched" in {
17-
val mock = new MutableOpsMock()
15+
"Ops" should "await for messages ignoring not matched" in {
16+
val mock = new MutableOpsMock()
1817

19-
import mock.ops._
18+
import mock.ops._
2019

21-
implicit val awaitTimeout: AwaitTimeout = AwaitTimeoutInMillis(5000)
20+
implicit val awaitTimeout: AwaitTimeout = AwaitTimeoutInMillis(5000)
2221

23-
mock send GetConfigurationReq(keys = List())
24-
mock send ClearCacheReq
22+
mock send GetConfigurationReq(keys = List())
23+
mock send ClearCacheReq
2524

26-
val result: Seq[ChargePointReq] = expectAllIgnoringUnmatched(
27-
clearCacheReq respondingWith ClearCacheRes(accepted = true)
28-
)
25+
val result: Seq[ChargePointReq] = expectAllIgnoringUnmatched(
26+
clearCacheReq respondingWith ClearCacheRes(accepted = true)
27+
)
2928

30-
result must_=== Seq(ClearCacheReq)
31-
mock.responses.size must_=== 1
32-
mock.responses.head must_=== ClearCacheRes(accepted = true)
33-
}
29+
assert(result === Seq(ClearCacheReq))
30+
assert(mock.responses.size === 1)
31+
assert(mock.responses.head === ClearCacheRes(accepted = true))
3432
}
3533

3634
class MutableOpsMock {

core/src/test/scala/chargepoint/docile/dsl/ocpp20transactions/OpsSpec.scala

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,50 +6,46 @@ import scala.concurrent.ExecutionContext
66
import com.thenewmotion.ocpp.VersionFamily
77
import com.thenewmotion.ocpp.VersionFamily.{V20CsMessages, V20CsmsMessages}
88
import com.thenewmotion.ocpp.messages.v20._
9-
import org.specs2.mutable.Specification
10-
import org.specs2.specification.Scope
9+
import org.scalatest.flatspec.AnyFlatSpec
1110

12-
class OpsSpec extends Specification {
11+
class OpsSpec extends AnyFlatSpec {
1312

14-
"ocpp20transactions.Ops" should {
13+
"ocpp20transactions.Ops" should "generate a transaction UUID on transaction start" in {
14+
val (tx, _) = ops.startTransactionAtCablePluggedIn()
1515

16-
"generate a transaction UUID on transaction start" in new TestScope {
17-
val (tx, _) = startTransactionAtCablePluggedIn()
18-
19-
tx.data.id must beMatching("\\p{XDigit}{8}-\\p{XDigit}{4}-\\p{XDigit}{4}-\\p{XDigit}{4}-\\p{XDigit}{12}")
20-
}
16+
assert(tx.data.id === "\\p{XDigit}{8}-\\p{XDigit}{4}-\\p{XDigit}{4}-\\p{XDigit}{4}-\\p{XDigit}{12}")
17+
}
2118

22-
"return transaction messages with incrementing sequence numbers" in new TestScope {
23-
val (tx, req0) = startTransactionAtCablePluggedIn()
19+
it should "return transaction messages with incrementing sequence numbers" in {
20+
val (tx, req0) = ops.startTransactionAtCablePluggedIn()
2421

25-
val req1 = tx.startEnergyOffer()
26-
val req2 = tx.end()
22+
val req1 = tx.startEnergyOffer()
23+
val req2 = tx.end()
2724

28-
(req0.seqNo, req1.seqNo, req2.seqNo) mustEqual ((0, 1, 2))
29-
}
25+
assert((req0.seqNo, req1.seqNo, req2.seqNo) === ((0, 1, 2)))
26+
}
3027

31-
"return transaction messages with incrementing sequence numbers over multiple transactions" in new TestScope {
32-
val (tx0, req0) = startTransactionAtCablePluggedIn()
28+
it should "return transaction messages with incrementing sequence numbers over multiple transactions" in {
29+
val (tx0, req0) = ops.startTransactionAtCablePluggedIn()
3330

34-
val req1 = tx0.end()
31+
val req1 = tx0.end()
3532

36-
val (tx1, req2) = startTransactionAtAuthorized()
33+
val (tx1, req2) = ops.startTransactionAtAuthorized()
3734

38-
val req3 = tx1.end()
35+
val req3 = tx1.end()
3936

40-
List(req0, req1, req2, req3).map(_.seqNo) mustEqual 0.to(3).toList
41-
}
37+
assert(List(req0, req1, req2, req3).map(_.seqNo) === 0.to(3).toList)
38+
}
4239

43-
"specify the EVSE and connector ID on the first message, and not later" in new TestScope {
44-
val (tx, req0) = startTransactionAtAuthorized(evseId = 2, connectorId = 3)
40+
it should "specify the EVSE and connector ID on the first message, and not later" in {
41+
val (tx, req0) = ops.startTransactionAtAuthorized(evseId = 2, connectorId = 3)
4542

46-
val req1 = tx.plugInCable()
43+
val req1 = tx.plugInCable()
4744

48-
(req0.evse, req1.evse) mustEqual ((Some(EVSE(2, Some(3))), None))
49-
}
45+
assert((req0.evse, req1.evse) === ((Some(EVSE(2, Some(3))), None)))
5046
}
5147

52-
trait TestScope extends Scope with CoreOps[
48+
val ops = new CoreOps[
5349
VersionFamily.V20.type,
5450
CsmsRequest,
5551
CsmsResponse,

0 commit comments

Comments
 (0)