type Query {
	testArgument(arg1: String! @type_directive_argument_definition(description: "This is ARGUMENT_DEFINITION in Object.arg1"), arg2: String! @type_directive_argument_definition(description: "This is ARGUMENT_DEFINITION in Object.arg2")): String!
	testInputObject(arg: TestInput!): String!
	testComplexObject: TestComplexObject!
	testSimpleObject: TestSimpleObject!
	testOneOfObject(arg: TestOneOfObject!): String!
	testEnum(arg: TestEnum!): String!
	testInterface: TestObjectForInterface!
}

type TestComplexObject @type_directive_object(description: "This is OBJECT in (Complex / Simple)Object") {
	field: String! @type_directive_field_definition(description: "This is FIELD_DEFINITION in (Complex / Simple)Object")
	test(arg1: String! @type_directive_argument_definition(description: "This is ARGUMENT_DEFINITION in ComplexObject.arg1"), arg2: String! @type_directive_argument_definition(description: "This is ARGUMENT_DEFINITION in ComplexObject.arg2")): String! @type_directive_field_definition(description: "This is FIELD_DEFINITION in ComplexObject")
}

enum TestEnum @type_directive_enum(description: "This is ENUM in Enum") {
	FOO @type_directive_enum_value(description: "This is ENUM_VALUE in Enum")
	BAR @type_directive_enum_value(description: "This is ENUM_VALUE in Enum")
}

input TestInput @type_directive_input_object(description: "This is INPUT_OBJECT in InputObject") {
	field: String! @type_directive_input_field_definition(description: "This is INPUT_FIELD_DEFINITION")
}

interface TestInterface @type_directive_interface(description: "This is INTERFACE in Interface") {
	field(arg1: String! @type_directive_argument_definition(description: "This is ARGUMENT_DEFINITION in Interface.arg1"), arg2: String! @type_directive_argument_definition(description: "This is ARGUMENT_DEFINITION in Interface.arg2")): String! @type_directive_field_definition(description: "This is INTERFACE in Interface")
}

type TestObjectForInterface implements TestInterface {
	field(arg1: String! @type_directive_argument_definition(description: "This is ARGUMENT_DEFINITION in Interface.arg1"), arg2: String! @type_directive_argument_definition(description: "This is ARGUMENT_DEFINITION in Interface.arg2")): String!
}

input TestOneOfObject @oneOf @type_directive_input_object(description: "This is INPUT_OBJECT in OneofObject") {
	foo: String @type_directive_input_field_definition(description: "This is INPUT_FIELD_DEFINITION in OneofObject")
	bar: Int @type_directive_input_field_definition(description: "This is INPUT_FIELD_DEFINITION in OneofObject")
}

type TestSimpleObject @type_directive_object(description: "This is OBJECT in SimpleObject") {
	field: String! @type_directive_field_definition(description: "This is FIELD_DEFINITION in SimpleObject")
}

"""
Directs the executor to include this field or fragment only when the `if` argument is true.
"""
directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
"""
Indicates that an Input Object is a OneOf Input Object (and thus requires exactly one of its field be provided)
"""
directive @oneOf on INPUT_OBJECT
"""
Directs the executor to skip this field or fragment when the `if` argument is true.
"""
directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
directive @type_directive_argument_definition(description: String!) on ARGUMENT_DEFINITION
directive @type_directive_enum(description: String!) on ENUM
directive @type_directive_enum_value(description: String!) on ENUM_VALUE
directive @type_directive_field_definition(description: String!) on FIELD_DEFINITION
directive @type_directive_input_field_definition(description: String!) on INPUT_FIELD_DEFINITION
directive @type_directive_input_object(description: String!) on INPUT_OBJECT
directive @type_directive_interface(description: String!) on INTERFACE
directive @type_directive_object(description: String!) on OBJECT
schema {
	query: Query
}
