I want to define matchers to check if a parser can accept a string or not. I did it but not feeling good.
Dart unittest code:
library test_parser;
import 'package:unittest/unittest.dart';
import '../lib/shark_parser.dart';
main() {
SharkParser parser;
setUp(() {
parser = new SharkParser();
});
tearDown(() {
parser = null;
});
group("paramType parser", () {
test("should accept valid types", () {
expect(parser.paramType(), accept("String"));
expect(parser.paramType(), accept("int"));
expect(parser.paramType(), accept("List"));
expect(parser.paramType(), accept("List<User>"));
});
test("should not accept invalid types", () {
expect(parser.paramType(), notAccept("#"));
expect(parser.paramType(), notAccept("0"));
expect(parser.paramType(), notAccept("String()"));
expect(parser.paramType(), notAccept("List< User >"));
});
});
}
Custom matchers:
Matcher accept(String matchingString) => new AcceptMatcher(matchingString);
Matcher notAccept(String matchingString) => new NotAcceptMatcher(matchingString);
class NotAcceptMatcher extends Matcher {
String matchingString;
NotAcceptMatcher(this.matchingString);
bool matches(item, Map matchState) {
return !item.end().accept(matchingString);
}
Description describe(Description description) {
return description.add("parser not accept string: $matchingString");
}
Description describeMismatch(item, Description mismatchDescription,
Map matchState, bool verbose) {
mismatchDescription.add("accepts it");
return mismatchDescription;
}
}
class AcceptMatcher extends Matcher {
String matchingString;
AcceptMatcher(this.matchingString);
bool matches(item, Map matchState) {
return item.end().accept(matchingString);
}
Description describe(Description description) {
return description.add("parser accept string: $matchingString");
}
Description describeMismatch(item, Description mismatchDescription,
Map matchState, bool verbose) {
mismatchDescription.add("doesn't accept");
return mismatchDescription;
}
}
You can see I have to define two matchers NotAcceptMatcher
and AcceptMatcher
. The logic is pretty similar but I don't know how to make it simple.
Is there any other simpler solution to do it?