library HistoryTest;
import 'package:unittest/unittest.dart';
import 'package:unittest/html_individual_config.dart';
import 'dart:html';
import 'dart:async';

main() {
  useHtmlIndividualConfiguration();

  group('supported_state', () {
    test('supportsState', () {
      expect(History.supportsState, true);
    });
  });

  group('supported_HashChangeEvent', () {
    test('supported', () {
      expect(HashChangeEvent.supported, true);
    });
  });

  var expectation = History.supportsState ? returnsNormally : throws;

  group('history', () {
    test('pushState', () {
      expect(() {
        window.history.pushState(null, document.title, '?dummy');
        var length = window.history.length;

        window.history.pushState(null, document.title, '?foo=bar');

        expect(window.location.href.endsWith('foo=bar'), isTrue);

      }, expectation);
    });

    test('pushState with data', () {
      expect(() {
        window.history.pushState({'one' : 1}, document.title, '?dummy');
        expect(window.history.state, equals({'one' : 1}));
        window.history.pushState(null, document.title, '?foo=bar');

        expect(window.location.href.endsWith('foo=bar'), isTrue);

      }, expectation);
    });

    test('back', () {
      expect(() {
        window.history.pushState(null, document.title, '?dummy1');
        window.history.pushState(null, document.title, '?dummy2');
        var length = window.history.length;

        expect(window.location.href.endsWith('dummy2'), isTrue);

        // Need to wait a frame or two to let the pushState events occur.
        new Timer(const Duration(milliseconds: 100), expectAsync(() {
          window.onPopState.first.then(expectAsync((_){
            expect(window.history.length, length);
            expect(window.location.href.endsWith('dummy1'), isTrue);
          }));

          window.history.back();
        }));
      }, expectation);
    });

    test('replaceState', () {
      expect(() {
        var length = window.history.length;

        window.history.replaceState(null, document.title, '?foo=baz');
        expect(window.history.length, length);
        expect(window.location.href.endsWith('foo=baz'), isTrue);
      }, expectation);
    });

    test('popstatevent', () {
      expect(() {
        var event = new Event.eventType('PopStateEvent', 'popstate');
        expect(event is PopStateEvent, true);
      }, expectation);
    });

    test('hashchangeevent', () {
      var expectation = HashChangeEvent.supported ? returnsNormally : throws;
      expect(() {
        var event = new HashChangeEvent('change', oldUrl:'old', newUrl: 'new');
        expect(event is HashChangeEvent, true);
        expect(event.oldUrl, 'old');
        expect(event.newUrl, 'new');
      }, expectation);
    });
  });
}
