@@ -7,8 +7,9 @@ import {Parser} from 'angular2/src/change_detection/parser/parser';
77import { Lexer } from 'angular2/src/change_detection/parser/lexer' ;
88
99import { ChangeDispatcher , DynamicChangeDetector , ChangeDetectionError , ContextWithVariableBindings ,
10- PipeRegistry , NO_CHANGE ,
11- CHECK_ALWAYS , CHECK_ONCE , CHECKED , DETACHED } from 'angular2/change_detection' ;
10+ PipeRegistry , NO_CHANGE , CHECK_ALWAYS , CHECK_ONCE , CHECKED , DETACHED } from 'angular2/change_detection' ;
11+
12+ import { ChangeDetectionUtil } from 'angular2/src/change_detection/change_detection_util' ;
1213
1314
1415import { JitProtoChangeDetector , DynamicProtoChangeDetector } from 'angular2/src/change_detection/proto_change_detector' ;
@@ -189,52 +190,90 @@ export function main() {
189190
190191 expect ( dispatcher . log ) . toEqual ( [ "memo=BvalueA" ] ) ;
191192 } ) ;
193+
194+ describe ( "change notification" , ( ) => {
195+ describe ( "simple checks" , ( ) => {
196+ it ( "should pass a change record to the dispatcher" , ( ) => {
197+ var person = new Person ( 'bob' ) ;
198+ var c = createChangeDetector ( 'name' , 'name' , person ) ;
199+ var cd = c [ "changeDetector" ] ;
200+ var dispatcher = c [ "dispatcher" ] ;
192201
193- describe ( "group changes" , ( ) => {
194- it ( "should notify the dispatcher when a group of records changes" , ( ) => {
195- var pcd = createProtoChangeDetector ( ) ;
196- pcd . addAst ( ast ( "1 + 2" ) , "memo" , "1" ) ;
197- pcd . addAst ( ast ( "10 + 20" ) , "memo" , "1" ) ;
198- pcd . addAst ( ast ( "100 + 200" ) , "memo2" , "2" ) ;
202+ cd . detectChanges ( ) ;
199203
200- var dispatcher = new TestDispatcher ( ) ;
201- var cd = pcd . instantiate ( dispatcher ) ;
204+ var changeRecord = dispatcher . changeRecords [ 0 ] [ 0 ] ;
205+
206+ expect ( changeRecord . bindingMemento ) . toEqual ( 'name' ) ;
207+ expect ( changeRecord . change . currentValue ) . toEqual ( 'bob' ) ;
208+ expect ( changeRecord . change . previousValue ) . toEqual ( ChangeDetectionUtil . unitialized ( ) ) ;
209+ } ) ;
210+ } ) ;
211+
212+ describe ( "pipes" , ( ) => {
213+ it ( "should pass a change record to the dispatcher" , ( ) => {
214+ var registry = new FakePipeRegistry ( 'pipe' , ( ) => new CountingPipe ( ) ) ;
215+
216+ var person = new Person ( 'bob' ) ;
217+ var c = createChangeDetector ( 'name' , 'name | pipe' , person , registry ) ;
218+ var cd = c [ "changeDetector" ] ;
219+ var dispatcher = c [ "dispatcher" ] ;
220+
221+ cd . detectChanges ( ) ;
202222
203- cd . detectChanges ( ) ;
223+ var changeRecord = dispatcher . changeRecords [ 0 ] [ 0 ] ;
204224
205- expect ( dispatcher . loggedValues ) . toEqual ( [ [ 3 , 30 ] , [ 300 ] ] ) ;
225+ expect ( changeRecord . bindingMemento ) . toEqual ( 'name' ) ;
226+ expect ( changeRecord . change . currentValue ) . toEqual ( 'bob state:0' ) ;
227+ expect ( changeRecord . change . previousValue ) . toEqual ( ChangeDetectionUtil . unitialized ( ) ) ;
228+ } ) ;
206229 } ) ;
207230
208- it ( "should notify the dispatcher before switching to the next group" , ( ) => {
209- var pcd = createProtoChangeDetector ( ) ;
210- pcd . addAst ( ast ( "a()" ) , "a" , "1" ) ;
211- pcd . addAst ( ast ( "b()" ) , "b" , "2" ) ;
212- pcd . addAst ( ast ( "c()" ) , "c" , "2" ) ;
231+ describe ( "group changes" , ( ) => {
232+ it ( "should notify the dispatcher when a group of records changes" , ( ) => {
233+ var pcd = createProtoChangeDetector ( ) ;
234+ pcd . addAst ( ast ( "1 + 2" ) , "memo" , "1" ) ;
235+ pcd . addAst ( ast ( "10 + 20" ) , "memo" , "1" ) ;
236+ pcd . addAst ( ast ( "100 + 200" ) , "memo2" , "2" ) ;
213237
214- var dispatcher = new TestDispatcher ( ) ;
215- var cd = pcd . instantiate ( dispatcher ) ;
238+ var dispatcher = new TestDispatcher ( ) ;
239+ var cd = pcd . instantiate ( dispatcher ) ;
240+
241+ cd . detectChanges ( ) ;
216242
217- var tr = new TestRecord ( ) ;
218- tr . a = ( ) => {
219- dispatcher . logValue ( 'InvokeA' ) ;
220- return 'a'
221- } ;
222- tr . b = ( ) => {
223- dispatcher . logValue ( 'InvokeB' ) ;
224- return 'b'
225- } ;
226- tr . c = ( ) => {
227- dispatcher . logValue ( 'InvokeC' ) ;
228- return 'c'
229- } ;
230- cd . setContext ( tr ) ;
231-
232- cd . detectChanges ( ) ;
233-
234- expect ( dispatcher . loggedValues ) . toEqual ( [ 'InvokeA' , [ 'a' ] , 'InvokeB' , 'InvokeC' , [ 'b' , 'c' ] ] ) ;
243+ expect ( dispatcher . loggedValues ) . toEqual ( [ [ 3 , 30 ] , [ 300 ] ] ) ;
244+ } ) ;
245+
246+ it ( "should notify the dispatcher before switching to the next group" , ( ) => {
247+ var pcd = createProtoChangeDetector ( ) ;
248+ pcd . addAst ( ast ( "a()" ) , "a" , "1" ) ;
249+ pcd . addAst ( ast ( "b()" ) , "b" , "2" ) ;
250+ pcd . addAst ( ast ( "c()" ) , "c" , "2" ) ;
251+
252+ var dispatcher = new TestDispatcher ( ) ;
253+ var cd = pcd . instantiate ( dispatcher ) ;
254+
255+ var tr = new TestRecord ( ) ;
256+ tr . a = ( ) => {
257+ dispatcher . logValue ( 'InvokeA' ) ;
258+ return 'a'
259+ } ;
260+ tr . b = ( ) => {
261+ dispatcher . logValue ( 'InvokeB' ) ;
262+ return 'b'
263+ } ;
264+ tr . c = ( ) => {
265+ dispatcher . logValue ( 'InvokeC' ) ;
266+ return 'c'
267+ } ;
268+ cd . setContext ( tr ) ;
269+
270+ cd . detectChanges ( ) ;
271+
272+ expect ( dispatcher . loggedValues ) . toEqual ( [ 'InvokeA' , [ 'a' ] , 'InvokeB' , 'InvokeC' , [ 'b' , 'c' ] ] ) ;
273+ } ) ;
235274 } ) ;
236275 } ) ;
237-
276+
238277 describe ( "enforce no new changes" , ( ) => {
239278 it ( "should throw when a record gets changed after it has been checked" , ( ) => {
240279 var pcd = createProtoChangeDetector ( ) ;
@@ -576,6 +615,7 @@ class TestData {
576615class TestDispatcher extends ChangeDispatcher {
577616 log :List ;
578617 loggedValues :List ;
618+ changeRecords :List ;
579619 onChange :Function ;
580620
581621 constructor ( ) {
@@ -589,21 +629,24 @@ class TestDispatcher extends ChangeDispatcher {
589629 clear ( ) {
590630 this . log = ListWrapper . create ( ) ;
591631 this . loggedValues = ListWrapper . create ( ) ;
632+ this . changeRecords = ListWrapper . create ( ) ;
592633 }
593634
594635 logValue ( value ) {
595636 ListWrapper . push ( this . loggedValues , value ) ;
596637 }
597638
598- onRecordChange ( group , updates :List ) {
599- var value = updates [ 0 ] . change . currentValue ;
600- var memento = updates [ 0 ] . bindingMemento ;
639+ onRecordChange ( group , changeRecords :List ) {
640+ var value = changeRecords [ 0 ] . change . currentValue ;
641+ var memento = changeRecords [ 0 ] . bindingMemento ;
601642 ListWrapper . push ( this . log , memento + '=' + this . _asString ( value ) ) ;
602643
603- var values = ListWrapper . map ( updates , ( r ) => r . change . currentValue ) ;
644+ var values = ListWrapper . map ( changeRecords , ( r ) => r . change . currentValue ) ;
604645 ListWrapper . push ( this . loggedValues , values ) ;
605646
606- this . onChange ( group , updates ) ;
647+ ListWrapper . push ( this . changeRecords , changeRecords ) ;
648+
649+ this . onChange ( group , changeRecords ) ;
607650 }
608651
609652
0 commit comments