public void AddsInnerClasses()
    {
        var model = root.AddClass(new CodeClass {
            Name = "model",
            Kind = CodeClassKind.Model
        }).First();
        var method = model.AddMethod(new CodeMethod {
            Name       = "method1",
            ReturnType = new CodeType {
                Name       = "string",
                IsExternal = true
            }
        }).First();
        var parameter = new CodeParameter {
            Name = "param1",
            Kind = CodeParameterKind.RequestConfiguration,
            Type = new CodeType {
                Name           = "SomeCustomType",
                ActionOf       = true,
                TypeDefinition = new CodeClass {
                    Name = "SomeCustomType"
                }
            }
        };

        method.AddParameter(parameter);
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.Java
        }, root);
        Assert.Equal(2, model.GetChildElements(true).Count());
    }
Exemple #2
0
    public void AddsUsingsForDiscriminatorTypes()
    {
        var parentModel = root.AddClass(new CodeClass {
            Name = "parentModel",
            Kind = CodeClassKind.Model,
        }).First();
        var childModel = root.AddClass(new CodeClass {
            Name = "childModel",
            Kind = CodeClassKind.Model,
        }).First();

        (childModel.StartBlock).Inherits = new CodeType {
            Name           = "parentModel",
            TypeDefinition = parentModel,
        };
        var factoryMethod = parentModel.AddMethod(new CodeMethod {
            Name       = "factory",
            Kind       = CodeMethodKind.Factory,
            ReturnType = new CodeType {
                Name           = "parentModel",
                TypeDefinition = parentModel,
            },
            IsStatic = true,
        }).First();

        factoryMethod.AddDiscriminatorMapping("ns.childmodel", new CodeType {
            Name           = "childModel",
            TypeDefinition = childModel,
        });
        Assert.False(factoryMethod.Parent is CodeFunction);
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.TypeScript
        }, root);
        Assert.Equal(childModel, (factoryMethod.Parent as CodeFunction).StartBlock.Usings.First(x => x.Name.Equals("childModel", StringComparison.OrdinalIgnoreCase)).Declaration.TypeDefinition);
    }
    public void DoesNotEscapesReservedKeywordsForClassOrPropertyKind()
    {
        // Arrange
        var model = root.AddClass(new CodeClass {
            Name = "break", // this a keyword
            Kind = CodeClassKind.Model,
        }).First();
        var property = model.AddProperty(new CodeProperty
        {
            Name = "alias",// this a keyword
            Type = new CodeType
            {
                Name = "string"
            }
        }).First();

        // Act
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.CSharp
        }, root);
        // Assert
        Assert.Equal("break", model.Name);
        Assert.DoesNotContain("@", model.Name);    // classname will be capitalized
        Assert.Equal("alias", property.Name);
        Assert.DoesNotContain("@", property.Name); // classname will be capitalized
    }
Exemple #4
0
    public void AddsUsingsForErrorTypesForRequestExecutor()
    {
        var requestBuilder = root.AddClass(new CodeClass {
            Name = "somerequestbuilder",
            Kind = CodeClassKind.RequestBuilder,
        }).First();
        var subNS      = root.AddNamespace($"{root.Name}.subns"); // otherwise the import gets trimmed
        var errorClass = subNS.AddClass(new CodeClass {
            Name = "Error4XX",
            Kind = CodeClassKind.Model,
            IsErrorDefinition = true,
        }).First();
        var requestExecutor = requestBuilder.AddMethod(new CodeMethod {
            Name       = "get",
            Kind       = CodeMethodKind.RequestExecutor,
            ReturnType = new CodeType {
                Name = "string"
            },
        }).First();

        requestExecutor.AddErrorMapping("4XX", new CodeType {
            Name           = "Error4XX",
            TypeDefinition = errorClass,
        });
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.TypeScript
        }, root);

        var declaration = requestBuilder.StartBlock;

        Assert.Contains("Error4XX", declaration.Usings.Select(x => x.Declaration?.Name));
    }
