@@ -1430,6 +1430,98 @@ void main() {
14301430 });
14311431 });
14321432
1433+ describe ('microtask processing' , () {
1434+ beforeEach ((VmTurnZone zone, RootScope scope, Logger log) {
1435+ var onTurnDone = zone.onTurnDone;
1436+ zone.onTurnDone = () {
1437+ log ('[' );
1438+ onTurnDone ();
1439+ log (']' );
1440+ };
1441+ var onScheduleMicrotask = zone.onScheduleMicrotask;
1442+ zone.onScheduleMicrotask = (fn) {
1443+ log ('(' );
1444+ try {
1445+ onScheduleMicrotask (fn);
1446+ } catch (e) {
1447+ log ('CATCH: $e ' );
1448+ }
1449+ log (')' );
1450+ };
1451+ });
1452+
1453+ it ('should schedule apply after future resolution' ,
1454+ async ((Logger log, VmTurnZone zone, RootScope scope) {
1455+ Completer completer;
1456+ zone.run (() {
1457+ completer = new Completer ();
1458+ completer.future.then ((value) {
1459+ log ('then($value )' );
1460+ });
1461+ });
1462+
1463+ scope.runAsync (() => log ('before' ));
1464+ log.clear ();
1465+ completer.complete ('OK' ); // this one causes APPLY which processe 'before'
1466+ // This one schedules work but apply already run so it does not execute.
1467+ scope.runAsync (() => log ('NOT_EXECUTED' ));
1468+
1469+ expect (log).toEqual (['(' , ')' , '[' , 'before' , 'then(OK)' , ']' ]);
1470+ })
1471+ );
1472+
1473+ it ('should schedule microtask to runAsync queue during digest' ,
1474+ async ((Logger log, VmTurnZone zone, RootScope scope) {
1475+ Completer completer;
1476+ zone.run (() {
1477+ completer = new Completer ();
1478+ completer.future.
1479+ then ((value) {
1480+ scope.runAsync (() => log ('in(${scope .state })' ));
1481+ return new Future .value (value);
1482+ }).
1483+ then ((value) {
1484+ log ('then($value )' );
1485+ });
1486+ });
1487+ log.clear ();
1488+ completer.complete ('OK' );
1489+ expect (log).toEqual (['(' , ')' , '[' , '(' , ')' , 'in(digest)' , 'then(OK)' , ']' ]);
1490+ })
1491+ );
1492+
1493+ it ('should not allow microtasks in flush phase' ,
1494+ async ((Logger log, VmTurnZone zone, RootScope scope) {
1495+ zone.run (() {
1496+ scope.domWrite (() {
1497+ return new Future .value ('FAIL' );
1498+ });
1499+ });
1500+ expect (log).toEqual (
1501+ ['[' , '(' , 'CATCH: Scheduling microtasks not allowed in flush state.' , ')' , ']' ]);
1502+ })
1503+ );
1504+
1505+ it ('should allow creation of Completers in flush phase' ,
1506+ async ((Logger log, VmTurnZone zone, RootScope scope) {
1507+ Completer completer;
1508+ zone.run (() {
1509+ scope.domWrite (() {
1510+ log ('new Completer' );
1511+ completer = new Completer ();
1512+ completer.future.then ((value) {
1513+ log ('then($value )' );
1514+ });
1515+ });
1516+ });
1517+ log ('=' );
1518+ completer.complete ('OK' );
1519+ log (';' );
1520+ expect (log).toEqual (
1521+ ['[' , 'new Completer' , ']' , '=' , '(' , ')' , '[' , 'then(OK)' , ']' , ';' ]);
1522+ })
1523+ );
1524+ });
14331525
14341526 describe ('domRead/domWrite' , () {
14351527 beforeEachModule ((Module module) {
0 commit comments