anchor.diff:        );
   
         owner.performAction(expectedNodeId, SemanticsAction.copy);
  -      verify(controls.handleCopy(any, any)).called(1);
  +      expect(controls.copyCount, 1);
   
         owner.performAction(expectedNodeId, SemanticsAction.cut);
  -      verify(controls.handleCut(any)).called(1);
  +      expect(controls.cutCount, 1);
   
         owner.performAction(expectedNodeId, SemanticsAction.paste);
  -      verify(controls.handlePaste(any)).called(1);
  +      expect(controls.pasteCount, 1);
   
         semantics.dispose();
       });
  
positive.code:           TextSelection.collapsed(offset: controller.text.length);
  
        controls = MockTextSelectionControls();
        when(controls.buildHandle(any, any, any)).thenReturn(Container());
        when(controls.buildToolbar(any, any, any, any, any, any, any))
            .thenReturn(Container());
      });
  
      testWidgets('are exposed', (WidgetTester tester) async {
        final SemanticsTester semantics = SemanticsTester(tester);
        addTearDown(semantics.dispose);
  
        when(controls.canCopy(any)).thenReturn(false);
        when(controls.canCut(any)).thenReturn(false);
        when(controls.canPaste(any)).thenReturn(false);
  
        await _buildApp(controls, tester);
        await tester.tap(find.byType(EditableText));
  
negative.code:     testWidgets('can copy/cut/paste with a11y', (WidgetTester tester) async {
        final SemanticsTester semantics = SemanticsTester(tester);
  
        controls.testCanCopy = true;
        controls.testCanCut = true;
        controls.testCanPaste = true;
        await _buildApp(controls, tester);
        await tester.tap(find.byType(EditableText));
        await tester.pump();
  