library NativeGCTest;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/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.nodes.add(testDiv);
    window.onMessage.listen((e) {
      if (e.data == message) testDiv.click();
    });

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

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

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