Exemple #5
0
        public void AddsEnumSetImport()
        {
            var model = root.AddClass(new CodeClass(root)
            {
                Name      = "model",
                ClassKind = CodeClassKind.Model
            }).First();

            model.AddProperty(new CodeProperty(model)
            {
                Name = "prop1",
                Type = new CodeType(model)
                {
                    Name           = "SomeEnum",
                    TypeDefinition = new CodeEnum(model)
                    {
                        Name  = "SomeEnum",
                        Flags = true,
                    }
                }
            });
            ILanguageRefiner.Refine(new GenerationConfiguration {
                Language = GenerationLanguage.Java
            }, root);
            Assert.NotEmpty((model.StartBlock as CodeClass.Declaration).Usings.Where(x => "EnumSet".Equals(x.Name)));
        }
Exemple #6
0
    public void DoesNotKeepCancellationParametersInRequestExecutors()
    {
        var model = root.AddClass(new CodeClass
        {
            Name = "model",
            Kind = CodeClassKind.RequestBuilder
        }).First();
        var method = model.AddMethod(new CodeMethod
        {
            Name       = "getMethod",
            Kind       = CodeMethodKind.RequestExecutor,
            ReturnType = new CodeType
            {
                Name = "string"
            }
        }).First();
        var cancellationParam = new CodeParameter
        {
            Name        = "cancelletionToken",
            Optional    = true,
            Kind        = CodeParameterKind.Cancellation,
            Description = "Cancellation token to use when cancelling requests",
            Type        = new CodeType {
                Name = "CancelletionToken", IsExternal = true
            },
        };

        method.AddParameter(cancellationParam);
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.TypeScript
        }, root);                                                                                                //using CSharp so the cancelletionToken doesn't get removed
        Assert.False(method.Parameters.Any());
        Assert.DoesNotContain(cancellationParam, method.Parameters);
    }
    public void ReplacesModelsByInterfaces()
    {
        var model = root.AddClass(new CodeClass {
            Name = "somemodel",
            Kind = CodeClassKind.Model,
        }).First();
        var requestBuilder = root.AddClass(new CodeClass {
            Name = "somerequestbuilder",
            Kind = CodeClassKind.RequestBuilder,
        }).First();

        var executorMethod = requestBuilder.AddMethod(new CodeMethod {
            Name       = "Execute",
            Kind       = CodeMethodKind.RequestExecutor,
            ReturnType = new CodeType {
                Name           = model.Name,
                TypeDefinition = model,
            },
        }).First();
        var executorParameter = new CodeParameter {
            Name = "requestBody",
            Kind = CodeParameterKind.RequestBody,
            Type = new CodeType {
                Name           = model.Name,
                TypeDefinition = model,
            },
        };

        executorMethod.AddParameter(executorParameter);
        var property = model.AddProperty(new CodeProperty {
            Name = "someProp",
            Kind = CodePropertyKind.Custom,
            Type = new CodeType {
                Name           = model.Name,
                TypeDefinition = model,
            },
        }).First();

        Assert.Empty(root.GetChildElements(true).OfType <CodeInterface>());
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.Go
        }, root);
        Assert.Single(root.GetChildElements(true).OfType <CodeInterface>());
        var inter = root.GetChildElements(true).OfType <CodeInterface>().First();

        Assert.NotEqual(model.Name, inter.Name);
        var propertyType = property.Type as CodeType;

        Assert.NotNull(propertyType);
        Assert.Equal(inter, propertyType.TypeDefinition);
        var executorParameterType = executorParameter.Type as CodeType;

        Assert.NotNull(executorParameterType);
        Assert.Equal(inter, executorParameterType.TypeDefinition);
        var executorMethodReturnType = executorMethod.ReturnType as CodeType;

        Assert.NotNull(executorMethodReturnType);
        Assert.Equal(inter, executorMethodReturnType.TypeDefinition);
    }
