WeakEvents with map

This commit is contained in:
vakrilov
2015-05-15 16:55:02 +03:00
parent 54f6c350de
commit 57171c768e
8 changed files with 251 additions and 302 deletions

View File

@@ -225,6 +225,7 @@ export function forceGC() {
if (platform.device.os === platform.platformNames.ios) {
// Could cause GC on the next call.
new ArrayBuffer(4 * 1024 * 1024);
TKUnit.wait(ASYNC);
}
utils.GC();
}

View File

@@ -4,89 +4,64 @@ import observable = require("data/observable");
import weakEvents = require("ui/core/weak-event-listener");
import helper = require("./ui/helper");
class Target {
public counter: number = 0;
public onEvent(data: observable.EventData) {
this.counter++;
}
}
export function test_addWeakEventListener_throwsWhenCalledwitnInvalid_source() {
TKUnit.assertThrows(() => {
weakEvents.WeakEventListener.addWeakEventListener({
source: undefined,
target: {},
handler: emptyHandler,
eventName: observable.Observable.propertyChangeEvent
});
weakEvents.addWeakEventListener(undefined, "eventName", emptyHandler, {});
});
}
export function test_addWeakEventListener_throwsWhenCalledwitnInvalid_target() {
TKUnit.assertThrows(() => {
weakEvents.WeakEventListener.addWeakEventListener({
source: new observable.Observable(),
target: undefined,
handler: emptyHandler,
eventName: observable.Observable.propertyChangeEvent
});
weakEvents.addWeakEventListener(new observable.Observable(), "eventName", emptyHandler, undefined);
});
}
export function test_addWeakEventListener_throwsWhenCalledwitnInvalid_handler() {
TKUnit.assertThrows(() => {
weakEvents.WeakEventListener.addWeakEventListener({
source: new observable.Observable(),
target: {},
handler: undefined,
eventName: observable.Observable.propertyChangeEvent
});
weakEvents.addWeakEventListener(new observable.Observable(), "eventName", undefined, {});
});
}
export function test_addWeakEventListener_throwsWhenCalledwitnInvalid_name() {
TKUnit.assertThrows(() => {
weakEvents.WeakEventListener.addWeakEventListener({
source: new observable.Observable(),
target: {},
handler: emptyHandler,
eventName: undefined
});
weakEvents.addWeakEventListener(new observable.Observable(), undefined, emptyHandler, {});
});
}
export function test_addWeakEventListener_listensForEvent() {
var source = new observable.Observable();
var target = new Object;
var callbackCalled = false;
var handler = function (args: observable.EventData) {
callbackCalled = true;
}
var target = new Target();
weakEvents.WeakEventListener.addWeakEventListener({
source: source,
target: target,
handler: handler,
eventName: observable.Observable.propertyChangeEvent
})
weakEvents.addWeakEventListener(
source,
observable.Observable.propertyChangeEvent,
target.onEvent,
target);
helper.forceGC();
source.set("testProp", "some value");
TKUnit.assert(callbackCalled, "Handler not called.");
TKUnit.assertEqual(target.counter, 1, "Handler not called.");
}
export function test_removeWeakEventListener_StopsListeningForEvet() {
var source = new observable.Observable();
var target = new Object;
var callbackCalled = false;
var handler = function (args: observable.EventData) {
callbackCalled = true;
}
var target = new Target();
var listenerID = weakEvents.WeakEventListener.addWeakEventListener({
source: source,
target: target,
handler: handler,
eventName: observable.Observable.propertyChangeEvent
})
weakEvents.WeakEventListener.removeWeakEventListener(listenerID);
weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target);
weakEvents.removeWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target)
source.set("testProp", "some value");
TKUnit.assert(!callbackCalled, "Handler should not be called.");
TKUnit.assertEqual(target.counter, 0, "Handler should not be called.");
}
export function test_handlerIsCalled_WithTargetAsThis() {
@@ -98,12 +73,7 @@ export function test_handlerIsCalled_WithTargetAsThis() {
callbackCalled = true;
}
weakEvents.WeakEventListener.addWeakEventListener({
source: source,
target: target,
handler: handler,
eventName: observable.Observable.propertyChangeEvent
})
weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, handler, target);
source.set("testProp", "some value");
TKUnit.assert(callbackCalled, "Handler not called.");
@@ -111,19 +81,10 @@ export function test_handlerIsCalled_WithTargetAsThis() {
export function test_listnerDoesNotRetainTarget() {
var source = new observable.Observable();
var target = new Object;
var target = new Target();
var callbackCalled = false;
var handler = function (args: observable.EventData) {
TKUnit.assertEqual(this, target, "this should be the target");
callbackCalled = true;
}
weakEvents.WeakEventListener.addWeakEventListener({
source: source,
target: target,
handler: handler,
eventName: observable.Observable.propertyChangeEvent
})
weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target);
var targetRef = new WeakRef(target);
target = undefined;
@@ -134,19 +95,10 @@ export function test_listnerDoesNotRetainTarget() {
export function test_listnerDoesNotRetainSource() {
var source = new observable.Observable();
var target = new Object();
var target = new Target();
var callbackCalled = false;
var handler = function (args: observable.EventData) {
TKUnit.assertEqual(this, target, "this should be the target");
callbackCalled = true;
}
weakEvents.WeakEventListener.addWeakEventListener({
source: source,
target: target,
handler: handler,
eventName: observable.Observable.propertyChangeEvent
})
weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target);
var sourceRef = new WeakRef(source);
source = undefined;
@@ -155,50 +107,74 @@ export function test_listnerDoesNotRetainSource() {
TKUnit.assert(!sourceRef.get(), "Source should be released after GC");
}
export function test_listnerIsCleared_WhenTargetIsDead() {
var source = new observable.Observable();
//export function test_listnerIsCleared_WhenTargetIsDead() {
// var source = new observable.Observable();
var listenerID = addListenerWithSource(source);
helper.forceGC();
// var listenerID = addListenerWithSource(source);
// helper.forceGC();
for (var i = 0; i < weakEvents.WeakEventListener.cleanDeadReferencesCountTrigger; i++) {
addListenerWithSource(source);
}
// for (var i = 0; i < weakEvents.cleanDeadReferencesCountTrigger; i++) {
// addListenerWithSource(source);
// }
TKUnit.assert(types.isUndefined(weakEvents.WeakEventListener._weakEventListeners[listenerID]), "The first listener should be dead by now");
}
// TKUnit.assert(types.isUndefined(weakEvents._weakEventListeners[listenerID]), "The first listener should be dead by now");
//}
export function test_listnerIsCleared_WhenSourceIsDead() {
var target = {};
//export function test_listnerIsCleared_WhenSourceIsDead() {
// var target = {};
var listenerID = addListenerWithTarget(target);
helper.forceGC();
// var listenerID = addListenerWithTarget(target);
// helper.forceGC();
for (var i = 0; i < weakEvents.WeakEventListener.cleanDeadReferencesCountTrigger; i++) {
addListenerWithTarget(target);
}
// for (var i = 0; i < weakEvents.cleanDeadReferencesCountTrigger; i++) {
// addListenerWithTarget(target);
// }
TKUnit.assert(types.isUndefined(weakEvents.WeakEventListener._weakEventListeners[listenerID]), "The first listener should be dead by now");
}
// TKUnit.assert(types.isUndefined(weakEvents._weakEventListeners[listenerID]), "The first listener should be dead by now");
//}
function addListenerWithSource(source: observable.Observable): number {
return weakEvents.WeakEventListener.addWeakEventListener({
source: source,
target: {},
handler: emptyHandler,
eventName: observable.Observable.propertyChangeEvent
})
}
//function addListenerWithSource(source: observable.Observable): number {
// return weakEvents.addWeakEventListener({
// source: source,
// target: {},
// handler: emptyHandler,
// eventName: observable.Observable.propertyChangeEvent
// })
//}
function addListenerWithTarget(target: any): number {
return weakEvents.WeakEventListener.addWeakEventListener({
source: new observable.Observable(),
target: target,
handler: emptyHandler,
eventName: observable.Observable.propertyChangeEvent
})
}
//function addListenerWithTarget(target: any): number {
// return weakEvents.addWeakEventListener({
// source: new observable.Observable(),
// target: target,
// handler: emptyHandler,
// eventName: observable.Observable.propertyChangeEvent
// })
//}
function emptyHandler(data: observable.EventData) {
// Do nothing.
}
}
export function testWeakMap(): void {
var source = new observable.Observable();
var target = new Target();
var targetRef = new WeakRef(target);
var weakMap = new WeakMap<observable.Observable, Target>();
weakMap.set(source, target);
TKUnit.assertEqual(weakMap.get(source), target, "target");
target = undefined;
source = undefined;
helper.forceGC();
TKUnit.wait(1);
TKUnit.waitUntilReady(function () {
return false;
})
TKUnit.assert(!targetRef.get(), "Target should be dead");
}