library CrossFrameTest;

import 'package:unittest/unittest.dart';
import 'package:unittest/html_config.dart';
import 'dart:html';

main() {
  useHtmlConfiguration();

  var isWindowBase = predicate((x) => x is WindowBase, 'is a WindowBase');
  var isWindow = predicate((x) => x is Window, 'is a Window');
  var isLocationBase = predicate((x) => x is LocationBase, 'is a LocationBase');
  var isLocation = predicate((x) => x is Location, 'is a Location');
  var isHistoryBase = predicate((x) => x is HistoryBase, 'is a HistoryBase');
  var isHistory = predicate((x) => x is History, 'is a History');

  final iframe = new Element.tag('iframe');
  document.body.append(iframe);

  test('window', () {
    expect(window, isWindow);
    expect(window.document, document);
  });

  test('iframe', () {
    final frameWindow = iframe.contentWindow;
    expect(frameWindow, isWindowBase);
    //TODO(gram) The next test should be written as:
    //    expect(frameWindow, isNot(isWindow));
    // but that will cause problems now until is/is! work
    // properly in dart2js instead of always returning true.
    expect(frameWindow is! Window, isTrue);
    expect(frameWindow.parent, isWindow);

    // Ensure that the frame's document is inaccessible via window.
    expect(() => frameWindow.document, throws);
  });

  test('contentDocument', () {
    // Ensure that the frame's document is inaccessible.
    expect(() => iframe.contentDocument, throws);
  });

  test('location', () {
    expect(window.location, isLocation);
    final frameLocation = iframe.contentWindow.location;
    expect(frameLocation, isLocationBase);
    // TODO(gram) Similar to the above, the next test should be:
    //     expect(frameLocation, isNot(isLocation));
    expect(frameLocation is! Location, isTrue);

    expect(() => frameLocation.href, throws);
    expect(() => frameLocation.hash, throws);

    final frameParentLocation = iframe.contentWindow.parent.location;
    expect(frameParentLocation, isLocation);
  });

  test('history', () {
    expect(window.history, isHistory);
    final frameHistory = iframe.contentWindow.history;
    expect(frameHistory, isHistoryBase);
    // See earlier comments.
    //expect(frameHistory, isNot(isHistory));
    expect(frameHistory is! History, isTrue);

    // Valid methods.
    frameHistory.forward();

    expect(() => frameHistory.length, throws);

    final frameParentHistory = iframe.contentWindow.parent.history;
    expect(frameParentHistory, isHistory);
  });
}