Exemple #8
0
    public void AddStaticMethodsUsingsForDeserializer()
    {
        var model = graphNS.AddClass(new CodeClass {
            Name = "somemodel",
            Kind = CodeClassKind.Model,
            IsErrorDefinition = true,
        }).First();

        model.AddMethod(new CodeMethod {
            Name       = "Deserialize",
            Kind       = CodeMethodKind.Deserializer,
            IsAsync    = false,
            ReturnType = new CodeType {
                Name       = "void",
                IsExternal = true,
            },
        });

        var subNs = graphNS.AddNamespace($"{graphNS.Name}.subns");

        var propertyModel = subNs.AddClass(new CodeClass {
            Name = "somepropertyModel",
            Kind = CodeClassKind.Model,
            IsErrorDefinition = true,
        }).First();

        propertyModel.AddMethod(new CodeMethod {
            Name       = "factory",
            Kind       = CodeMethodKind.Factory,
            IsAsync    = false,
            IsStatic   = true,
            ReturnType = new CodeType {
                Name       = "void",
                IsExternal = true,
            },
        });

        model.AddProperty(new CodeProperty {
            Name = "someProperty",
            Type = new CodeType {
                Name           = "somepropertyModel",
                TypeDefinition = propertyModel,
            },
        });

        Assert.Empty(graphNS.GetChildElements(true).OfType <CodeFunction>());
        Assert.Single(model.GetChildElements(true).OfType <CodeMethod>());

        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.TypeScript
        }, graphNS);
        Assert.Empty(model.GetChildElements(true).OfType <CodeMethod>().Where(x => x.IsOfKind(CodeMethodKind.Factory)));
        Assert.Single(subNs.GetChildElements(true).OfType <CodeFunction>());

        var function = subNs.GetChildElements(true).OfType <CodeFunction>().First();

        Assert.Single(model.Usings.Where(x => !x.IsExternal && x.Declaration.TypeDefinition == function));
    }
    public void AddsErrorImportForEnums()
    {
        var testEnum = root.AddEnum(new CodeEnum {
            Name = "TestEnum",
        }).First();

        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.Go
        }, root);
        Assert.Single(testEnum.Usings.Where(x => x.Name == "errors"));
    }
Exemple #10
0
        public void ReplacesIndexersByMethodsWithParameter()
        {
            var model = root.AddClass(new CodeClass(root)
            {
                Name      = "model",
                ClassKind = CodeClassKind.Model
            }).First();
            var requestBuilder = root.AddClass(new CodeClass(root)
            {
                Name      = "requestBuilder",
                ClassKind = CodeClassKind.Model
            }).First();

            requestBuilder.AddProperty(new CodeProperty(requestBuilder)
            {
                Name         = "pathSegment",
                DefaultValue = "path",
                Type         = new CodeType(requestBuilder)
                {
                    Name = "string",
                }
            });
            requestBuilder.SetIndexer(new CodeIndexer(requestBuilder)
            {
                Name       = "idx",
                ReturnType = new CodeType(requestBuilder)
                {
                    Name           = "model",
                    TypeDefinition = model,
                },
            });
            var collectionRequestBuilder = root.AddClass(new CodeClass(root)
            {
                Name = "CollectionRequestBUilder",
            }).First();

            collectionRequestBuilder.AddProperty(new CodeProperty(collectionRequestBuilder)
            {
                Name = "collection",
                Type = new CodeType(requestBuilder)
                {
                    Name           = "requestBuilder",
                    TypeDefinition = requestBuilder,
                },
            });
            ILanguageRefiner.Refine(new GenerationConfiguration {
                Language = GenerationLanguage.Java
            }, root);
            Assert.Single(requestBuilder.GetChildElements(true).OfType <CodeProperty>());
            Assert.Empty(requestBuilder.GetChildElements(true).OfType <CodeIndexer>());
            Assert.Single(collectionRequestBuilder.GetChildElements(true).OfType <CodeMethod>().Where(x => x.IsOfKind(CodeMethodKind.IndexerBackwardCompatibility)));
            Assert.Single(collectionRequestBuilder.GetChildElements(true).OfType <CodeProperty>());
        }
    public void RemovesPropertyRelyingOnSubModules()
    {
        var models        = root.AddNamespace("ApiSdk.models");
        var submodels     = models.AddNamespace($"{models.Name}.submodels");
        var propertyModel = submodels.AddClass(new CodeClass {
            Name = "propertyModel",
            Kind = CodeClassKind.Model
        }).First();
        var mainModel = models.AddClass(new CodeClass {
            Name = "mainModel",
            Kind = CodeClassKind.Model
        }).First();
        var property = mainModel.AddProperty(new CodeProperty {
            Name = "property",
            Type = new CodeType {
                Name           = "propertyModel",
                TypeDefinition = propertyModel
            },
            Kind = CodePropertyKind.Custom
        }).First();

        mainModel.AddMethod(new CodeMethod {
            Name       = $"get{property.Name}",
            Kind       = CodeMethodKind.Getter,
            ReturnType = new CodeType {
                Name           = "propertyModel",
                TypeDefinition = propertyModel
            },
            AccessedProperty = property
        });
        var setter = mainModel.AddMethod(new CodeMethod {
            Name       = $"get{property.Name}",
            Kind       = CodeMethodKind.Getter,
            ReturnType = new CodeType {
                Name       = "void",
                IsExternal = true,
            },
            AccessedProperty = property
        }).First();

        setter.AddParameter(new CodeParameter {
            Name = "value",
            Type = new CodeType {
                Name           = "propertyModel",
                TypeDefinition = propertyModel
            }
        });
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.Go
        }, root);
        Assert.Empty(mainModel.Properties);
        Assert.Empty(mainModel.Methods.Where(x => x.IsAccessor));
    }
