// Copyright (c) 2014, 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 'package:expect/expect.dart'; enum Enum1 { _ } enum Enum2 { A } enum Enum3 { B, C } // Don't format to preserve the trailing comma. // dart format off enum Enum4 { D, E, } // dart format on enum Enum5 { F, G, H } enum _Enum6 { I, _J } enum _IsNot { IsNot } enum NamedName { name, address } // Regression test for https://github.com/dart-lang/sdk/issues/33348 enum JSFunctionPrototype { length, prototype, __proto__, arguments, caller, callee, name, constructor, apply, bind, call, } void expectIs(T t, bool Function(Object?) test) { Object? obj = t; Expect.isTrue(test(obj), '$obj is $T'); Expect.isFalse(obj is _IsNot, '$obj is _IsNot'); // test cast t = obj as T; Expect.throwsTypeError(() => obj as _IsNot, '$obj as _IsNot'); } main() { expectIs(Enum1._, (e) => e is Enum1); expectIs(Enum2.A, (e) => e is Enum2); expectIs(Enum3.B, (e) => e is Enum3); expectIs(Enum4.E, (e) => e is Enum4); expectIs(Enum5.G, (e) => e is Enum5); Expect.equals('Enum1._', Enum1._.toString()); Expect.equals(0, Enum1._.index); Expect.listEquals([Enum1._], Enum1.values); Enum1.values.forEach(test1); Expect.equals('Enum2.A', Enum2.A.toString()); Expect.equals(0, Enum2.A.index); Expect.listEquals([Enum2.A], Enum2.values); Expect.identical(const [Enum2.A], Enum2.values); Enum2.values.forEach(test2); Expect.equals('Enum3.B', Enum3.B.toString()); Expect.equals('Enum3.C', Enum3.C.toString()); Expect.equals(0, Enum3.B.index); Expect.equals(1, Enum3.C.index); Expect.listEquals([Enum3.B, Enum3.C], Enum3.values); Enum3.values.forEach(test3); Expect.equals('Enum4.D', Enum4.D.toString()); Expect.equals('Enum4.E', Enum4.E.toString()); Expect.equals(0, Enum4.D.index); Expect.equals(1, Enum4.E.index); Expect.listEquals([Enum4.D, Enum4.E], Enum4.values); Enum4.values.forEach(test4); Expect.equals('Enum5.F', Enum5.F.toString()); Expect.equals('Enum5.G', Enum5.G.toString()); Expect.equals('Enum5.H', Enum5.H.toString()); Expect.equals(0, Enum5.F.index); Expect.equals(1, Enum5.G.index); Expect.equals(2, Enum5.H.index); Expect.listEquals([Enum5.F, Enum5.G, Enum5.H], Enum5.values); Enum5.values.forEach(test5); Expect.equals('_Enum6.I', _Enum6.I.toString()); Expect.equals('_Enum6._J', _Enum6._J.toString()); for (var value in JSFunctionPrototype.values) { expectIs(value, (e) => e is JSFunctionPrototype); } Expect.equals(JSFunctionPrototype.length, JSFunctionPrototype.values[0]); // Enums implement Enum. Expect.type(Enum1._); Enum enumValue = Enum1._; Expect.equals(0, enumValue.index); // Enum.compareByIndex orders enums correctly. var enumValues = [Enum5.G, Enum5.H, Enum5.F]; for (var i = 0; i < 10; i++) { enumValues.sort(Enum.compareByIndex); enumValues.fold(-1, (previousValue, element) { Expect.isTrue(previousValue < element.index, "$enumValues"); return element.index; }); enumValues.shuffle(); } // Can be used at the type `Enum` to compare different enums. Expect.isTrue(Enum.compareByIndex(Enum4.D, Enum5.H) < 0); Expect.isTrue(Enum.compareByIndex(Enum4.E, Enum5.F) > 0); Expect.isTrue(Enum.compareByIndex(Enum4.D, Enum5.F) == 0); Expect.equals("A", Enum2.A.name); Expect.equals("_", Enum1._.name); Expect.equals("name", EnumName(NamedName.name).name); Expect.identical(Enum2.A, Enum2.values.byName("A")); Expect.identical(Enum1._, Enum1.values.byName("_")); Expect.identical(NamedName.name, NamedName.values.byName("name")); var map = NamedName.values.asNameMap(); Expect.type>(map); Expect.identical(NamedName.name, map["name"]); Expect.identical(NamedName.address, map["address"]); } test1(Enum1 e) { int index; switch (e) { case Enum1._: index = 0; break; } Expect.equals(e.index, index); } test2(Enum2 e) { int index; switch (e) { case Enum2.A: index = 0; break; } Expect.equals(e.index, index); } test3(Enum3 e) { int index; switch (e) { case Enum3.C: index = 1; break; case Enum3.B: index = 0; break; } Expect.equals(e.index, index); } test4(Enum4 e) { int index; switch (e) { case Enum4.D: index = 0; break; case Enum4.E: index = 1; break; } Expect.equals(e.index, index); } test5(Enum5 e) { int index; switch (e) { case Enum5.H: index = 2; break; case Enum5.F: index = 0; break; case Enum5.G: index = 1; break; } Expect.equals(e.index, index); }