| // Copyright (c) 2017, 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; | |
| /// An expectation represents the expected outcome of a test (or if it should | |
| /// be skipped). | |
| /// | |
| /// An expectation belongs to a group, for example, [ExpectationGroup.Fail]. | |
| /// | |
| /// Each expectation group has a canonical expectation, defined below. You can | |
| /// use the canonical expectation instead of a more specific one. Note this | |
| /// isn't implemented yet. | |
| class Expectation { | |
| static const Expectation pass = Expectation("Pass", ExpectationGroup.pass); | |
| static const Expectation crash = Expectation("Crash", ExpectationGroup.crash); | |
| static const Expectation timeout = Expectation( | |
| "Timeout", | |
| ExpectationGroup.timeout, | |
| ); | |
| static const Expectation fail = Expectation("Fail", ExpectationGroup.fail); | |
| static const Expectation skip = Expectation("Skip", ExpectationGroup.skip); | |
| final String name; | |
| final ExpectationGroup group; | |
| const new(this.name, this.group); | |
| /// Returns the canonical expectation representing [group]. That is, one of | |
| /// the above expectations (except for `Meta` which returns `this`). | |
| Expectation get canonical => fromGroup(group) ?? this; | |
| @override | |
| String toString() => name; | |
| static Expectation? fromGroup(ExpectationGroup group) { | |
| switch (group) { | |
| case ExpectationGroup.crash: | |
| return Expectation.crash; | |
| case ExpectationGroup.fail: | |
| return Expectation.fail; | |
| case ExpectationGroup.meta: | |
| return null; | |
| case ExpectationGroup.pass: | |
| return Expectation.pass; | |
| case ExpectationGroup.skip: | |
| return Expectation.skip; | |
| case ExpectationGroup.timeout: | |
| return Expectation.timeout; | |
| } | |
| } | |
| } | |
| class ExpectationSet { | |
| static const ExpectationSet defaultExpectations = ExpectationSet( | |
| <String, Expectation>{ | |
| "pass": Expectation.pass, | |
| "crash": Expectation.crash, | |
| "timeout": Expectation.timeout, | |
| "fail": Expectation.fail, | |
| "skip": Expectation.skip, | |
| "missingcompiletimeerror": Expectation( | |
| "MissingCompileTimeError", | |
| ExpectationGroup.fail, | |
| ), | |
| "missingruntimeerror": Expectation( | |
| "MissingRuntimeError", | |
| ExpectationGroup.fail, | |
| ), | |
| "runtimeerror": Expectation("RuntimeError", ExpectationGroup.fail), | |
| }, | |
| ); | |
| final Map<String, Expectation> internalMap; | |
| const new(this.internalMap); | |
| Expectation operator [](String name) { | |
| return internalMap[name.toLowerCase()] ?? | |
| (throw "No expectation named: '$name'."); | |
| } | |
| factory fromJsonList(List data) { | |
| Map<String, Expectation> internalMap = Map<String, Expectation>.from( | |
| defaultExpectations.internalMap, | |
| ); | |
| for (Map map in data) { | |
| String? name; | |
| String? group; | |
| map.cast<String, String>().forEach((key, value) { | |
| switch (key) { | |
| case "name": | |
| name = value; | |
| break; | |
| case "group": | |
| group = value; | |
| break; | |
| default: | |
| throw "Unrecognized key: '$key' in '$map'."; | |
| } | |
| }); | |
| if (name == null) { | |
| throw "No name provided in '$map'"; | |
| } | |
| if (group == null) { | |
| throw "No group provided in '$map'"; | |
| } | |
| Expectation expectation = Expectation(name!, groupFromString(group!)); | |
| name = name!.toLowerCase(); | |
| if (internalMap.containsKey(name)) { | |
| throw "Duplicated expectation name: '$name'."; | |
| } | |
| internalMap[name!] = expectation; | |
| } | |
| return ExpectationSet(internalMap); | |
| } | |
| } | |
| enum ExpectationGroup { crash, fail, meta, pass, skip, timeout } | |
| ExpectationGroup groupFromString(String name) { | |
| switch (name) { | |
| case "Crash": | |
| return ExpectationGroup.crash; | |
| case "Fail": | |
| return ExpectationGroup.fail; | |
| case "Meta": | |
| return ExpectationGroup.meta; | |
| case "Pass": | |
| return ExpectationGroup.pass; | |
| case "Skip": | |
| return ExpectationGroup.skip; | |
| case "Timeout": | |
| return ExpectationGroup.timeout; | |
| default: | |
| throw "Unrecognized group: '$name'."; | |
| } | |
| } |