Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add SOMns applications and tests #323

Open
wants to merge 6 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions core-lib/TestSuite/Minitest.ns
Original file line number Diff line number Diff line change
Expand Up @@ -436,9 +436,9 @@ OTHER DEALINGS IN THE SOFTWARE. *)
immediately garbage-collectable, which is an important property for large test suites. *)
cleanUp.
promisePair resolve: testSuccess ]
onError: [:e |
onError: [:ex |
| exClass |
exClass:: (ClassMirror reflecting: e) classObject.
exClass:: (ClassMirror reflecting: ex) classObject.
exClass == TestFailureException ifTrue: [
promisePair resolve: (testContextInstance
ifNil: [ TestFailure case: self description: ex messageText]
Expand Down
64 changes: 64 additions & 0 deletions core-lib/TestSuite/applicationsTests/InstantMessengerAppTest.ns
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
class InstantMessengerAppTest usingPlatform: platform testFramework: minitest = Value (
| private AsyncTestContext = minitest AsyncTestContext.
private actors = platform actors.
private messengerApp = (platform system
loadModule: '../../demos/applications/InstantMessengerApplication.ns' nextTo: self)
usingPlatform: platform.
private InstantMessenger = messengerApp InstantMessenger.
|)(

public class MessengerTest = AsyncTestContext ()(

public testAsyncAddMessenger = (
| messenger1 messenger2 pMessenger pName pp |
pp:: actors createPromisePair.

messenger1:: (actors createActorFromValue: InstantMessenger) <-: new: 'Joe' total: 2.
messenger2:: (actors createActorFromValue: InstantMessenger) <-: new: 'Marie' total: 2.

pMessenger:: messenger2 <-: addMessenger: messenger1.

pMessenger whenResolved:[: farRefRemoteMessenger |
pName:: farRefRemoteMessenger <-: name.

pName whenResolved: [: r |
pp resolver resolve: r
].
].

^ assert: pp promise resolvedWith: 'Joe'
)

public testAsyncSendMessage = (
| messenger1 messenger2 pDiscover pp pName msg pSend |
pp:: actors createPromisePair.

messenger1:: (actors createActorFromValue: InstantMessenger) <-: new: 'Joe' total: 2.
messenger2:: (actors createActorFromValue: InstantMessenger) <-: new: 'Marie' total: 2.

pDiscover:: messenger1 <-: addMessenger: messenger2.

pName:: pDiscover <-: name.
pName whenResolved: [: remoteName |
msg:: ('Hello ' + remoteName).
pSend:: messenger1 <-: sendMessage: remoteName contentMsg: msg.

pSend whenResolved: [: r |
pp resolver resolve: r ] ].

^ assert: pp promise resolvedWith: #ok
)

public testAsyncChat = (
| messenger1 messenger2 p array |
messenger1:: (actors createActorFromValue: InstantMessenger) <-: new: 'Joe' total: 2.
messenger2:: (actors createActorFromValue: InstantMessenger) <-: new: 'Marie' total: 2.

p:: messenger1 <-: startChat: messenger2.
^ p whenResolved: [: result |
result ifNotNil: [
assert: (result sender) equals:'Joe'.
assert: (result content) equals:'Hello Marie' ] ].
)
) : ( TEST_CONTEXT = () )
)
98 changes: 98 additions & 0 deletions core-lib/TestSuite/applicationsTests/InternetCafeAppTest.ns
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
class InternetCafeAppTest usingPlatform: platform testFramework: minitest = Value (
| private AsyncTestContext = minitest AsyncTestContext.
private actors = platform actors.
private Exception = platform kernel Exception.
private cafeApp = (platform system
loadModule: '../../demos/applications/InternetCafeApplication.ns' nextTo: self)
usingPlatform: platform.
private InternetCafe = cafeApp InternetCafe.
|
)(

public class CafeTest = AsyncTestContext ()(

public testAsyncAskComputer = (
| cafeActor numberComputers numberCustomers pCustomer pResult |

numberComputers:: 3.
numberCustomers:: 1.

cafeActor:: (actors createActorFromValue: InternetCafe) <-: new: numberComputers totalCustomers: numberCustomers.

pCustomer:: cafeActor <-: createCustomer: 'Paul' room: cafeActor.

pResult:: pCustomer <-: askComputer.

^ pResult whenResolved:[: array |
assert: (array at: 1) equals:'Paul'.
assert: (array at: 2) equals: 1.
].
)

public testAsyncFullRoom = (
| cafeActor numberComputers numberCustomers pResult1 pResult2 pResult3 pCustomer1 pCustomer2 pCustomer3 pp |

numberComputers:: 2.
numberCustomers:: 3.

cafeActor:: (actors createActorFromValue: InternetCafe) <-: new: numberComputers totalCustomers: numberCustomers.

pCustomer1:: cafeActor <-: createCustomer: 'Paul' room: cafeActor.
pCustomer2:: cafeActor <-: createCustomer: 'Jane' room: cafeActor.
pCustomer3:: cafeActor <-: createCustomer: 'Julia' room: cafeActor.

pResult1:: pCustomer1 <-: askComputer.
pResult2:: pCustomer2 <-: askComputer.
pResult3:: pCustomer3 <-: askComputer.

^ pResult1 whenResolved:[:r1 |
assert: (r1 at: 1) equals:'Paul'.
assert: (r1 at: 2) equals: 1.

pResult2 whenResolved:[:r2 |
assert: (r2 at: 1) equals:'Jane'.
assert: (r2 at: 2) equals: 2.

pResult3 whenResolved:[:r3 |
assert: (r3 at: 1) equals:'Julia'.
assert: ((r3 at: 2) asString) equals:'instance of FarReference'.
(* far reference that represents the promise pair created because there is no computer availability *)
].
].
].
)

public testAsyncReleaseComputer = (
| cafeActor numberComputers numberCustomers pResult1 pResult2 pCustomer1 pCustomer2 completionPP pReleased |

completionPP:: actors createPromisePair.

numberComputers:: 1.
numberCustomers:: 2.

cafeActor:: (actors createActorFromValue: InternetCafe) <-: new: numberComputers totalCustomers: numberCustomers.

pCustomer1:: cafeActor <-: createCustomer: 'Paul' room: cafeActor.
pCustomer2:: cafeActor <-: createCustomer: 'Jane' room: cafeActor.

pResult1:: pCustomer1 <-: askComputer.

actors after: 10 do: [
pReleased:: pCustomer1 <-: releaseComputer: 1.
pReleased whenResolved: [:r7 |
cafeActor <-: resolvePendingPromise: 1.
].

pResult2:: pCustomer2 <-: askComputer.
pResult2 whenResolved:[:r |
assert: (r at: 1) equals:'Jane'.
completionPP resolver resolve: (r at: 2).
].
].

^ assert: completionPP promise resolvedWith: 1
)

) : (
TEST_CONTEXT = () )
)
105 changes: 105 additions & 0 deletions core-lib/TestSuite/applicationsTests/MusicPlayerAppTest.ns
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
class MusicPlayerAppTest usingPlatform: platform testFramework: minitest = Value (
| private actors = platform actors.
private AsyncTestContext = minitest AsyncTestContext.
private musicApp = (platform system
loadModule: '../../demos/applications/MusicPlayerApplication.ns' nextTo: self)
usingPlatform: platform.
private MusicPlayer = musicApp MusicPlayer.
private Song = musicApp Song.
private TransferArray = platform kernel TransferArray.
|
)(

public class MusicPlayerTest = AsyncTestContext ()(

public testAsyncAddUser = (
| pp users mplayerActor1 mplayerActor2 songlist1 songlist2
s1 s2 s3 s4 s5 s6 pPlayer pName |

pp:: actors createPromisePair.

s1:: Song new.
s1 init: 'S1' artist: 'A1'.
s2:: Song new.
s2 init: 'S2' artist: 'A2'.
s3:: Song new.
s3 init: 'S3' artist: 'A3'.
s4:: Song new.
s4 init: 'S4' artist: 'A4'.
s5:: Song new.
s5 init: 'S5' artist: 'A5'.
s6:: Song new.
s6 init: 'S6' artist: 'A6'.

songlist1:: TransferArray new: 3.
songlist1 at: 1 put: s1.
songlist1 at: 2 put: s2.
songlist1 at: 3 put: s3.

songlist2:: TransferArray new: 5.
songlist2 at: 1 put: s4.
songlist2 at: 2 put: s5.
songlist2 at: 3 put: s2.
songlist2 at: 4 put: s3.
songlist2 at: 5 put: s6.

mplayerActor1:: (actors createActorFromValue: MusicPlayer) <-: new: 'Joe' songlist: songlist1.
mplayerActor2:: (actors createActorFromValue: MusicPlayer) <-: new: 'Marie' songlist: songlist2.

pPlayer:: mplayerActor1 <-: addPlayer: mplayerActor2.

pName:: pPlayer <-: getName.

pName whenResolved: [:r |
pp resolver resolve: r
].

^ assert: pp promise resolvedWith: 'Marie'
)

public testAsyncExchangeSongs = (
| pp users mplayerActor1 mplayerActor2 songlist1 songlist2
s1 s2 s3 s4 s5 s6 resultPromise1 resultPromise2 |

pp:: actors createPromisePair.

s1:: Song new.
s1 init: 'S1' artist: 'A1'.
s2:: Song new.
s2 init: 'S2' artist: 'A2'.
s3:: Song new.
s3 init: 'S3' artist: 'A3'.
s4:: Song new.
s4 init: 'S4' artist: 'A4'.
s5:: Song new.
s5 init: 'S5' artist: 'A5'.
s6:: Song new.
s6 init: 'S6' artist: 'A6'.

songlist1:: TransferArray new: 3.
songlist1 at: 1 put: s1.
songlist1 at: 2 put: s2.
songlist1 at: 3 put: s3.

songlist2:: TransferArray new: 5.
songlist2 at: 1 put: s4.
songlist2 at: 2 put: s5.
songlist2 at: 3 put: s2.
songlist2 at: 4 put: s3.
songlist2 at: 5 put: s6.

mplayerActor1:: (actors createActorFromValue: MusicPlayer) <-: new: 'Joe' songlist: songlist1.
mplayerActor2:: (actors createActorFromValue: MusicPlayer) <-: new: 'Marie' songlist: songlist2.

resultPromise1:: mplayerActor1 <-: startExchange: mplayerActor2.
resultPromise2:: mplayerActor2 <-: startExchange: mplayerActor1.

^ (assert: resultPromise1 resolvedWith: 'Marie has different musical taste than Joe -> 40%'),
(assert: resultPromise2 resolvedWith: 'Joe has similar musical taste to Marie -> 66%')
)


) : ( TEST_CONTEXT = () )

)

Loading