| // Copyright (c) 2021, 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. |
| |
| final bool inSoundMode = <int?>[] is! List<int>; |
| |
| main() { |
| print('inSoundMode: $inSoundMode'); |
| testNoArgs(); |
| testArgs(); |
| } |
| |
| class Class1 { |
| Class1._(); |
| factory Class1() = Class1._; |
| } |
| |
| class Class2 { |
| Class2.__(); |
| factory Class2._() => Class2.__(); |
| factory Class2.named() = Class2._; |
| } |
| |
| testNoArgs() { |
| var f1a = Class1.new; |
| var c1a = f1a(); |
| expect(true, c1a is Class1); |
| |
| dynamic f1b = Class1.new; |
| var c1b = f1b(); |
| expect(true, c1b is Class1); |
| |
| expect(true, identical(f1a, f1b)); |
| |
| var f2a = Class2.named; |
| var c2a = f2a(); |
| expect(true, c2a is Class2); |
| |
| dynamic f2b = Class2.named; |
| var c2b = f2b(); |
| expect(true, c2b is Class2); |
| |
| expect(true, identical(f2a, f2b)); |
| } |
| |
| class Class3 { |
| final int field; |
| |
| Class3._(this.field); |
| factory Class3(int field) = Class3._; |
| } |
| |
| class Class4 { |
| final int? field; |
| |
| Class4._([this.field]); |
| factory Class4([int? field]) = Class4._; |
| } |
| |
| class Class5 { |
| final int field1; |
| final int? field2; |
| |
| Class5._(this.field1, [this.field2]); |
| factory Class5(int field1, [int? field2]) = Class5._; |
| } |
| |
| class Class6 { |
| final int field1; |
| final int? field2; |
| final int field3; |
| |
| Class6._(this.field1, {this.field2, required this.field3}); |
| factory Class6(int field1, {int? field2, required int field3}) = |
| Class6._; |
| } |
| |
| class Class7a implements Class7b { |
| Class7a(); |
| } |
| |
| class Class7b { |
| factory Class7b() = Class7a; |
| } |
| |
| class Class8a<T> implements Class8b<T> { |
| Class8a(); |
| } |
| |
| class Class8b<T> { |
| factory Class8b() = Class8a<T>; |
| } |
| |
| testArgs() { |
| var f3a = Class3.new; |
| var c3a = f3a(42); |
| expect(42, c3a.field); |
| () { |
| f3a(); // error |
| f3a(42, 87); // error |
| }; |
| |
| dynamic f3b = Class3.new; |
| var c3b = f3b(87); |
| expect(87, c3b.field); |
| throws(() => f3b()); |
| throws(() => f3b(42, 87)); |
| |
| var f4a = Class4.new; |
| var c4a = f4a(); |
| expect(null, c4a.field); |
| var c4b = f4a(42); |
| expect(42, c4b.field); |
| () { |
| f4a(42, 87); // error |
| }; |
| dynamic f4b = Class4.new; |
| throws(() => f4b(42, 87)); |
| |
| |
| var f5a = Class5.new; |
| var c5a = f5a(42); |
| expect(42, c5a.field1); |
| expect(null, c5a.field2); |
| var c5b = f5a(87, 42); |
| expect(87, c5b.field1); |
| expect(42, c5b.field2); |
| () { |
| f5a(); // error |
| f5a(42, 87, 123); // error |
| }; |
| dynamic f5b = Class5.new; |
| throws(() => f5b()); |
| throws(() => f5b(42, 87, 123)); |
| |
| var f6a = Class6.new; |
| var c6a = f6a(42, field3: 87); |
| expect(42, c6a.field1); |
| expect(null, c6a.field2); |
| expect(87, c6a.field3); |
| () { |
| f6a(); // error |
| f6a(42); // error |
| f6a(42, 87); // error |
| f6a(field1: 87, field2: 87); // error |
| }; |
| |
| var c6b = f6a(42, field2: 123, field3: 87); |
| expect(42, c6b.field1); |
| expect(123, c6b.field2); |
| expect(87, c6b.field3); |
| |
| var c6c = f6a(87, field3: 42, field2: 123); |
| expect(87, c6c.field1); |
| expect(123, c6c.field2); |
| expect(42, c6c.field3); |
| |
| dynamic f6b = Class6.new; |
| throws(() => f6b()); |
| throws(() => f6b(42), inSoundModeOnly: true); |
| throws(() => f6b(42, 87), inSoundModeOnly: true); |
| throws(() => f6b(field1: 87, field2: 87)); |
| |
| var f7a = Class7b.new; |
| var c7a = f7a(); |
| expect(true, c7a is Class7a); |
| expect(true, c7a is Class7b); |
| |
| var f8a = Class8b.new; |
| var c8a = f8a(); |
| expect(true, c8a is Class8a); |
| expect(true, c8a is Class8b); |
| var c8b = f8a<int>(); |
| expect(true, c8b is Class8a<int>); |
| expect(true, c8b is Class8b<int>); |
| expect(false, c8b is Class8b<String>); |
| } |
| |
| expect(expected, actual) { |
| if (expected != actual) throw 'Expected $expected, actual $actual'; |
| } |
| |
| throws(Function() f, {bool inSoundModeOnly: false}) { |
| try { |
| f(); |
| } catch (e) { |
| print('Thrown: $e'); |
| return; |
| } |
| if (!inSoundMode && inSoundModeOnly) { |
| return; |
| } |
| throw 'Expected exception'; |
| } |