Exemple #12
0
    public void EscapesReservedKeywords()
    {
        var model = root.AddClass(new CodeClass {
            Name = "break",
            Kind = CodeClassKind.Model
        }).First();

        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.TypeScript
        }, root);
        Assert.NotEqual("break", model.Name);
        Assert.Contains("escaped", model.Name);
    }
    public void FailsExceptionInheritanceOnErrorClassesWhichAlreadyInherit()
    {
        var model = root.AddClass(new CodeClass {
            Name = "somemodel",
            Kind = CodeClassKind.Model,
            IsErrorDefinition = true,
        }).First();

        model.StartBlock.Inherits = new CodeType {
            Name = "SomeOtherModel"
        };
        Assert.Throws <InvalidOperationException>(() => ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.Go
        }, root));
    }
    public void AddsUsingsForFactoryMethods()
    {
        var parentModel = root.AddClass(new CodeClass {
            Name = "parentModel",
            Kind = CodeClassKind.Model,
        }).First();
        var childModel = root.AddClass(new CodeClass {
            Name = "childModel",
            Kind = CodeClassKind.Model,
        }).First();

        childModel.StartBlock.Inherits = new CodeType {
            Name           = "parentModel",
            TypeDefinition = parentModel,
        };
        var factoryMethod = parentModel.AddMethod(new CodeMethod {
            Name       = "factory",
            Kind       = CodeMethodKind.Factory,
            ReturnType = new CodeType {
                Name           = "parentModel",
                TypeDefinition = parentModel,
            },
        }).First();

        factoryMethod.AddDiscriminatorMapping("ns.childmodel", new CodeType {
            Name           = "childModel",
            TypeDefinition = childModel,
        });
        var requestBuilderClass = root.AddClass(new CodeClass {
            Name = "somerequestbuilder",
            Kind = CodeClassKind.RequestBuilder,
        }).First();
        var requestExecutor = requestBuilderClass.AddMethod(new CodeMethod {
            Name       = "get",
            Kind       = CodeMethodKind.RequestExecutor,
            ReturnType = new CodeType {
                Name           = parentModel.Name,
                TypeDefinition = parentModel,
            },
        }).First();

        Assert.Empty(requestBuilderClass.StartBlock.Usings);
        root.AddNamespace("ApiSdk/models"); // so the interface copy refiner goes through
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.Go
        }, root);
        Assert.Equal(factoryMethod, requestBuilderClass.StartBlock.Usings.First(x => x.Declaration.Name.Equals("factory", StringComparison.OrdinalIgnoreCase)).Declaration.TypeDefinition);
    }
        public void AddInheritedAndMethodTypesImports()
        {
            var model = root.AddClass(new CodeClass {
                Name = "model",
                Kind = CodeClassKind.Model
            }).First();
            var declaration = model.StartBlock as ClassDeclaration;

            declaration.Inherits = new (){
                Name = "someInterface"
            };
            ILanguageRefiner.Refine(new GenerationConfiguration {
                Language = GenerationLanguage.Ruby, ClientNamespaceName = graphNS.Name
            }, root);
            Assert.Equal("someInterface", declaration.Usings.First(usingDef => usingDef.Declaration != null).Declaration?.Name);
        }
    public void AddsExceptionInheritanceOnErrorClasses()
    {
        var model = root.AddClass(new CodeClass {
            Name = "somemodel",
            Kind = CodeClassKind.Model,
            IsErrorDefinition = true,
        }).First();

        root.AddNamespace("ApiSdk/models"); // so the interface copy refiner goes through
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.Go
        }, root);

        Assert.Contains("ApiError", model.StartBlock.Usings.Select(x => x.Name));
        Assert.Equal("ApiError", model.StartBlock.Inherits.Name);
    }
