Unverified Commit b5eac042 authored by Yegor's avatar Yegor Committed by GitHub

use different delimiter for generated code; print generated code into mismatch description (#13667)

parent e6f20eb9
...@@ -274,25 +274,35 @@ class TestSemantics { ...@@ -274,25 +274,35 @@ class TestSemantics {
String toString([int indentAmount = 0]) { String toString([int indentAmount = 0]) {
final String indent = ' ' * indentAmount; final String indent = ' ' * indentAmount;
final StringBuffer buf = new StringBuffer(); final StringBuffer buf = new StringBuffer();
buf.writeln('$indent$runtimeType {'); buf.writeln('${indent}new $runtimeType(');
if (id != null) if (id != null)
buf.writeln('$indent id: $id'); buf.writeln('$indent id: $id,');
buf.writeln('$indent flags: $flags'); if (flags is int && flags != 0 || flags is List<SemanticsFlags> && flags.isNotEmpty)
buf.writeln('$indent actions: $actions'); buf.writeln('$indent flags: ${SemanticsTester._flagsToSemanticsFlagsExpression(flags)},');
if (label != null) if (actions is int && actions != 0 || actions is List<SemanticsAction> && actions.isNotEmpty)
buf.writeln('$indent label: "$label"'); buf.writeln('$indent actions: ${SemanticsTester._actionsToSemanticsActionExpression(actions)},');
if (label != null && label != '')
buf.writeln('$indent label: \'$label\',');
if (value != null && value != '')
buf.writeln('$indent value: \'$value\',');
if (increasedValue != null && increasedValue != '')
buf.writeln('$indent increasedValue: \'$increasedValue\',');
if (decreasedValue != null && decreasedValue != '')
buf.writeln('$indent decreasedValue: \'$decreasedValue\',');
if (hint != null && hint != '')
buf.writeln('$indent hint: \'$hint\',');
if (textDirection != null) if (textDirection != null)
buf.writeln('$indent textDirection: $textDirection'); buf.writeln('$indent textDirection: $textDirection,');
if (rect != null) if (rect != null)
buf.writeln('$indent rect: $rect'); buf.writeln('$indent rect: $rect,');
if (transform != null) if (transform != null)
buf.writeln('$indent transform:\n${transform.toString().trim().split('\n').map((String line) => '$indent $line').join('\n')}'); buf.writeln('$indent transform:\n${transform.toString().trim().split('\n').map((String line) => '$indent $line').join('\n')},');
buf.writeln('$indent children: ['); buf.writeln('$indent children: <TestSemantics>[');
for (TestSemantics child in children) { for (TestSemantics child in children) {
buf.writeln(child.toString(indentAmount + 2)); buf.writeln('${child.toString(indentAmount + 2)},');
} }
buf.writeln('$indent ]'); buf.writeln('$indent ],');
buf.write('$indent}'); buf.write('$indent)');
return buf.toString(); return buf.toString();
} }
} }
...@@ -418,29 +428,39 @@ class SemanticsTester { ...@@ -418,29 +428,39 @@ class SemanticsTester {
return _generateSemanticsTestForNode(node, 0); return _generateSemanticsTestForNode(node, 0);
} }
String _flagsToSemanticsFlagsExpression(int bitmap) { static String _flagsToSemanticsFlagsExpression(dynamic flags) {
return SemanticsFlags.values.values Iterable<SemanticsFlags> list;
.where((SemanticsFlags flag) => (flag.index & bitmap) != 0) if (flags is int) {
.join(', '); list = SemanticsFlags.values.values
.where((SemanticsFlags flag) => (flag.index & flags) != 0);
} else {
list = flags;
}
return '<SemanticsFlags>[${list.join(', ')}]';
} }
String _actionsToSemanticsActionExpression(int bitmap) { static String _actionsToSemanticsActionExpression(dynamic actions) {
return SemanticsAction.values.values Iterable<SemanticsAction> list;
.where((SemanticsAction action) => (action.index & bitmap) != 0) if (actions is int) {
.join(', '); list = SemanticsAction.values.values
.where((SemanticsAction action) => (action.index & actions) != 0);
} else {
list = actions;
}
return '<SemanticsAction>[${list.join(', ')}]';
} }
/// Recursively generates [TestSemantics] code for [node] and its children, /// Recursively generates [TestSemantics] code for [node] and its children,
/// indenting the expression by `indentAmount`. /// indenting the expression by `indentAmount`.
String _generateSemanticsTestForNode(SemanticsNode node, int indentAmount) { static String _generateSemanticsTestForNode(SemanticsNode node, int indentAmount) {
final String indent = ' ' * indentAmount; final String indent = ' ' * indentAmount;
final StringBuffer buf = new StringBuffer(); final StringBuffer buf = new StringBuffer();
final SemanticsData nodeData = node.getSemanticsData(); final SemanticsData nodeData = node.getSemanticsData();
buf.writeln('new TestSemantics('); buf.writeln('new TestSemantics(');
if (nodeData.flags != 0) if (nodeData.flags != 0)
buf.writeln(' flags: <SemanticsFlags>[${_flagsToSemanticsFlagsExpression(nodeData.flags)}],'); buf.writeln(' flags: ${_flagsToSemanticsFlagsExpression(nodeData.flags)},');
if (nodeData.actions != 0) if (nodeData.actions != 0)
buf.writeln(' actions: <SemanticsAction>[${_actionsToSemanticsActionExpression(nodeData.actions)}],'); buf.writeln(' actions: ${_actionsToSemanticsActionExpression(nodeData.actions)},');
if (node.label != null && node.label.isNotEmpty) if (node.label != null && node.label.isNotEmpty)
buf.writeln(' label: r\'${node.label}\','); buf.writeln(' label: r\'${node.label}\',');
if (node.value != null && node.value.isNotEmpty) if (node.value != null && node.value.isNotEmpty)
...@@ -480,7 +500,11 @@ class _HasSemantics extends Matcher { ...@@ -480,7 +500,11 @@ class _HasSemantics extends Matcher {
@override @override
bool matches(covariant SemanticsTester item, Map<dynamic, dynamic> matchState) { bool matches(covariant SemanticsTester item, Map<dynamic, dynamic> matchState) {
return _semantics._matches(item.tester.binding.pipelineOwner.semanticsOwner.rootSemanticsNode, matchState, ignoreTransform: ignoreTransform, ignoreRect: ignoreRect, ignoreId: ignoreId); final bool doesMatch = _semantics._matches(item.tester.binding.pipelineOwner.semanticsOwner.rootSemanticsNode, matchState, ignoreTransform: ignoreTransform, ignoreRect: ignoreRect, ignoreId: ignoreId);
if (!doesMatch) {
matchState['would-match'] = item.generateTestSemanticsExpressionForCurrentSemanticsTree();
}
return doesMatch;
} }
@override @override
...@@ -492,10 +516,10 @@ class _HasSemantics extends Matcher { ...@@ -492,10 +516,10 @@ class _HasSemantics extends Matcher {
Description describeMismatch(dynamic item, Description mismatchDescription, Map<dynamic, dynamic> matchState, bool verbose) { Description describeMismatch(dynamic item, Description mismatchDescription, Map<dynamic, dynamic> matchState, bool verbose) {
return mismatchDescription return mismatchDescription
.add('${matchState[TestSemantics]}\n') .add('${matchState[TestSemantics]}\n')
.add( .add('Current SemanticsNode tree:\n')
'Current SemanticsNode tree:\n' .add(RendererBinding.instance?.renderView?.debugSemantics?.toStringDeep(childOrder: DebugSemanticsDumpOrder.inverseHitTest))
) .add('The semantics tree would have matched the following configuration:\n')
.add(RendererBinding.instance?.renderView?.debugSemantics?.toStringDeep(childOrder: DebugSemanticsDumpOrder.inverseHitTest)); .add(matchState['would-match']);
} }
} }
......
...@@ -79,8 +79,8 @@ void _tests() { ...@@ -79,8 +79,8 @@ void _tests() {
expect(thisTestFile, isNotNull); expect(thisTestFile, isNotNull);
String expectedCode = thisTestFile.readAsStringSync(); String expectedCode = thisTestFile.readAsStringSync();
expectedCode = expectedCode.substring( expectedCode = expectedCode.substring(
expectedCode.indexOf('>' * 12) + 12, expectedCode.indexOf('v' * 12) + 12,
expectedCode.indexOf('<' * 12) - 3, expectedCode.indexOf('^' * 12) - 3,
) )
.split('\n') .split('\n')
.map((String line) => line.trim()) .map((String line) => line.trim())
...@@ -96,12 +96,12 @@ void _tests() { ...@@ -96,12 +96,12 @@ void _tests() {
expect( expect(
semantics, semantics,
hasSemantics( hasSemantics(
// The code below delimited by > and < characters is generated by // The code below delimited by "v" and "^" characters is generated by
// generateTestSemanticsExpressionForCurrentSemanticsTree function. // generateTestSemanticsExpressionForCurrentSemanticsTree function.
// You must update it when changing the output generated by // You must update it when changing the output generated by
// generateTestSemanticsExpressionForCurrentSemanticsTree. Otherwise, // generateTestSemanticsExpressionForCurrentSemanticsTree. Otherwise,
// the test 'generates code', defined above, will fail. // the test 'generates code', defined above, will fail.
// >>>>>>>>>>>> // vvvvvvvvvvvv
new TestSemantics( new TestSemantics(
children: <TestSemantics>[ children: <TestSemantics>[
new TestSemantics( new TestSemantics(
...@@ -128,7 +128,7 @@ void _tests() { ...@@ -128,7 +128,7 @@ void _tests() {
), ),
], ],
), ),
// <<<<<<<<<<<< // ^^^^^^^^^^^^
ignoreRect: true, ignoreRect: true,
ignoreTransform: true, ignoreTransform: true,
ignoreId: true, ignoreId: true,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment