public function testAllowsEditingNodeOnEnterAndOnLeave()
{
$ast = Parser::parse('{ a, b, c { a, b, c } }', ['noLocation' => true]);
$selectionSet = null;
$editedAst = Visitor::visit($ast, [NodeKind::OPERATION_DEFINITION => ['enter' => function (OperationDefinitionNode $node) use(&$selectionSet) {
$selectionSet = $node->selectionSet;
$newNode = clone $node;
$newNode->selectionSet = new SelectionSetNode(['selections' => []]);
$newNode->didEnter = true;
return $newNode;
}, 'leave' => function (OperationDefinitionNode $node) use(&$selectionSet) {
$newNode = clone $node;
$newNode->selectionSet = $selectionSet;
$newNode->didLeave = true;
return $newNode;
}]]);
$this->assertNotEquals($ast, $editedAst);
$expected = $ast->cloneDeep();
$expected->definitions[0]->didEnter = true;
$expected->definitions[0]->didLeave = true;
$this->assertEquals($expected, $editedAst);
}