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

// @dart = 2.9

@JS()
library js_typed_interop_anonymous_test;

import 'package:js/js.dart';
import 'package:expect/minitest.dart';

@JS()
@anonymous
class Literal {
  external factory Literal({int x, String y, num z});

  external set x(int v);
  external int get x;
  external String get y;
  external num get z;
}

class MockLiteral implements Literal {
  int _v = 0;
  set x(int v) {
    _v = v;
  }

  int get x => _v;
  String get y => "";
  num get z => 1;
}

main() {
  test('simple', () {
    var l = new Literal(x: 3, y: "foo");
    expect(l.x, equals(3));
    expect(l.y, equals("foo"));
    expect(l.z, isNull);
  });

  test('mock', () {
    Literal l = new MockLiteral();
    expect(l.x, equals(0));
    l.x = 3;
    expect(l.x, equals(3));
    expect(l.y, equals(""));
    expect(l.z, equals(1));
  });

  // Test that instance checks behave appropriately.
  test('Instance checks: implements', () {
    Object l = new Literal(x: 3, y: "foo");
    Object m = new MockLiteral();
    expect(m is Literal, isTrue);
    expect(m is MockLiteral, isTrue);
    expect(l is Literal, isTrue);
    expect(l is MockLiteral, isFalse);
  });

  // Test that casts behave appropriately.
  test('Casts: implements', () {
    Object l = new Literal(x: 3, y: "foo");
    Object m = new MockLiteral();
    expect(m as Literal, equals(m));
    expect(m as MockLiteral, equals(m));
    expect(l as Literal, equals(l));
    expect(() => l as MockLiteral, throws);
  });
}
