From 4148f43b265756dac93a17560a29e4d775faf83b Mon Sep 17 00:00:00 2001 From: Christoffer Niska Date: Sat, 24 Feb 2018 21:23:54 +0200 Subject: [PATCH] Improve object serialization --- src/Language/AST/Builder/DocumentBuilder.php | 17 --- src/Language/AST/Node/AbstractNode.php | 17 +++ .../AST/Node/Behavior/DirectivesTrait.php | 5 +- src/Language/Location.php | 17 +++ src/Type/Definition/Directive.php | 12 +- src/Util/helpers.php | 9 ++ .../Language/AbstractParserTest.php | 106 ++++++++++++++++++ tests/Functional/Language/ParserTest.php | 102 +---------------- .../Functional/Language/SchemaParserTest.php | 14 +++ 9 files changed, 169 insertions(+), 130 deletions(-) create mode 100644 tests/Functional/Language/AbstractParserTest.php create mode 100644 tests/Functional/Language/SchemaParserTest.php diff --git a/src/Language/AST/Builder/DocumentBuilder.php b/src/Language/AST/Builder/DocumentBuilder.php index b25966d5..f7fccd57 100644 --- a/src/Language/AST/Builder/DocumentBuilder.php +++ b/src/Language/AST/Builder/DocumentBuilder.php @@ -28,21 +28,4 @@ public function supportsKind(string $kind): bool { return $kind === NodeKindEnum::DOCUMENT; } - - /** - * @param array $ast - * @return array|DefinitionNodeInterface[] - */ - protected function parseDefinitions(array $ast): array - { - $definitions = []; - - if (isset($ast['definitions'])) { - foreach ($ast['definitions'] as $definitionAst) { - $definitions[] = $this->director->build($definitionAst); - } - } - - return $definitions; - } } diff --git a/src/Language/AST/Node/AbstractNode.php b/src/Language/AST/Node/AbstractNode.php index 4fa92979..3d51b88c 100644 --- a/src/Language/AST/Node/AbstractNode.php +++ b/src/Language/AST/Node/AbstractNode.php @@ -5,6 +5,7 @@ use Digia\GraphQL\ConfigObject; use Digia\GraphQL\Contract\SerializationInterface; use Digia\GraphQL\Language\Location; +use function Digia\GraphQL\Util\jsonEncode; abstract class AbstractNode extends ConfigObject implements SerializationInterface { @@ -54,4 +55,20 @@ public function toArray(): array 'loc' => $this->getLocationAsArray(), ]; } + + /** + * @return string + */ + public function toJSON(): string + { + return jsonEncode($this->toArray()); + } + + /** + * @return string + */ + public function __toString(): string + { + return $this->toJSON(); + } } diff --git a/src/Language/AST/Node/Behavior/DirectivesTrait.php b/src/Language/AST/Node/Behavior/DirectivesTrait.php index a675f1fa..92b13e15 100644 --- a/src/Language/AST/Node/Behavior/DirectivesTrait.php +++ b/src/Language/AST/Node/Behavior/DirectivesTrait.php @@ -26,8 +26,7 @@ public function getDirectives(): array */ public function getDirectivesAsArray(): array { - return array_map(function (SerializationInterface $directive) { - return $directive->toArray(); - }, $this->directives); + // TODO: Implement this method. + return []; } } diff --git a/src/Language/Location.php b/src/Language/Location.php index 3669d102..75b79e6b 100644 --- a/src/Language/Location.php +++ b/src/Language/Location.php @@ -3,6 +3,7 @@ namespace Digia\GraphQL\Language; use Digia\GraphQL\Contract\SerializationInterface; +use function Digia\GraphQL\Util\jsonEncode; class Location implements SerializationInterface { @@ -70,4 +71,20 @@ public function toArray(): array 'end' => $this->end, ]; } + + /** + * @return string + */ + public function toJSON(): string + { + return jsonEncode($this->toArray()); + } + + /** + * @return string + */ + public function __toString(): string + { + return $this->toJSON(); + } } diff --git a/src/Type/Definition/Directive.php b/src/Type/Definition/Directive.php index 3615ee2c..2b3e41d3 100644 --- a/src/Type/Definition/Directive.php +++ b/src/Type/Definition/Directive.php @@ -8,8 +8,9 @@ use Digia\GraphQL\Type\Definition\Behavior\DescriptionTrait; use Digia\GraphQL\Type\Definition\Behavior\NameTrait; use Digia\GraphQL\Type\Definition\Contract\DirectiveInterface; +use function Digia\GraphQL\Util\jsonEncode; -class Directive extends ConfigObject implements DirectiveInterface, SerializationInterface +class Directive extends ConfigObject implements DirectiveInterface { use NameTrait; @@ -52,13 +53,4 @@ protected function setLocations(array $locations) return $this; } - - /** - * @return array - */ - public function toArray(): array - { - // TODO: Implement this method. - return []; - } } diff --git a/src/Util/helpers.php b/src/Util/helpers.php index efb39131..c80da359 100644 --- a/src/Util/helpers.php +++ b/src/Util/helpers.php @@ -64,3 +64,12 @@ function toString($value): string } return gettype($value); } + +/** + * @param $value + * @return string + */ +function jsonEncode($value): string +{ + return json_encode($value, JSON_UNESCAPED_UNICODE); +} diff --git a/tests/Functional/Language/AbstractParserTest.php b/tests/Functional/Language/AbstractParserTest.php new file mode 100644 index 00000000..f0a7e484 --- /dev/null +++ b/tests/Functional/Language/AbstractParserTest.php @@ -0,0 +1,106 @@ +parser = new ASTParser($builders, $readers); + } +} diff --git a/tests/Functional/Language/ParserTest.php b/tests/Functional/Language/ParserTest.php index 452e5d32..d1346014 100644 --- a/tests/Functional/Language/ParserTest.php +++ b/tests/Functional/Language/ParserTest.php @@ -3,114 +3,16 @@ namespace Digia\GraphQL\Test\Functional\Language\AST; use Digia\GraphQL\Error\SyntaxError; -use Digia\GraphQL\Language\AST\Builder\ArgumentBuilder; -use Digia\GraphQL\Language\AST\Builder\BooleanBuilder; -use Digia\GraphQL\Language\AST\Builder\DirectiveBuilder; -use Digia\GraphQL\Language\AST\Builder\DocumentBuilder; -use Digia\GraphQL\Language\AST\Builder\EnumBuilder; -use Digia\GraphQL\Language\AST\Builder\FieldBuilder; -use Digia\GraphQL\Language\AST\Builder\FloatBuilder; -use Digia\GraphQL\Language\AST\Builder\FragmentDefinitionBuilder; -use Digia\GraphQL\Language\AST\Builder\FragmentSpreadBuilder; -use Digia\GraphQL\Language\AST\Builder\InlineFragmentBuilder; -use Digia\GraphQL\Language\AST\Builder\IntBuilder; -use Digia\GraphQL\Language\AST\Builder\ListBuilder; -use Digia\GraphQL\Language\AST\Builder\ListTypeBuilder; -use Digia\GraphQL\Language\AST\Builder\NameBuilder; -use Digia\GraphQL\Language\AST\Builder\NamedTypeBuilder; -use Digia\GraphQL\Language\AST\Builder\NonNullTypeBuilder; -use Digia\GraphQL\Language\AST\Builder\NullBuilder; -use Digia\GraphQL\Language\AST\Builder\ObjectBuilder; -use Digia\GraphQL\Language\AST\Builder\ObjectFieldBuilder; -use Digia\GraphQL\Language\AST\Builder\OperationDefinitionBuilder; -use Digia\GraphQL\Language\AST\Builder\SelectionSetBuilder; -use Digia\GraphQL\Language\AST\Builder\StringBuilder; -use Digia\GraphQL\Language\AST\Builder\VariableBuilder; -use Digia\GraphQL\Language\AST\Builder\VariableDefinitionBuilder; use Digia\GraphQL\Language\AST\Node\DocumentNode; use Digia\GraphQL\Language\AST\Node\NamedTypeNode; use Digia\GraphQL\Language\AST\Node\NullValueNode; use Digia\GraphQL\Language\AST\NodeKindEnum; -use Digia\GraphQL\Language\ASTParser; -use Digia\GraphQL\Language\Contract\ParserInterface; -use Digia\GraphQL\Language\Reader\AmpReader; -use Digia\GraphQL\Language\Reader\AtReader; -use Digia\GraphQL\Language\Reader\BangReader; -use Digia\GraphQL\Language\Reader\BlockStringReader; -use Digia\GraphQL\Language\Reader\BraceReader; -use Digia\GraphQL\Language\Reader\BracketReader; -use Digia\GraphQL\Language\Reader\ColonReader; -use Digia\GraphQL\Language\Reader\CommentReader; -use Digia\GraphQL\Language\Reader\DollarReader; -use Digia\GraphQL\Language\Reader\EqualsReader; -use Digia\GraphQL\Language\Reader\NameReader; -use Digia\GraphQL\Language\Reader\NumberReader; -use Digia\GraphQL\Language\Reader\ParenthesisReader; -use Digia\GraphQL\Language\Reader\PipeReader; -use Digia\GraphQL\Language\Reader\SpreadReader; -use Digia\GraphQL\Language\Reader\StringReader; use Digia\GraphQL\Language\Source; -use Digia\GraphQL\Test\TestCase; +use Digia\GraphQL\Test\Functional\Language\AbstractParserTest; -class ParserTest extends TestCase +class ParserTest extends AbstractParserTest { - /** - * @var ParserInterface - */ - protected $parser; - - public function setUp() - { - $builders = [ - new ArgumentBuilder(), - new BooleanBuilder(), - new DirectiveBuilder(), - new DocumentBuilder(), - new EnumBuilder(), - new FieldBuilder(), - new FloatBuilder(), - new FragmentDefinitionBuilder(), - new FragmentSpreadBuilder(), - new InlineFragmentBuilder(), - new IntBuilder(), - new ListBuilder(), - new ListTypeBuilder(), - new NameBuilder(), - new NamedTypeBuilder(), - new NonNullTypeBuilder(), - new NullBuilder(), - new ObjectBuilder(), - new ObjectFieldBuilder(), - new OperationDefinitionBuilder(), - new SelectionSetBuilder(), - new StringBuilder(), - new VariableBuilder(), - new VariableDefinitionBuilder(), - ]; - - $readers = [ - new AmpReader(), - new AtReader(), - new BangReader(), - new BlockStringReader(), - new BraceReader(), - new BracketReader(), - new ColonReader(), - new CommentReader(), - new DollarReader(), - new EqualsReader(), - new NameReader(), - new NumberReader(), - new ParenthesisReader(), - new PipeReader(), - new SpreadReader(), - new StringReader(), - ]; - - $this->parser = new ASTParser($builders, $readers); - } - /** * @throws \Digia\GraphQL\Error\GraphQLError * @throws \Exception diff --git a/tests/Functional/Language/SchemaParserTest.php b/tests/Functional/Language/SchemaParserTest.php new file mode 100644 index 00000000..882b9a21 --- /dev/null +++ b/tests/Functional/Language/SchemaParserTest.php @@ -0,0 +1,14 @@ +