Chromium Code Reviews| 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..259b5b96d5e49567451c631101d0d7c0d7b38fb8 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 |
|
floitsch
2013/10/23 13:33:24
I take it we only kept the test as is, but removed
|
| -// 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]); |
|
floitsch
2013/10/23 13:33:24
Switch order of lines.
Lasse Reichstein Nielsen
2013/10/24 10:26:01
Ok, but I don't necessarily agree that it's better
|
| } |
| - 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 queryBalance(handleBalance(int balance)) { |
| - purse_.call([ "balance" ]).then((var message) { |
| - int balance = message; |
| + ReceivePort reply = new ReceivePort(); |
| + reply.first.then((int balance) { |
| handleBalance(balance); |
| }); |
| + _purse.send([ "balance", reply.sendPort ]); |
| } |
| void sproutPurse(handleSprouted(PurseWrapper sprouted)) { |
| - purse_.call([ "sprout" ]).then((var message) { |
| - SendPort sprouted = message[0]; |
| + ReceivePort reply = new ReceivePort(); |
|
floitsch
2013/10/23 13:33:24
Create a sendReceive helper method.
Lasse Reichstein Nielsen
2013/10/24 10:26:01
Done.
|
| + _purse.send([ "sprout", reply.sendPort ]); |
| + reply.first.then((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(); |
| + receiver.listen((SendPort replyTo) { |
| Mint mint = new Mint(); |
| - replyTo.send([ mint.port ], null); |
| + replyTo.send(mint.port); |
| }); |
| + replyPort.send(receiver.sendPort); |
| } |
| 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); |
| - } |
| - */ |
| } |