Index: tests/isolate/mint_maker_test.dart |
diff --git a/tests/isolate/mint_maker_test.dart b/tests/isolate/mint_maker_test.dart |
index 90ad0584cbabcaff22dc24a929770ef8977e183b..457a42a62767e7c162d04024c18c057d8cdd9336 100644 |
--- a/tests/isolate/mint_maker_test.dart |
+++ b/tests/isolate/mint_maker_test.dart |
@@ -2,117 +2,84 @@ |
// for details. All rights reserved. Use of this source code is governed by a |
// BSD-style license that can be found in the LICENSE file. |
-// Things that should be "auto-generated" are between AUTO START and |
-// AUTO END (or just AUTO if it's a single line). |
- |
library MintMakerTest; |
import 'dart:isolate'; |
import '../../pkg/unittest/lib/unittest.dart'; |
class Mint { |
- Mint() : registry_ = new Map<SendPort, Purse>() { |
- // AUTO START |
+ Map<SendPort, Purse> _registry; |
+ SendPort port; |
+ |
+ Mint() : _registry = new Map<SendPort, Purse>() { |
ReceivePort mintPort = new ReceivePort(); |
- port = mintPort.toSendPort(); |
+ port = mintPort.sendPort; |
serveMint(mintPort); |
- // AUTO END |
} |
- // AUTO START |
void serveMint(ReceivePort port) { |
- port.receive((var message, SendPort replyTo) { |
- int balance = message; |
+ port.listen((message) { |
+ int balance = message[0]; |
Purse purse = createPurse(balance); |
- replyTo.send([ purse.port ], null); |
+ message[1].send(purse.port); |
}); |
} |
- // AUTO END |
Purse createPurse(int balance) { |
Purse purse = new Purse(this, balance); |
- registry_[purse.port] = purse; |
+ _registry[purse.port] = purse; |
return purse; |
} |
Purse lookupPurse(SendPort port) { |
- return registry_[port]; |
+ return _registry[port]; |
} |
- |
- Map<SendPort, Purse> registry_; |
- // AUTO |
- SendPort port; |
} |
-// AUTO START |
class MintWrapper { |
- MintWrapper(SendPort this.mint_) {} |
+ SendPort _mint; |
+ MintWrapper(SendPort this._mint) {} |
void createPurse(int balance, handlePurse(PurseWrapper purse)) { |
- mint_.call(balance).then((var message) { |
- SendPort purse = message[0]; |
+ ReceivePort reply = new ReceivePort(); |
+ reply.first.then((SendPort purse) { |
handlePurse(new PurseWrapper(purse)); |
}); |
+ _mint.send([balance, reply.sendPort]); |
} |
- SendPort mint_; |
-} |
-// AUTO END |
- |
- |
-/* |
-One way this could look without the autogenerated code: |
- |
-class Mint { |
- Mint() : registry_ = new Map<SendPort, Purse>() { |
- } |
- |
- wrap Purse createPurse(int balance) { |
- Purse purse = new Purse(this, balance); |
- registry_[purse.port] = purse; |
- return purse; |
- } |
- |
- Purse lookupPurse(SendPort port) { |
- return registry_[port]; |
- } |
- |
- Map<SendPort, Purse> registry_; |
} |
-The other end of the port would use Wrapper<Mint> as the wrapper, or |
-Future<Mint> as a future for the wrapper. |
-*/ |
- |
- |
class Purse { |
- Purse(Mint this.mint, int this.balance) { |
- // AUTO START |
+ Mint mint; |
+ int balance; |
+ SendPort port; |
+ |
+ Purse(this.mint, this.balance) { |
ReceivePort recipient = new ReceivePort(); |
- port = recipient.toSendPort(); |
+ port = recipient.sendPort; |
servePurse(recipient); |
- // AUTO END |
} |
- // AUTO START |
void servePurse(ReceivePort recipient) { |
- recipient.receive((var message, SendPort replyTo) { |
+ recipient.listen((message) { |
String command = message[0]; |
if (command == "balance") { |
- replyTo.send(queryBalance(), null); |
+ SendPort replyTo = message.last; |
+ replyTo.send(queryBalance()); |
} else if (command == "deposit") { |
Purse source = mint.lookupPurse(message[2]); |
deposit(message[1], source); |
} else if (command == "sprout") { |
+ SendPort replyTo = message.last; |
Purse result = sproutPurse(); |
- replyTo.send([ result.port ], null); |
+ replyTo.send(result.port); |
} else { |
// TODO: Send an exception back. |
- replyTo.send("Exception: Command not understood", null); |
+ throw UnsupportedError("Unsupported commend: $command"); |
} |
}); |
} |
- // AUTO END |
int queryBalance() { return balance; } |
@@ -124,64 +91,60 @@ class Purse { |
balance += amount; |
source.balance -= amount; |
} |
- |
- Mint mint; |
- int balance; |
- // AUTO |
- SendPort port; |
} |
-// AUTO START |
class PurseWrapper { |
- PurseWrapper(SendPort this.purse_) {} |
+ SendPort _purse; |
+ |
+ PurseWrapper(this._purse) {} |
+ |
+ void _sendReceive(message, replyHandler(reply)) { |
+ ReceivePort reply = new ReceivePort(); |
+ _purse.send([message, reply.sendPort]); |
+ reply.first.then(replyHandler); |
+ } |
void queryBalance(handleBalance(int balance)) { |
- purse_.call([ "balance" ]).then((var message) { |
- int balance = message; |
- handleBalance(balance); |
- }); |
+ _sendReceive("balance", handleBalance); |
} |
void sproutPurse(handleSprouted(PurseWrapper sprouted)) { |
- purse_.call([ "sprout" ]).then((var message) { |
- SendPort sprouted = message[0]; |
+ _sendReceive("sprout", (SendPort sprouted) { |
handleSprouted(new PurseWrapper(sprouted)); |
}); |
} |
void deposit(PurseWrapper source, int amount) { |
- purse_.send([ "deposit", amount, source.purse_ ], null); |
+ _purse.send([ "deposit", amount, source._purse ]); |
} |
- |
- |
- SendPort purse_; |
} |
-// AUTO END |
- |
-// AUTO STATUS UNCLEAR! |
- |
-mintMakerWrapper() { |
- port.receive((var message, SendPort replyTo) { |
+mintMakerWrapper(SendPort replyPort) { |
+ ReceivePort receiver = new ReceivePort(); |
+ replyPort.send(receiver.sendPort); |
+ receiver.listen((SendPort replyTo) { |
Mint mint = new Mint(); |
- replyTo.send([ mint.port ], null); |
+ replyTo.send(mint.port); |
}); |
} |
class MintMakerWrapper { |
- MintMakerWrapper() { |
- port_ = spawnFunction(mintMakerWrapper); |
+ final SendPort _port; |
+ |
+ static Future<MintMakerWrapper> create() { |
+ ReceivePort reply = new ReceivePort(); |
+ return Isolate.spawn(mintMakerWrapper, reply.sendPort).then((_) => |
+ reply.first.then((port) => new MintMakerWrapper._(port))); |
} |
+ MintMakerWrapper._(this._port); |
+ |
void makeMint(handleMint(MintWrapper mint)) { |
- port_.call(null).then((var message) { |
- SendPort mint = message[0]; |
- handleMint(new MintWrapper(mint)); |
- }); |
+ ReceivePort reply = new ReceivePort(); |
+ reply.first.then((SendPort mint) { handleMint(new MintWrapper(mint)); }); |
+ _port.send(reply.sendPort); |
} |
- |
- SendPort port_; |
} |
_checkBalance(PurseWrapper wrapper, expected) { |
@@ -192,70 +155,24 @@ _checkBalance(PurseWrapper wrapper, expected) { |
main() { |
test("creating purse, deposit, and query balance", () { |
- MintMakerWrapper mintMaker = new MintMakerWrapper(); |
- mintMaker.makeMint(expectAsync1((MintWrapper mint) { |
- mint.createPurse(100, expectAsync1((PurseWrapper purse) { |
- _checkBalance(purse, 100); |
- purse.sproutPurse(expectAsync1((PurseWrapper sprouted) { |
- _checkBalance(sprouted, 0); |
+ MintMakerWrapper.create().then(expectAsync1((mintMaker) { |
+ mintMaker.makeMint(expectAsync1((MintWrapper mint) { |
+ mint.createPurse(100, expectAsync1((PurseWrapper purse) { |
_checkBalance(purse, 100); |
- |
- sprouted.deposit(purse, 5); |
- _checkBalance(sprouted, 0 + 5); |
- _checkBalance(purse, 100 - 5); |
- |
- sprouted.deposit(purse, 42); |
- _checkBalance(sprouted, 0 + 5 + 42); |
- _checkBalance(purse, 100 - 5 - 42); |
+ purse.sproutPurse(expectAsync1((PurseWrapper sprouted) { |
+ _checkBalance(sprouted, 0); |
+ _checkBalance(purse, 100); |
+ |
+ sprouted.deposit(purse, 5); |
+ _checkBalance(sprouted, 0 + 5); |
+ _checkBalance(purse, 100 - 5); |
+ |
+ sprouted.deposit(purse, 42); |
+ _checkBalance(sprouted, 0 + 5 + 42); |
+ _checkBalance(purse, 100 - 5 - 42); |
+ })); |
})); |
})); |
})); |
}); |
- |
- /* This is an attempt to show how the above code could look like if we had |
- * better language support for asynchronous messages (deferred/asynccall). |
- * The static helper methods like createPurse and queryBalance would also |
- * have to be marked async. |
- |
- void run(port) { |
- MintMakerWrapper mintMaker = spawnMintMaker(); |
- deferred { |
- MintWrapper mint = asynccall mintMaker.createMint(); |
- PurseWrapper purse = asynccall mint.createPurse(100); |
- expect(asynccall purse.queryBalance(), 100); |
- |
- PurseWrapper sprouted = asynccall purse.sproutPurse(); |
- expect(asynccall sprouted.queryBalance(), 0); |
- |
- asynccall sprouted.deposit(purse, 5); |
- expect(asynccall sprouted.queryBalance(), 0 + 5); |
- expect(asynccall purse.queryBalance(), 100 - 5); |
- |
- asynccall sprouted.deposit(purse, 42); |
- expect(asynccall sprouted.queryBalance(), 0 + 5 + 42); |
- expect(asynccall purse.queryBalance(), 100 - 5 - 42); |
- } |
- } |
- */ |
- |
- /* And a version using futures and wrappers. |
- |
- void run(port) { |
- Wrapper<MintMaker> mintMaker = spawnMintMaker(); |
- Future<Mint> mint = mintMaker...createMint(); |
- Future<Purse> purse = mint...createPurse(100); |
- expect(purse.queryBalance(), 100); |
- |
- Future<Purse> sprouted = purse...sproutPurse(); |
- expect(0, sprouted.queryBalance()); |
- |
- sprouted...deposit(purse, 5); |
- expect(sprouted.queryBalance(), 0 + 5); |
- expect(purse.queryBalance(), 100 - 5); |
- |
- sprouted...deposit(purse, 42); |
- expect(sprouted.queryBalance(), 0 + 5 + 42); |
- expect(purse.queryBalance(), 100 - 5 - 42); |
- } |
- */ |
} |