1+ import TKUnit = require( "./TKUnit" ) ;
2+ import types = require( "utils/types" ) ;
3+ import observable = require( "data/observable" ) ;
4+ import weakEvents = require( "ui/core/weak-event-listener" ) ;
5+ import helper = require( "./ui/helper" ) ;
6+
7+ export function test_addWeakEventListener_throwsWhenCalledwitnInvalid_source ( ) {
8+ TKUnit . assertThrows ( ( ) => {
9+ weakEvents . WeakEventListener . addWeakEventListener ( {
10+ source : undefined ,
11+ target : { } ,
12+ handler : emptyHandler ,
13+ eventName : observable . Observable . propertyChangeEvent
14+ } ) ;
15+ } ) ;
16+ }
17+
18+ export function test_addWeakEventListener_throwsWhenCalledwitnInvalid_target ( ) {
19+ TKUnit . assertThrows ( ( ) => {
20+ weakEvents . WeakEventListener . addWeakEventListener ( {
21+ source : new observable . Observable ( ) ,
22+ target : undefined ,
23+ handler : emptyHandler ,
24+ eventName : observable . Observable . propertyChangeEvent
25+ } ) ;
26+ } ) ;
27+ }
28+
29+ export function test_addWeakEventListener_throwsWhenCalledwitnInvalid_handler ( ) {
30+ TKUnit . assertThrows ( ( ) => {
31+ weakEvents . WeakEventListener . addWeakEventListener ( {
32+ source : new observable . Observable ( ) ,
33+ target : { } ,
34+ handler : undefined ,
35+ eventName : observable . Observable . propertyChangeEvent
36+ } ) ;
37+ } ) ;
38+ }
39+
40+ export function test_addWeakEventListener_throwsWhenCalledwitnInvalid_name ( ) {
41+ TKUnit . assertThrows ( ( ) => {
42+ weakEvents . WeakEventListener . addWeakEventListener ( {
43+ source : new observable . Observable ( ) ,
44+ target : { } ,
45+ handler : emptyHandler ,
46+ eventName : undefined
47+ } ) ;
48+ } ) ;
49+ }
50+
51+ export function test_addWeakEventListener_listensForEvent ( ) {
52+ var source = new observable . Observable ( ) ;
53+ var target = new Object ;
54+ var callbackCalled = false ;
55+ var handler = function ( args : observable . EventData ) {
56+ callbackCalled = true ;
57+ }
58+
59+ weakEvents . WeakEventListener . addWeakEventListener ( {
60+ source : source ,
61+ target : target ,
62+ handler : handler ,
63+ eventName : observable . Observable . propertyChangeEvent
64+ } )
65+
66+ source . set ( "testProp" , "some value" ) ;
67+
68+ TKUnit . assert ( callbackCalled , "Handler not called." ) ;
69+ }
70+
71+ export function test_removeWeakEventListener_StopsListeningForEvet ( ) {
72+ var source = new observable . Observable ( ) ;
73+ var target = new Object ;
74+ var callbackCalled = false ;
75+ var handler = function ( args : observable . EventData ) {
76+ callbackCalled = true ;
77+ }
78+
79+ var listenerID = weakEvents . WeakEventListener . addWeakEventListener ( {
80+ source : source ,
81+ target : target ,
82+ handler : handler ,
83+ eventName : observable . Observable . propertyChangeEvent
84+ } )
85+
86+ weakEvents . WeakEventListener . removeWeakEventListener ( listenerID ) ;
87+
88+ source . set ( "testProp" , "some value" ) ;
89+ TKUnit . assert ( ! callbackCalled , "Handler should not be called." ) ;
90+ }
91+
92+ export function test_handlerIsCalled_WithTargetAsThis ( ) {
93+ var source = new observable . Observable ( ) ;
94+ var target = new Object ;
95+ var callbackCalled = false ;
96+ var handler = function ( args : observable . EventData ) {
97+ TKUnit . assertEqual ( this , target , "this should be the target" ) ;
98+ callbackCalled = true ;
99+ }
100+
101+ weakEvents . WeakEventListener . addWeakEventListener ( {
102+ source : source ,
103+ target : target ,
104+ handler : handler ,
105+ eventName : observable . Observable . propertyChangeEvent
106+ } )
107+
108+ source . set ( "testProp" , "some value" ) ;
109+ TKUnit . assert ( callbackCalled , "Handler not called." ) ;
110+ }
111+
112+ export function test_listnerDoesNotRetainTarget ( ) {
113+ var source = new observable . Observable ( ) ;
114+ var target = new Object ;
115+ var callbackCalled = false ;
116+ var handler = function ( args : observable . EventData ) {
117+ TKUnit . assertEqual ( this , target , "this should be the target" ) ;
118+ callbackCalled = true ;
119+ }
120+
121+ weakEvents . WeakEventListener . addWeakEventListener ( {
122+ source : source ,
123+ target : target ,
124+ handler : handler ,
125+ eventName : observable . Observable . propertyChangeEvent
126+ } )
127+
128+ var targetRef = new WeakRef ( target ) ;
129+ target = undefined ;
130+ helper . forceGC ( ) ;
131+
132+ TKUnit . assert ( ! targetRef . get ( ) , "Target should be released after GC" ) ;
133+ }
134+
135+ export function test_listnerDoesNotRetainSource ( ) {
136+ var source = new observable . Observable ( ) ;
137+ var target = new Object ( ) ;
138+ var callbackCalled = false ;
139+ var handler = function ( args : observable . EventData ) {
140+ TKUnit . assertEqual ( this , target , "this should be the target" ) ;
141+ callbackCalled = true ;
142+ }
143+
144+ weakEvents . WeakEventListener . addWeakEventListener ( {
145+ source : source ,
146+ target : target ,
147+ handler : handler ,
148+ eventName : observable . Observable . propertyChangeEvent
149+ } )
150+
151+ var sourceRef = new WeakRef ( source ) ;
152+ source = undefined ;
153+ helper . forceGC ( ) ;
154+
155+ TKUnit . assert ( ! sourceRef . get ( ) , "Source should be released after GC" ) ;
156+ }
157+
158+ export function test_listnerIsCleared_WhenTargetIsDead ( ) {
159+ var source = new observable . Observable ( ) ;
160+
161+ var listenerID = addListenerWithSource ( source ) ;
162+ helper . forceGC ( ) ;
163+
164+ for ( var i = 0 ; i < weakEvents . WeakEventListener . cleanDeadReferencesCountTrigger ; i ++ ) {
165+ addListenerWithSource ( source ) ;
166+ }
167+
168+ TKUnit . assert ( types . isUndefined ( weakEvents . WeakEventListener . _weakEventListeners [ listenerID ] ) , "The first listener should be dead by now" ) ;
169+ }
170+
171+ export function test_listnerIsCleared_WhenSourceIsDead ( ) {
172+ var target = { } ;
173+
174+ var listenerID = addListenerWithTarget ( target ) ;
175+ helper . forceGC ( ) ;
176+
177+ for ( var i = 0 ; i < weakEvents . WeakEventListener . cleanDeadReferencesCountTrigger ; i ++ ) {
178+ addListenerWithTarget ( target ) ;
179+ }
180+
181+ TKUnit . assert ( types . isUndefined ( weakEvents . WeakEventListener . _weakEventListeners [ listenerID ] ) , "The first listener should be dead by now" ) ;
182+ }
183+
184+ function addListenerWithSource ( source : observable . Observable ) : number {
185+ return weakEvents . WeakEventListener . addWeakEventListener ( {
186+ source : source ,
187+ target : { } ,
188+ handler : emptyHandler ,
189+ eventName : observable . Observable . propertyChangeEvent
190+ } )
191+ }
192+
193+ function addListenerWithTarget ( target : any ) : number {
194+ return weakEvents . WeakEventListener . addWeakEventListener ( {
195+ source : new observable . Observable ( ) ,
196+ target : target ,
197+ handler : emptyHandler ,
198+ eventName : observable . Observable . propertyChangeEvent
199+ } )
200+ }
201+
202+ function emptyHandler ( data : observable . EventData ) {
203+ // Do nothing.
204+ }
0 commit comments