1- import { ddescribe , describe , it , iit , xit , expect } from 'test_lib/test_lib' ;
1+ import { ddescribe , describe , it , iit , xit , expect , beforeEach } from 'test_lib/test_lib' ;
22
33import { isPresent , isBlank , isJsObject } from 'facade/lang' ;
44import { List , ListWrapper , MapWrapper } from 'facade/collection' ;
@@ -28,7 +28,7 @@ export function main() {
2828 var prr = new ProtoRecordRange ( ) ;
2929 prr . addRecordsFromAST ( ast ( exp ) , memo , memo , content ) ;
3030
31- var dispatcher = new LoggingDispatcher ( ) ;
31+ var dispatcher = new TestDispatcher ( ) ;
3232 var rr = prr . instantiate ( dispatcher , formatters ) ;
3333 rr . setContext ( context ) ;
3434
@@ -46,6 +46,17 @@ export function main() {
4646
4747 describe ( 'change_detection' , ( ) => {
4848 describe ( 'ChangeDetection' , ( ) => {
49+ function createRange ( dispatcher , ast , group ) {
50+ var prr = new ProtoRecordRange ( ) ;
51+ prr . addRecordsFromAST ( ast , "memo" , group ) ;
52+ return prr . instantiate ( dispatcher , null ) ;
53+ }
54+
55+ function detectChangesInRange ( recordRange ) {
56+ var cd = new ChangeDetector ( recordRange ) ;
57+ cd . detectChanges ( ) ;
58+ }
59+
4960 it ( 'should do simple watching' , ( ) => {
5061 var person = new Person ( "misko" ) ;
5162
@@ -345,18 +356,45 @@ export function main() {
345356 }
346357 } ) ;
347358
348- describe ( "onGroupChange" , ( ) => {
359+ describe ( "adding new ranges" , ( ) => {
360+ var dispatcher ;
361+
362+ beforeEach ( ( ) => {
363+ dispatcher = new TestDispatcher ( ) ;
364+ } ) ;
365+
366+ /**
367+ * Tests that we can add a new range after the current
368+ * record has been disabled. The new range must be processed
369+ * during the same change detection run.
370+ */
371+ it ( "should work when disabling the last enabled record" , ( ) => {
372+ var rr = createRange ( dispatcher , ast ( "1" ) , 1 ) ;
373+
374+ dispatcher . onChange = ( group , _ ) => {
375+ if ( group === 1 ) { // to prevent infinite loop
376+ var rangeToAppend = createRange ( dispatcher , ast ( "2" ) , 2 ) ;
377+ rr . addRange ( rangeToAppend ) ;
378+ }
379+ } ;
380+
381+ detectChangesInRange ( rr ) ;
382+
383+ expect ( dispatcher . loggedValues ) . toEqual ( [ [ 1 ] , [ 2 ] ] ) ;
384+ } ) ;
385+ } ) ;
386+
387+ describe ( "group changes" , ( ) => {
349388 it ( "should notify the dispatcher when a group of records changes" , ( ) => {
350389 var prr = new ProtoRecordRange ( ) ;
351390 prr . addRecordsFromAST ( ast ( "1 + 2" ) , "memo" , 1 ) ;
352391 prr . addRecordsFromAST ( ast ( "10 + 20" ) , "memo" , 1 ) ;
353392 prr . addRecordsFromAST ( ast ( "100 + 200" ) , "memo2" , 2 ) ;
354393
355- var dispatcher = new LoggingDispatcher ( ) ;
394+ var dispatcher = new TestDispatcher ( ) ;
356395 var rr = prr . instantiate ( dispatcher , null ) ;
357396
358- var cd = new ChangeDetector ( rr ) ;
359- cd . detectChanges ( ) ;
397+ detectChangesInRange ( rr ) ;
360398
361399 expect ( dispatcher . loggedValues ) . toEqual ( [ [ 3 , 30 ] , [ 300 ] ] ) ;
362400 } ) ;
@@ -365,13 +403,12 @@ export function main() {
365403 var prr = new ProtoRecordRange ( ) ;
366404 prr . addRecordsFromAST ( ast ( "1 + 2" ) , "memo" , "memo" ) ;
367405
368- var dispatcher = new LoggingDispatcher ( ) ;
406+ var dispatcher = new TestDispatcher ( ) ;
369407 var rr = new RecordRange ( null , dispatcher ) ;
370408 rr . addRange ( prr . instantiate ( dispatcher , null ) ) ;
371409 rr . addRange ( prr . instantiate ( dispatcher , null ) ) ;
372410
373- var cd = new ChangeDetector ( rr ) ;
374- cd . detectChanges ( ) ;
411+ detectChangesInRange ( rr ) ;
375412
376413 expect ( dispatcher . loggedValues ) . toEqual ( [ [ 3 ] , [ 3 ] ] ) ;
377414 } ) ;
@@ -382,7 +419,7 @@ export function main() {
382419 prr . addRecordsFromAST ( ast ( "b()" ) , "b" , 2 ) ;
383420 prr . addRecordsFromAST ( ast ( "c()" ) , "b" , 2 ) ;
384421
385- var dispatcher = new LoggingDispatcher ( ) ;
422+ var dispatcher = new TestDispatcher ( ) ;
386423 var rr = prr . instantiate ( dispatcher , null ) ;
387424
388425 var tr = new TestRecord ( ) ;
@@ -391,8 +428,7 @@ export function main() {
391428 tr . c = ( ) => { dispatcher . logValue ( 'InvokeC' ) ; return 'c' } ;
392429 rr . setContext ( tr ) ;
393430
394- var cd = new ChangeDetector ( rr ) ;
395- cd . detectChanges ( ) ;
431+ detectChangesInRange ( rr ) ;
396432
397433 expect ( dispatcher . loggedValues ) . toEqual ( [ 'InvokeA' , [ 'a' ] , 'InvokeB' , 'InvokeC' , [ 'b' , 'c' ] ] ) ;
398434 } ) ;
@@ -444,21 +480,23 @@ class TestData {
444480 }
445481}
446482
447- class LoggingDispatcher extends WatchGroupDispatcher {
483+ class TestDispatcher extends WatchGroupDispatcher {
448484 log :List ;
449485 loggedValues :List ;
486+ onChange :Function ;
450487
451488 constructor ( ) {
452489 this . log = null ;
453490 this . loggedValues = null ;
491+ this . onChange = ( _ , __ ) => { } ;
454492 this . clear ( ) ;
455493 }
456494
457495 clear ( ) {
458496 this . log = ListWrapper . create ( ) ;
459497 this . loggedValues = ListWrapper . create ( ) ;
460498 }
461-
499+
462500 logValue ( value ) {
463501 ListWrapper . push ( this . loggedValues , value ) ;
464502 }
@@ -470,6 +508,8 @@ class LoggingDispatcher extends WatchGroupDispatcher {
470508
471509 var values = ListWrapper . map ( records , ( r ) => r . currentValue ) ;
472510 ListWrapper . push ( this . loggedValues , values ) ;
511+
512+ this . onChange ( group , records ) ;
473513 }
474514
475515 _asString ( value ) {
0 commit comments