Exemple #17
0
    public void AddsExceptionInheritanceOnErrorClasses()
    {
        var model = root.AddClass(new CodeClass {
            Name = "somemodel",
            Kind = CodeClassKind.Model,
            IsErrorDefinition = true,
        }).First();

        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.TypeScript
        }, root);

        var declaration = model.StartBlock;

        Assert.Contains("ApiError", declaration.Usings.Select(x => x.Name));
        Assert.Equal("ApiError", declaration.Inherits.Name);
    }
    public void MovesClassesWithNamespaceNamesUnderNamespace()
    {
        var graphNS = root.AddNamespace("graph");
        var modelNS = graphNS.AddNamespace("graph.model");
        var model   = graphNS.AddClass(new CodeClass {
            Name = "model",
            Kind = CodeClassKind.Model
        }).First();

        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.CSharp
        }, root);
        Assert.Single(root.GetChildElements(true));
        Assert.Single(graphNS.GetChildElements(true));
        Assert.Single(modelNS.GetChildElements(true));
        Assert.Equal(modelNS, model.Parent);
    }
    public void ReplacesReservedEnumOptions()
    {
        var model = root.AddEnum(new CodeEnum
        {
            Name = "model",
        }).First();
        var option = new CodeEnumOption {
            Name = "break", // this a keyword
        };

        model.AddOption(option);
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.Java
        }, root);
        Assert.Equal("break_escaped", option.Name);
        Assert.Equal("break", option.SerializationName);
    }
        public void AddsDefaultImports()
        {
            var model = root.AddClass(new CodeClass()
            {
                Name = "model",
                Kind = CodeClassKind.Model
            }).First();
            var requestBuilder = root.AddClass(new CodeClass()
            {
                Name = "rb",
                Kind = CodeClassKind.RequestBuilder,
            }).First();

            ILanguageRefiner.Refine(new GenerationConfiguration {
                Language = GenerationLanguage.PHP
            }, root);
            Assert.NotEmpty(model.StartBlock.Usings);
        }
