// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library HistoryTest;

import 'package:expect/legacy/async_minitest.dart'; // ignore: deprecated_member_use
import 'dart:html';
import 'dart:async';

main() {
  var expectation = History.supportsState ? returnsNormally : throws;

  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);
  });
}
