구문 분석기가 문자열을 허용 할 수 있는지 여부를 검사하는 matcher를 정의하려고합니다. 나는 그랬지만 기분이 좋지 않았다.unittest에 대한 "accept"및 "notAccept"정규 표현식을 정의하는 더 나은 방법
다트 유닛 테스트 코드 :
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>"));
});
});
}
사용자 정의 정합 :
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;
}
}
당신은 내가 두 정합 기 NotAcceptMatcher
및 AcceptMatcher
을 정의해야 볼 수 있습니다. 논리는 꽤 비슷하지만 간단하게 만드는 방법을 모르겠습니다.
더 간단한 해결책이 있습니까? 그렇지 않을 수도
Matcher notAccept(String s) => isNot(accept(s));
expect(parser.paramType(), notAccept("#"));
설명을 :