// 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:async_helper/async_minitest.dart';
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);
  });
}
