Skip to content

Commit fd980c0

Browse files
authored
Update checks to 0.3.0 (#48)
1 parent eb58104 commit fd980c0

10 files changed

Lines changed: 194 additions & 233 deletions

File tree

lib/spot.dart

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,9 @@ export 'package:checks/checks.dart'
1111
FutureChecks,
1212
// async checks are not useful for spot
1313
StreamChecks,
14-
WithQueueExtension,
15-
it;
14+
WithQueueExtension;
1615
export 'package:checks/context.dart'
17-
show
18-
Condition,
19-
ConditionSubject,
20-
Context,
21-
ContextExtension,
22-
Extracted,
23-
Rejection,
24-
Subject;
16+
show Condition, Context, ContextExtension, Extracted, Rejection, Subject;
2517
export 'package:meta/meta.dart' show useResult;
2618
export 'package:spot/src/act/act.dart' show Act, act;
2719
export 'package:spot/src/screenshot/screenshot.dart'

lib/src/spot/diagnostic_props.dart

Lines changed: 58 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import 'package:checks/checks.dart';
21
import 'package:dartx/dartx.dart';
32
import 'package:flutter/foundation.dart';
43
import 'package:flutter/widgets.dart';
@@ -40,14 +39,15 @@ extension DiagnosticPropWidgetSelector<W extends Widget> on WidgetSelector<W> {
4039
String propName,
4140
MatchProp<T> match,
4241
) {
43-
final ConditionSubject<T> nameSubject = it();
44-
nameSubject.context.nest<T>(
45-
() => ['with prop "$propName"'],
46-
(value) => Extracted.value(value),
47-
);
48-
match(nameSubject);
49-
final name =
50-
describe(nameSubject).map((it) => it.trim()).toList().join(' ');
42+
void condition(Subject<T?> subject) {
43+
subject.hideNullability().context.nest<T>(
44+
() => ['with prop "$propName"'],
45+
(value) => Extracted.value(value),
46+
);
47+
match(subject.hideNullability());
48+
}
49+
50+
final name = describe(condition).map((it) => it.trim()).toList().join(' ');
5151

5252
return whereElement(
5353
(element) {
@@ -60,29 +60,31 @@ extension DiagnosticPropWidgetSelector<W extends Widget> on WidgetSelector<W> {
6060
overrideQuantityConstraint(QuantityConstraint.unconstrained);
6161
final actual = prop?.value as T? ?? prop?.getDefaultValue<T>();
6262

63-
final ConditionSubject<T?> conditionSubject = it<T?>();
64-
final Subject<T> subject = conditionSubject.context.nest<T>(
65-
() => [
66-
unconstrainedSelector.toStringBreadcrumb(),
67-
'with prop "$propName"',
68-
],
69-
(value) {
70-
if (prop == null) {
71-
return Extracted.rejection(which: ['Has no prop "$propName"']);
72-
}
73-
if (value is! T) {
74-
return Extracted.rejection(
75-
which: [
76-
'Has no prop "$propName" of type "$T", the type is "${prop.value.runtimeType}"',
77-
],
78-
);
79-
}
63+
void condition(Subject<T?> subject) {
64+
subject.context.nest<T>(
65+
() => [
66+
unconstrainedSelector.toStringBreadcrumb(),
67+
'with prop "$propName"',
68+
],
69+
(value) {
70+
if (prop == null) {
71+
return Extracted.rejection(which: ['Has no prop "$propName"']);
72+
}
73+
if (value is! T) {
74+
return Extracted.rejection(
75+
which: [
76+
'Has no prop "$propName" of type "$T", the type is "${prop.value.runtimeType}"',
77+
],
78+
);
79+
}
80+
81+
return Extracted.value(actual as T);
82+
},
83+
);
84+
match(subject.hideNullability());
85+
}
8086

81-
return Extracted.value(actual as T);
82-
},
83-
);
84-
match(subject);
85-
final failure = softCheckHideNull(actual, conditionSubject);
87+
final failure = softCheckHideNull(actual, condition);
8688
if (failure != null) {
8789
return false;
8890
}
@@ -128,29 +130,31 @@ extension DiagnosticPropWidgetMatcher<W extends Widget> on WidgetMatcher<W> {
128130
selector.overrideQuantityConstraint(QuantityConstraint.unconstrained);
129131
final actual = prop?.value as T? ?? prop?.getDefaultValue<T>();
130132

131-
final ConditionSubject<T?> conditionSubject = it<T?>();
132-
final Subject<T> subject = conditionSubject.context.nest<T>(
133-
() => [
134-
unconstrainedSelector.toStringBreadcrumb(),
135-
'with property $propName',
136-
],
137-
(value) {
138-
if (prop == null) {
139-
return Extracted.rejection(which: ['Has no prop "$propName"']);
140-
}
141-
if (value is! T) {
142-
return Extracted.rejection(
143-
which: [
144-
'Has no prop "$propName" of type "$T", the type is "${prop.value.runtimeType}"',
145-
],
146-
);
147-
}
148-
return Extracted.value(value);
149-
},
150-
);
151-
match(subject);
152-
final failure = softCheckHideNull(actual, conditionSubject);
153-
failure.throwPropertyCheckFailure(conditionSubject, element);
133+
void condition(Subject<T?> subject) {
134+
subject.context.nest<T>(
135+
() => [
136+
unconstrainedSelector.toStringBreadcrumb(),
137+
'with property $propName',
138+
],
139+
(value) {
140+
if (prop == null) {
141+
return Extracted.rejection(which: ['Has no prop "$propName"']);
142+
}
143+
if (value is! T) {
144+
return Extracted.rejection(
145+
which: [
146+
'Has no prop "$propName" of type "$T", the type is "${prop.value.runtimeType}"',
147+
],
148+
);
149+
}
150+
return Extracted.value(value);
151+
},
152+
);
153+
match(subject.hideNullability());
154+
}
155+
156+
final failure = softCheckHideNull(actual, condition);
157+
failure.throwPropertyCheckFailure(condition, element);
154158
return this;
155159
}
156160
}

lib/src/spot/props.dart

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import 'package:checks/checks.dart';
21
import 'package:flutter/widgets.dart';
32
import 'package:meta/meta.dart';
43
import 'package:spot/src/checks/checks_nullability.dart';
@@ -29,43 +28,41 @@ extension WidgetSelectorProp<W extends Widget> on WidgetSelector<W> {
2928
/// ```
3029
@useResult
3130
WidgetSelector<W> withProp<T>({
32-
@Deprecated('use elementSelector instead')
33-
Subject<T> Function(ConditionSubject<Element>)? selector,
34-
Subject<T> Function(ConditionSubject<Element>)? elementSelector,
31+
Subject<T> Function(Subject<Element>)? elementSelector,
3532
Subject<T> Function(Subject<W>)? widgetSelector,
3633
required MatchProp<T> match,
3734
}) {
38-
final ConditionSubject<Element> elementSubject = it<Element>();
39-
final Subject<T> subject = () {
40-
if (selector != null) {
41-
return selector(elementSubject);
42-
}
43-
if (elementSelector != null) {
44-
return elementSelector(elementSubject);
45-
}
46-
if (widgetSelector != null) {
47-
final Subject<W> widgetSubject = elementSubject.context.nest<W>(
48-
() => [],
49-
(element) {
50-
final widget = mapElementToWidget(element);
51-
return Extracted.value(widget);
52-
},
53-
);
54-
return widgetSelector.call(widgetSubject);
55-
}
56-
35+
if (elementSelector == null && widgetSelector == null) {
5736
throw ArgumentError(
5837
'Either elementSelector (former selector) or widgetSelector must be set',
5938
);
60-
}();
39+
}
40+
void widgetSelectorCondition(Subject<Element> subject) {
41+
final Subject<W> widgetSubject = subject.context.nest<W>(
42+
() => [],
43+
(element) {
44+
final widget = mapElementToWidget(element);
45+
return Extracted.value(widget);
46+
},
47+
);
48+
final value = widgetSelector!(widgetSubject);
49+
match(value);
50+
}
51+
52+
void elementSelectorCondition(Subject<Element> subject) {
53+
final value = elementSelector!(subject);
54+
match(value);
55+
}
56+
57+
final void Function(Subject<Element>) condition = elementSelector != null
58+
? elementSelectorCondition
59+
: widgetSelectorCondition;
6160

62-
match(subject);
63-
final name =
64-
describe(elementSubject).map((it) => it.trim()).toList().join(' ');
61+
final name = describe(condition).map((it) => it.trim()).toList().join(' ');
6562

6663
return whereElement(
6764
(element) {
68-
final failure = softCheckHideNull(element, elementSubject);
65+
final failure = softCheckHideNull(element, condition);
6966
if (failure != null) {
7067
return false;
7168
}

lib/src/spot/selectors.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import 'package:checks/checks.dart';
21
import 'package:dartx/dartx.dart';
32
import 'package:flutter/material.dart';
43
import 'package:spot/spot.dart';
@@ -228,9 +227,7 @@ mixin ChainableSelectors<T extends Widget> {
228227
}) {
229228
final String name = description ??
230229
() {
231-
final ConditionSubject<String> subject = it();
232-
match(subject);
233-
return describe(subject).map((it) => it.trim()).toList().join(' ');
230+
return describe(match).map((it) => it.trim()).toList().join(' ');
234231
}();
235232
final p = [if (self != null) self!, ...parents];
236233
final selector = AnyTextWidgetSelector(

lib/src/spot/text/any_text.dart

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import 'package:checks/checks.dart';
21
import 'package:collection/collection.dart';
32
import 'package:flutter/material.dart';
43
import 'package:flutter/rendering.dart';
4+
import 'package:spot/spot.dart';
55
import 'package:spot/src/checks/checks_nullability.dart';
6-
import 'package:spot/src/spot/widget_selector.dart';
76

87
/// A union type for any text widget that can be found in the widget tree.
98
/// Specifically this includes:
@@ -288,9 +287,7 @@ class MatchTextFilter implements ElementFilter {
288287
bool _match(Element element) {
289288
try {
290289
final actual = _extractTextData(element);
291-
final subject = it<String?>();
292-
match(subject.hideNullability());
293-
final failure = softCheck(actual, subject);
290+
final failure = softCheck(actual, match.hideNullability());
294291
return failure == null;
295292
} on _UnsupportedWidgetTypeException {
296293
return false;

0 commit comments

Comments
 (0)