Tests - fixed

This commit is contained in:
vakrilov
2015-05-15 18:38:18 +03:00
parent 57171c768e
commit c3aea99078
3 changed files with 59 additions and 67 deletions

View File

@ -175,7 +175,12 @@ export function buildUIWithWeakRefAndInteract<T extends view.View>(createFunc: (
} }
sp.removeChild(weakRef.get()); sp.removeChild(weakRef.get());
forceGC(); if (newPage.ios) {
// Could cause GC on the next call.
// NOTE: Don't replace this with forceGC();
new ArrayBuffer(4 * 1024 * 1024);
}
utils.GC();
TKUnit.assert(!weakRef.get(), weakRef.get() + " leaked!"); TKUnit.assert(!weakRef.get(), weakRef.get() + " leaked!");
testFinished = true; testFinished = true;

View File

@ -1,5 +1,4 @@
import TKUnit = require("./TKUnit"); import TKUnit = require("./TKUnit");
import types = require("utils/types");
import observable = require("data/observable"); import observable = require("data/observable");
import weakEvents = require("ui/core/weak-event-listener"); import weakEvents = require("ui/core/weak-event-listener");
import helper = require("./ui/helper"); import helper = require("./ui/helper");
@ -53,6 +52,22 @@ export function test_addWeakEventListener_listensForEvent() {
TKUnit.assertEqual(target.counter, 1, "Handler not called."); TKUnit.assertEqual(target.counter, 1, "Handler not called.");
} }
export function test_addWeakEventListener_listensForEven_multipleTargetst() {
var source = new observable.Observable();
var target1 = new Target();
var target2 = new Target();
weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target1.onEvent, target1);
weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target2.onEvent, target2);
helper.forceGC();
source.set("testProp", "some value");
TKUnit.assertEqual(target1.counter, 1, "Handler not called.");
TKUnit.assertEqual(target2.counter, 1, "Handler not called.");
}
export function test_removeWeakEventListener_StopsListeningForEvet() { export function test_removeWeakEventListener_StopsListeningForEvet() {
var source = new observable.Observable(); var source = new observable.Observable();
var target = new Target(); var target = new Target();
@ -66,7 +81,7 @@ export function test_removeWeakEventListener_StopsListeningForEvet() {
export function test_handlerIsCalled_WithTargetAsThis() { export function test_handlerIsCalled_WithTargetAsThis() {
var source = new observable.Observable(); var source = new observable.Observable();
var target = new Object; var target = new Object();
var callbackCalled = false; var callbackCalled = false;
var handler = function (args: observable.EventData) { var handler = function (args: observable.EventData) {
TKUnit.assertEqual(this, target, "this should be the target"); TKUnit.assertEqual(this, target, "this should be the target");
@ -82,7 +97,6 @@ export function test_handlerIsCalled_WithTargetAsThis() {
export function test_listnerDoesNotRetainTarget() { export function test_listnerDoesNotRetainTarget() {
var source = new observable.Observable(); var source = new observable.Observable();
var target = new Target(); var target = new Target();
var callbackCalled = false;
weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target); weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target);
@ -96,7 +110,6 @@ export function test_listnerDoesNotRetainTarget() {
export function test_listnerDoesNotRetainSource() { export function test_listnerDoesNotRetainSource() {
var source = new observable.Observable(); var source = new observable.Observable();
var target = new Target(); var target = new Target();
var callbackCalled = false;
weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target); weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target);
@ -107,74 +120,43 @@ export function test_listnerDoesNotRetainSource() {
TKUnit.assert(!sourceRef.get(), "Source should be released after GC"); TKUnit.assert(!sourceRef.get(), "Source should be released after GC");
} }
//export function test_listnerIsCleared_WhenTargetIsDead() { export function test_handlerIsDetached_WhenAllListenersAreRemoved() {
// var source = new observable.Observable(); var source = new observable.Observable();
// var listenerID = addListenerWithSource(source); var target1 = new Target();
// helper.forceGC(); var target2 = new Target();
// for (var i = 0; i < weakEvents.cleanDeadReferencesCountTrigger; i++) { weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target1.onEvent, target1);
// addListenerWithSource(source); weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target2.onEvent, target2);
// }
// TKUnit.assert(types.isUndefined(weakEvents._weakEventListeners[listenerID]), "The first listener should be dead by now"); weakEvents.removeWeakEventListener(source, observable.Observable.propertyChangeEvent, target1.onEvent, target1)
//} weakEvents.removeWeakEventListener(source, observable.Observable.propertyChangeEvent, target2.onEvent, target2)
//export function test_listnerIsCleared_WhenSourceIsDead() { TKUnit.assert(!source.hasListeners(observable.Observable.propertyChangeEvent), "All events should be detached");
// var target = {}; }
// var listenerID = addListenerWithTarget(target); export function test_autoDetachingOfDeadReferences() {
// helper.forceGC(); var source = new observable.Observable();
// for (var i = 0; i < weakEvents.cleanDeadReferencesCountTrigger; i++) { for (var i = 0; i < 100; i++) {
// addListenerWithTarget(target); addListenerWithSource(source);
// } }
// TKUnit.assert(types.isUndefined(weakEvents._weakEventListeners[listenerID]), "The first listener should be dead by now"); helper.forceGC();
//}
//function addListenerWithSource(source: observable.Observable): number { var target = new Target();
// return weakEvents.addWeakEventListener({
// source: source,
// target: {},
// handler: emptyHandler,
// eventName: observable.Observable.propertyChangeEvent
// })
//}
//function addListenerWithTarget(target: any): number { weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target);
// return weakEvents.addWeakEventListener({ weakEvents.removeWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target)
// source: new observable.Observable(),
// target: target, TKUnit.assert(!source.hasListeners(observable.Observable.propertyChangeEvent), "All events should be detached");
// handler: emptyHandler, }
// eventName: observable.Observable.propertyChangeEvent
// }) function addListenerWithSource(source: observable.Observable) {
//} var target = new Target();
weakEvents.addWeakEventListener(source, observable.Observable.propertyChangeEvent, target.onEvent, target)
}
function emptyHandler(data: observable.EventData) { function emptyHandler(data: observable.EventData) {
// Do nothing. // 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");
}

View File

@ -1,5 +1,4 @@
import observable = require("data/observable"); import observable = require("data/observable");
import definition = require("ui/core/weak-event-listener");
import types = require("utils/types"); import types = require("utils/types");
var handlersForEventName = new Map<string,(eventData: observable.EventData) => void>(); var handlersForEventName = new Map<string,(eventData: observable.EventData) => void>();
@ -18,7 +17,7 @@ class TargetHandlerPair {
function getHandlerForEventName(eventName: string): (eventData: observable.EventData) => void { function getHandlerForEventName(eventName: string): (eventData: observable.EventData) => void {
var handler = handlersForEventName.get(eventName); var handler = handlersForEventName.get(eventName);
if (!handler) { if (!handler) {
var handler = function (eventData: observable.EventData) { handler = function (eventData: observable.EventData) {
var source = eventData.object; var source = eventData.object;
var sourceEventMap = sourcesMap.get(source); var sourceEventMap = sourcesMap.get(source);
if (!sourceEventMap) { if (!sourceEventMap) {
@ -83,21 +82,27 @@ function validateArgs(source: observable.Observable, eventName: string, handler:
export function addWeakEventListener(source: observable.Observable, eventName: string, handler: (eventData: observable.EventData) => void, target: any) { export function addWeakEventListener(source: observable.Observable, eventName: string, handler: (eventData: observable.EventData) => void, target: any) {
validateArgs(source, eventName, handler, target); validateArgs(source, eventName, handler, target);
var shouldAttach: boolean = false;
var sourceEventMap = sourcesMap.get(source); var sourceEventMap = sourcesMap.get(source);
if (!sourceEventMap) { if (!sourceEventMap) {
sourceEventMap = new Map<string, Array<TargetHandlerPair>>(); sourceEventMap = new Map<string, Array<TargetHandlerPair>>();
sourcesMap.set(source, sourceEventMap); sourcesMap.set(source, sourceEventMap);
shouldAttach = true;
} }
var pairList = sourceEventMap.get(eventName); var pairList = sourceEventMap.get(eventName);
if (!pairList) { if (!pairList) {
pairList = new Array<TargetHandlerPair>(); pairList = new Array<TargetHandlerPair>();
sourceEventMap.set(eventName, pairList); sourceEventMap.set(eventName, pairList);
shouldAttach = true;
} }
pairList.push(new TargetHandlerPair(target, handler)); pairList.push(new TargetHandlerPair(target, handler));
source.addEventListener(eventName, getHandlerForEventName(eventName)); if (shouldAttach) {
source.addEventListener(eventName, getHandlerForEventName(eventName));
}
} }
export function removeWeakEventListener(source: observable.Observable, eventName: string, handler: (eventData: observable.EventData) => void, target: any) { export function removeWeakEventListener(source: observable.Observable, eventName: string, handler: (eventData: observable.EventData) => void, target: any) {