// Copyright (c) 2016, 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 jsTest;

import 'dart:html';

import 'package:unittest/unittest.dart';
import 'package:unittest/html_individual_config.dart';
import 'package:expect/expect.dart' show NoInline, AssumeDynamic;

import 'js_type_test_lib.dart';

class Bar {}

@NoInline() @AssumeDynamic()
confuse(x) => x;

class Is<T> {
  const Is();
  check(o) => o is T;
}

main() {
  useHtmlIndividualConfiguration();

  new Is<Foo>().check(new Bar());  // Bar is instantiated by this code.
  new Is<Foo>().check([]);
  new Is<List>().check([]);

  group('static', () {
    test('not-String', () {
      Foo e = new Foo();
      expect(e is String, isFalse);
    });

    test('not-int', () {
      Foo e = new Foo();
      expect(e is int, isFalse);
    });

    test('not-Null', () {
      Foo e = new Foo();
      expect(e is Null, isFalse);
    });

    test('not-Bar', () {
      Foo e = new Foo();
      expect(e is Bar, isFalse);
    });

    test('is-Foo', () {
      Foo e = new Foo();
      expect(e is Foo, isTrue);
    });

    test('String-not-Foo', () {
      String e = 'hello';
      expect(e is Foo, isFalse);
    });
  });

  group('dynamic', () {
    test('not-String', () {
      var e = confuse(new Foo());
      expect(e is String, isFalse);
    });

    test('not-int', () {
      var e = confuse(new Foo());
      expect(e is int, isFalse);
    });

    test('not-Null', () {
      var e = confuse(new Foo());
      expect(e is Null, isFalse);
    });

    test('not-Bar', () {
      var e = confuse(new Foo());
      expect(e is Bar, isFalse);
    });

    test('is-Foo', () {
      var e = confuse(new Foo());
      expect(e is Foo, isTrue);
    });
  });

  group('dynamic-String-not-Foo', () {
    test('test', () {
      var e = confuse('hello');
      expect(e is Foo, isFalse);
    });
  });

  group('dynamic-null-not-Foo', () {
    test('test', () {
      var e = confuse(null);
      expect(e is Foo, isFalse);
    });
  });

  group('dynamic-type', () {
    test('not-String', () {
      var e = confuse(new Foo());
      expect(const Is<String>().check(e), isFalse);
    });

    test('not-int', () {
      var e = confuse(new Foo());
      expect(const Is<int>().check(e), isFalse);
    });

    test('not-Null', () {
      var e = confuse(new Foo());
      expect(const Is<Null>().check(e), isFalse);
    });

    test('not-Bar', () {
      var e = confuse(new Foo());
      expect(const Is<Bar>().check(e), isFalse);
    });

    test('is-Foo', () {
      var e = confuse(new Foo());
      expect(const Is<Foo>().check(e), isTrue);
    });
  });

  group('dynamic-String-not-dynamic-Foo', () {
    test('test', () {
      var e = confuse('hello');
      expect(const Is<Foo>().check(e), isFalse);
    });
  });

  group('dynamic-null-not-dynamic-Foo', () {
    test('test', () {
      var e = confuse(null);
      expect(const Is<Foo>().check(e), isFalse);
    });
  });

}