Exemple #21
0
    public void AliasesDuplicateUsingSymbols()
    {
        var model = graphNS.AddClass(new CodeClass {
            Name = "model",
            Kind = CodeClassKind.Model
        }).First();
        var modelsNS = graphNS.AddNamespace($"{graphNS.Name}.models");
        var source1  = modelsNS.AddClass(new CodeClass {
            Name = "source",
            Kind = CodeClassKind.Model
        }).First();
        var submodelsNS = modelsNS.AddNamespace($"{modelsNS.Name}.submodels");
        var source2     = submodelsNS.AddClass(new CodeClass {
            Name = "source",
            Kind = CodeClassKind.Model
        }).First();

        var using1 = new CodeUsing {
            Name        = modelsNS.Name,
            Declaration = new CodeType {
                Name           = source1.Name,
                TypeDefinition = source1,
                IsExternal     = false,
            }
        };
        var using2 = new CodeUsing {
            Name        = submodelsNS.Name,
            Declaration = new CodeType {
                Name           = source2.Name,
                TypeDefinition = source2,
                IsExternal     = false,
            }
        };

        model.AddUsing(using1);
        model.AddUsing(using2);
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.TypeScript
        }, root);
        Assert.NotEmpty(using1.Alias);
        Assert.NotEmpty(using2.Alias);
        Assert.NotEqual(using1.Alias, using2.Alias);
    }
    public void ConvertsUnionTypesToWrapper()
    {
        var model = root.AddClass(new CodeClass {
            Name = "model",
            Kind = CodeClassKind.Model
        }).First();
        var union = new CodeUnionType {
            Name = "union",
        };

        union.AddType(new () {
            Name = "type1",
        }, new() {
            Name = "type2"
        });
        var property = model.AddProperty(new CodeProperty {
            Name = "deserialize",
            Kind = CodePropertyKind.Custom,
            Type = union.Clone() as CodeTypeBase,
        }).First();
        var method = model.AddMethod(new CodeMethod {
            Name       = "method",
            ReturnType = union.Clone() as CodeTypeBase
        }).First();
        var parameter = new CodeParameter {
            Name = "param1",
            Type = union.Clone() as CodeTypeBase
        };
        var indexer = new CodeIndexer {
            Name       = "idx",
            ReturnType = union.Clone() as CodeTypeBase,
        };

        model.SetIndexer(indexer);
        method.AddParameter(parameter);
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.CSharp
        }, root);                                                                                            //using CSharp so the indexer doesn't get removed
        Assert.True(property.Type is CodeType);
        Assert.True(parameter.Type is CodeType);
        Assert.True(method.ReturnType is CodeType);
        Assert.True(indexer.ReturnType is CodeType);
    }
    public void DisambiguatePropertiesWithClassNames()
    {
        var model = root.AddClass(new CodeClass {
            Name = "Model",
            Kind = CodeClassKind.Model
        }).First();
        var propToAdd = model.AddProperty(new CodeProperty {
            Name = "model",
            Type = new CodeType {
                Name = "string"
            }
        }).First();

        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.CSharp
        }, root);
        Assert.Equal("model_prop", propToAdd.Name);
        Assert.Equal("model", propToAdd.SerializationName);
    }
