// 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.

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