library NativeGCTest;

import 'package:unittest/unittest.dart';
import 'package:unittest/html_config.dart';
import 'dart:html';

var testEvent = new EventStreamProvider<Event>('test');

main() {
  useHtmlConfiguration();

  test('EventListener', () {
    final int N = 1000000;
    final int M = 1000;

    var div;
    for (int i = 0; i < M; ++i) {
      // This memory should be freed when the listener below is
      // collected.
      List l = new List(N);

      // Record the iteration number.
      l[N - 1] = i;

      div = new Element.tag('div');
      testEvent.forTarget(div).listen((_) {
        // Only the final iteration's listener should be invoked.
        // Note: the reference to l keeps the entire list alive.
        expect(l[N - 1], M - 1);
      });
    }

    final event = new Event('test');
    div.dispatchEvent(event);
  });

  test('WindowEventListener', () {
    String message = 'WindowEventListenerTestPingMessage';

    Element testDiv = new DivElement();
    testDiv.id = '#TestDiv';
    document.body.append(testDiv);
    window.onMessage.listen((e) {
      if (e.data == message) testDiv.click();
    });

    for (int i = 0; i < 100; ++i) {
      triggerMajorGC();
    }

    testDiv.onClick.listen(expectAsync((e) {}));
    window.postMessage(message, '*');
  });
}

void triggerMajorGC() {
  List list = new List(1000000);
  Element div = new DivElement();
  div.onClick.listen((e) => print(list[0]));
}