Exemple #24
0
    public void ReplacesDurationByNativeType()
    {
        var model = root.AddClass(new CodeClass {
            Name = "model",
            Kind = CodeClassKind.Model
        }).First();
        var method = model.AddMethod(new CodeMethod {
            Name       = "method",
            ReturnType = new CodeType {
                Name = "TimeSpan"
            },
        }).First();

        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.TypeScript
        }, root);
        Assert.NotEmpty(model.StartBlock.Usings);
        Assert.Equal("Duration", method.ReturnType.Name);
    }
    public void ReplacesModelsByInnerInterfaces()
    {
        var model = root.AddClass(new CodeClass {
            Name = "somemodel",
            Kind = CodeClassKind.Model,
        }).First();
        var requestBuilder = root.AddClass(new CodeClass {
            Name = "somerequestbuilder",
            Kind = CodeClassKind.RequestBuilder,
        }).First();
        var responseModel = requestBuilder.AddInnerClass(new CodeClass {
            Name = "someresponsemodel",
            Kind = CodeClassKind.Model,
        }).First();


        var executorMethod = requestBuilder.AddMethod(new CodeMethod {
            Name       = "Execute",
            Kind       = CodeMethodKind.RequestExecutor,
            ReturnType = new CodeType {
                Name           = responseModel.Name,
                TypeDefinition = responseModel,
            },
        }).First();
        var executorParameter = new CodeParameter {
            Name = "requestBody",
            Kind = CodeParameterKind.RequestBody,
            Type = new CodeType {
                Name           = model.Name,
                TypeDefinition = model,
            },
        };

        executorMethod.AddParameter(executorParameter);
        Assert.Empty(root.GetChildElements(true).OfType <CodeInterface>());
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.Go
        }, root);
        Assert.Single(root.GetChildElements(true).OfType <CodeInterface>());
        var responseInter = requestBuilder.GetChildElements(true).OfType <CodeInterface>().LastOrDefault();

        Assert.NotNull(responseInter);
    }
    public void TrimsCircularDiscriminatorReferences()
    {
        var modelsNS  = root.AddNamespace("models");
        var baseModel = modelsNS.AddClass(new CodeClass {
            Kind = CodeClassKind.Model,
            Name = "BaseModel",
        }).First();

        baseModel.AddProperty(new CodeProperty {
            Name = "Discriminator",
            Type = new CodeType {
                Name = "string"
            },
        });
        var subNamespace = modelsNS.AddNamespace($"{modelsNS.Name}.sub");
        var derivedModel = subNamespace.AddClass(new CodeClass {
            Kind = CodeClassKind.Model,
            Name = "DerivedModel",
        }).First();

        derivedModel.StartBlock.Inherits = new CodeType {
            Name           = baseModel.Name,
            TypeDefinition = baseModel,
        };
        var factoryMethod = baseModel.AddMethod(new CodeMethod {
            Kind       = CodeMethodKind.Factory,
            Name       = "factory",
            ReturnType = new CodeType {
                Name           = baseModel.Name,
                TypeDefinition = baseModel,
            },
        }).First();

        factoryMethod.DiscriminatorPropertyName = "Discriminator";
        factoryMethod.AddDiscriminatorMapping("DerivedModel", new CodeType {
            Name = derivedModel.Name, TypeDefinition = derivedModel
        });
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.Go
        }, root);
        Assert.Empty(factoryMethod.DiscriminatorMappings);
        Assert.Empty(baseModel.Usings.Where(x => x.Name.Equals("models.sub", StringComparison.OrdinalIgnoreCase)));
    }
    public void ReplacesDurationByNativeType()
    {
        var model = root.AddClass(new CodeClass {
            Name = "model",
            Kind = CodeClassKind.Model
        }).First();
        var method = model.AddMethod(new CodeMethod {
            Name       = "method",
            ReturnType = new CodeType {
                Name = "TimeSpan"
            },
        }).First();

        root.AddNamespace("ApiSdk/models"); // so the interface copy refiner goes through
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.Go
        }, root);
        Assert.NotEmpty(model.StartBlock.Usings);
        Assert.Equal("ISODuration", method.ReturnType.Name);
    }
        public void FixInheritedEntityType()
        {
            var model = root.AddClass(new CodeClass {
                Name = "model",
                Kind = CodeClassKind.Model
            }).First();
            var entity = graphNS.AddClass(new CodeClass {
                Name = "entity",
                Kind = CodeClassKind.Model
            }).First();
            var declaration = model.StartBlock as ClassDeclaration;

            declaration.Inherits = new (){
                Name = "entity"
            };
            ILanguageRefiner.Refine(new GenerationConfiguration {
                Language = GenerationLanguage.Ruby, ClientNamespaceName = graphNS.Name
            }, root);
            Assert.Equal("Graph::Entity", declaration.Inherits.Name);
        }
    public void DoesNotEscapePublicPropertiesReservedKeywordsForQueryParameters()
    {
        var model = root.AddClass(new CodeClass {
            Name = "SomeClass",
            Kind = CodeClassKind.QueryParameters
        }).First();
        var property = model.AddProperty(new CodeProperty {
            Name = "select",
            Type = new CodeType {
                Name = "string"
            },
            Access = AccessModifier.Public,
        }).First();

        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.Go
        }, root);
        Assert.Equal("select", property.Name);
        Assert.False(property.IsNameEscaped);
    }
    public void ReplacesRequestBuilderPropertiesByMethods()
    {
        var model = root.AddClass(new CodeClass {
            Name = "someModel",
            Kind = CodeClassKind.RequestBuilder
        }).First();
        var rb = model.AddProperty(new CodeProperty {
            Name = "someProperty",
            Kind = CodePropertyKind.RequestBuilder,
        }).First();

        rb.Type = new CodeType {
            Name = "someType",
        };
        ILanguageRefiner.Refine(new GenerationConfiguration {
            Language = GenerationLanguage.Go
        }, root);
        Assert.Empty(model.Properties);
        Assert.Single(model.Methods.Where(x => x.IsOfKind(CodeMethodKind.RequestBuilderBackwardCompatibility)));
    }