// Copyright (c) 2017, 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.

import 'dart:async';
import 'dart:html';

import 'package:expect/minitest.dart';

class Mock {
  noSuchMethod(Invocation i) {
    if (this is Window) return document;
    if (this is FileList) return new MockFile();
    return null;
  }
}

@proxy
class MockBodyElement extends Mock implements BodyElement {
  Node append(Node e) => e;
}

class _EventListeners {
  Stream<Event> get onBlur => new Stream.fromIterable([]);
}

@proxy
class MockHtmlDocument extends Mock
    with _EventListeners
    implements HtmlDocument {
  BodyElement get body => new MockBodyElement();
}

@proxy
class MockWindow extends Mock with _EventListeners implements Window {
  Stream<Event> get onBeforeUnload => new Stream.fromIterable([]);

  String name = "MOCK_NAME";
}

@proxy
class MockLocation extends Mock implements Location {
  String href = "MOCK_HREF";
}

@proxy
class MockFileList extends Mock implements FileList {}

@proxy
class MockFile extends Mock implements File {}

main() {
  test('is', () {
    var win = new MockWindow();
    expect(win is Window, isTrue);
  });

  test('getter', () {
    var win = new MockWindow();
    expect(win.document, equals(document));
  });

  test('override', () {
    Window win = new MockWindow();
    expect(win.onBeforeUnload != null, isTrue);
    expect(win.name, equals("MOCK_NAME"));
  });

  test('override', () {
    var loc1 = new MockLocation();
    Location loc2 = loc1;
    dynamic loc3 = loc1;
    expect(loc1.href, equals("MOCK_HREF"));
    loc1.href = "RESET";
    expect(loc2.href, equals("RESET"));
    loc2.href = "RESET2";
    expect(loc3.href, equals("RESET2"));
  });

  test('method', () {
    HtmlDocument doc = new MockHtmlDocument();
    expect(doc.body.append(null), equals(null));
  });

  test('mixin', () {
    Window win = new MockWindow();
    expect(win.onBlur is Stream, isTrue, reason: 'onBlur should be a stream');
    HtmlDocument doc = new MockHtmlDocument();
    expect(doc.onBlur is Stream, isTrue, reason: 'onBlur should be a stream');
  });

  test('operator', () {
    var fileList = new MockFileList();
    expect(fileList[1] is File, isTrue);
  });
}
