import 'package:sky/widgets.dart';
import 'package:test/test.dart';

import 'build_utils.dart';

void main() {
  test('Global keys notify add and remove', () {
    GlobalKey globalKey = new GlobalKey();
    Container container;

    bool syncListenerCalled = false;
    bool removeListenerCalled = false;

    void syncListener(GlobalKey key, Widget widget) {
      syncListenerCalled = true;
      expect(key, equals(globalKey));
      expect(container, isNotNull);
      expect(widget, equals(container));
    }

    void removeListener(GlobalKey key) {
      removeListenerCalled = true;
      expect(key, equals(globalKey));
    }

    WidgetTester tester = new WidgetTester();

    GlobalKey.registerSyncListener(globalKey, syncListener);
    GlobalKey.registerRemoveListener(globalKey, removeListener);
    tester.pumpFrame(() {
      container = new Container(key: globalKey);
      return container;
    });
    expect(syncListenerCalled, isTrue);
    expect(removeListenerCalled, isFalse);

    syncListenerCalled = false;
    removeListenerCalled = false;
    tester.pumpFrame(() => new Container());
    expect(syncListenerCalled, isFalse);
    expect(removeListenerCalled, isTrue);

    syncListenerCalled = false;
    removeListenerCalled = false;
    GlobalKey.unregisterSyncListener(globalKey, syncListener);
    GlobalKey.unregisterRemoveListener(globalKey, removeListener);
    tester.pumpFrame(() {
      container = new Container(key: globalKey);
      return container;
    });
    expect(syncListenerCalled, isFalse);
    expect(removeListenerCalled, isFalse);

    tester.pumpFrame(() => new Container());
    expect(syncListenerCalled, isFalse);
    expect(removeListenerCalled, isFalse);
  });

  test('Global key reparenting', () {
    GlobalKey globalKey = new GlobalKey();

    bool syncListenerCalled = false;
    bool removeListenerCalled = false;

    void syncListener(GlobalKey key, Widget widget) {
      syncListenerCalled = true;
    }

    void removeListener(GlobalKey key) {
      removeListenerCalled = true;
    }

    GlobalKey.registerSyncListener(globalKey, syncListener);
    GlobalKey.registerRemoveListener(globalKey, removeListener);
    WidgetTester tester = new WidgetTester();

    tester.pumpFrame(() {
      return new Container(
        child: new Container(
          key: globalKey
        )
      );
    });
    expect(syncListenerCalled, isTrue);
    expect(removeListenerCalled, isFalse);

    tester.pumpFrame(() {
      return new Container(
        key: globalKey,
        child: new Container()
      );
    });
    expect(syncListenerCalled, isTrue);
    expect(removeListenerCalled, isFalse);

    tester.pumpFrame(() {
      return new Container(
        child: new Container(
          key: globalKey
        )
      );
    });
    expect(syncListenerCalled, isTrue);
    expect(removeListenerCalled, isFalse);

    GlobalKey.unregisterSyncListener(globalKey, syncListener);
    GlobalKey.unregisterRemoveListener(globalKey, removeListener);
  });

  test('Global key mutate during iteration', () {
    GlobalKey globalKey = new GlobalKey();

    bool syncListenerCalled = false;
    bool removeListenerCalled = false;

    void syncListener(GlobalKey key, Widget widget) {
      GlobalKey.unregisterSyncListener(globalKey, syncListener);
      syncListenerCalled = true;
    }

    void removeListener(GlobalKey key) {
      GlobalKey.unregisterRemoveListener(globalKey, removeListener);
      removeListenerCalled = true;
    }

    GlobalKey.registerSyncListener(globalKey, syncListener);
    GlobalKey.registerRemoveListener(globalKey, removeListener);
    WidgetTester tester = new WidgetTester();

    tester.pumpFrame(() {
      return new Container(key: globalKey);
    });
    expect(syncListenerCalled, isTrue);
    expect(removeListenerCalled, isFalse);

    syncListenerCalled = false;
    removeListenerCalled = false;
    tester.pumpFrame(() {
      return new Container();
    });
    expect(syncListenerCalled, isFalse);
    expect(removeListenerCalled, isTrue);

    syncListenerCalled = false;
    removeListenerCalled = false;
    tester.pumpFrame(() {
      return new Container(key: globalKey);
    });
    expect(syncListenerCalled, isFalse);
    expect(removeListenerCalled, isFalse);

  });
}
