131 lines
3.9 KiB
Dart
131 lines
3.9 KiB
Dart
import 'package:graphql_parser/graphql_parser.dart';
|
|
import 'package:test/test.dart';
|
|
import 'common.dart';
|
|
import 'argument_test.dart';
|
|
import 'directive_test.dart';
|
|
import 'fragment_spread_test.dart';
|
|
import 'selection_set_test.dart';
|
|
import 'value_test.dart';
|
|
|
|
main() {
|
|
group('field name', () {
|
|
test('plain field name', () {
|
|
expect('foo', isFieldName('foo'));
|
|
});
|
|
test('alias', () {
|
|
expect('foo: bar', isFieldName('foo', alias: 'bar'));
|
|
});
|
|
test('exceptions', () {
|
|
expect(() => parseFieldName('foo:'), throwsSyntaxError);
|
|
});
|
|
});
|
|
|
|
test('arguments', () {
|
|
expect('()', isArgumentList([]));
|
|
expect(r'(a: 2)', isArgumentList([isArgument('a', 2)]));
|
|
expect(r'(a: 2, b: $c)',
|
|
isArgumentList([isArgument('a', 2), isArgument('b', 'c')]));
|
|
});
|
|
|
|
group('field tests', () {
|
|
test('plain field name', () {
|
|
expect('foo', isField(fieldName: isFieldName('foo')));
|
|
});
|
|
|
|
test('aliased field name', () {
|
|
expect('foo: bar', isField(fieldName: isFieldName('foo', alias: 'bar')));
|
|
});
|
|
|
|
test('with arguments', () {
|
|
expect(
|
|
r'foo (a: 2, b: $c)',
|
|
isField(
|
|
fieldName: isFieldName('foo'),
|
|
arguments:
|
|
isArgumentList([isArgument('a', 2), isArgument('b', 'c')])));
|
|
});
|
|
|
|
test('with directives', () {
|
|
expect(
|
|
'foo: bar (a: 2) @bar @baz: 2 @quux (one: 1)',
|
|
isField(
|
|
fieldName: isFieldName('foo', alias: 'bar'),
|
|
arguments: isArgumentList([isArgument('a', 2)]),
|
|
directives: isDirectiveList([
|
|
isDirective('bar'),
|
|
isDirective('baz', valueOrVariable: isValue(2)),
|
|
isDirective('quux', argument: isArgument('one', 1))
|
|
])));
|
|
});
|
|
|
|
test('with selection set', () {
|
|
expect(
|
|
'foo: bar {baz, ...quux}',
|
|
isField(
|
|
fieldName: isFieldName('foo', alias: 'bar'),
|
|
selectionSet: isSelectionSet([
|
|
isField(fieldName: isFieldName('baz')),
|
|
isFragmentSpread('quux')
|
|
])));
|
|
});
|
|
});
|
|
}
|
|
|
|
FieldContext parseField(String text) => parse(text).parseField();
|
|
|
|
FieldNameContext parseFieldName(String text) => parse(text).parseFieldName();
|
|
|
|
Matcher isField(
|
|
{Matcher fieldName,
|
|
Matcher arguments,
|
|
Matcher directives,
|
|
Matcher selectionSet}) =>
|
|
new _IsField(fieldName, arguments, directives, selectionSet);
|
|
|
|
Matcher isFieldName(String name, {String alias}) =>
|
|
new _IsFieldName(name, alias);
|
|
|
|
class _IsField extends Matcher {
|
|
final Matcher fieldName, arguments, directives, selectionSet;
|
|
|
|
_IsField(this.fieldName, this.arguments, this.directives, this.selectionSet);
|
|
|
|
@override
|
|
Description describe(Description description) {
|
|
// Too lazy to make a real description...
|
|
return description.add('is field');
|
|
}
|
|
|
|
@override
|
|
bool matches(item, Map matchState) {
|
|
var field = item is FieldContext ? item : parseField(item.toString());
|
|
if (field == null) return false;
|
|
if (fieldName != null && !fieldName.matches(field.fieldName, matchState))
|
|
return false;
|
|
if (arguments != null && !arguments.matches(field.arguments, matchState))
|
|
return false;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
class _IsFieldName extends Matcher {
|
|
final String name, realName;
|
|
|
|
_IsFieldName(this.name, this.realName);
|
|
|
|
@override
|
|
Description describe(Description description) {
|
|
if (realName != null)
|
|
return description.add('is field with name "$name" and alias "$realName"');
|
|
return description.add('is field with name "$name"');
|
|
}
|
|
|
|
@override
|
|
bool matches(item, Map matchState) {
|
|
var fieldName = item is FieldNameContext ? item : parseFieldName(item.toString());
|
|
if (realName != null)
|
|
return fieldName.alias?.alias == name && fieldName.alias?.name == realName;
|
|
else
|
|
return fieldName.name == name;
|
|
}
|
|
}
|