public void TestGenerateOutputOnEmptySpec()
        {
            // arrange
            var spec =
                new Spec
            {
                Targets = new Dictionary <string, TargetInfo>
                {
                    { Constants.TypeScriptTarget, new TargetInfo {
                          Path = "some_path"
                      } }
                }
            };
            var generator = new TypeScriptGenerator();

            // act
            var outputs = generator.GenerateOutputs(spec);

            // assert
            Assert.Equal(0, outputs.Count());
        }
        public void TestGenerateOutputWithEnum()
        {
            // arrange
            var spec =
                new Spec
            {
                Enums = new Dictionary <string, List <EnumMember> >
                {
                    {
                        "blog_entry_status",
                        new List <EnumMember> {
                            new EnumMember {
                                Name = "draft"
                            }, new EnumMember {
                                Name = "final"
                            }
                        }
                    }
                },
                Targets = new Dictionary <string, TargetInfo>
                {
                    { Constants.TypeScriptTarget, new TargetInfo {
                          Path = "some_path"
                      } }
                }
            };

            var generator = new TypeScriptGenerator();

            // act
            var outputs = generator.GenerateOutputs(spec);

            // assert
            var outputList                = outputs?.ToList();
            var indexOutput               = outputList.FirstOrDefault(_ => _.Path == Path.Combine("some_path", "index.ts"));
            var blogEntryStatusOutput     = outputList.FirstOrDefault(_ => _.Path == Path.Combine("some_path", "blog-entry-status.ts"));
            var indexFile                 = (TypeScriptFile)indexOutput?.GenerationRoot;
            var blogEntryStatusOutputFile = (TypeScriptFile)blogEntryStatusOutput?.GenerationRoot;

            Assert.Equal(2, outputList?.Count);
            Assert.NotNull(indexOutput);
            Assert.NotNull(blogEntryStatusOutput);

            Assert.True(
                indexFile
                .Contents
                .Cast <TypeScriptReExportStatement>()
                .HasContents(_ =>
                             _.Object == null &&
                             _.FileName == "blog-entry-status"));
            Assert.True(
                blogEntryStatusOutputFile
                .Contents.OfType <TypeScriptEnum>()
                .HasContents(
                    _ =>
                    _.Name == "BlogEntryStatus" &&
                    _.Members.HasContents(
                        __ => __.Name == "Draft" && __.Value == null,
                        __ => __.Name == "Final" && __.Value == null)));

            Assert.True(
                blogEntryStatusOutputFile
                .Contents.OfType <TypeScriptExportStatement>()
                .HasContents(
                    _ => _.IsDefault && _.Object == "BlogEntryStatus"));
        }
        public void TestGenerateOutputWithClass()
        {
            // arrange
            var spec =
                new Spec
            {
                Entities = new Dictionary <string, EntityInfo>
                {
                    {
                        "blog_entry",
                        new EntityInfo
                        {
                            Members =
                                new OrderedDictionary <string, IEntityMemberInfo>
                            {
                                { "id", new EntityMemberInfo {
                                      Type = "int"
                                  } },
                                { "title", new EntityMemberInfo {
                                      Type = "string"
                                  } }
                            }
                        }
                    }
                },
                Targets = new Dictionary <string, TargetInfo>
                {
                    { Constants.TypeScriptTarget, new TargetInfo {
                          Path = "some_path"
                      } }
                }
            };

            var typeScriptFiles =
                new GeneratorOutput[]
            {
                new GeneratorOutput
                {
                    Path           = Path.Combine("some_path", "blog-entry.ts"),
                    GenerationRoot =
                        TypeScriptFileBuilder.Start()
                        .Content(
                            TypeScriptExportStatementBuilder.Start()
                            .DefaultExport(
                                TypeScriptClassBuilder.Start()
                                .Name("BlogEntry")
                                .Member("id", "number")
                                .Member("title", "string").Build()
                                )
                            .Build())
                        .Build()
                },
                new GeneratorOutput
                {
                    Path           = Path.Combine("some_path", "index.ts"),
                    GenerationRoot =
                        TypeScriptFileBuilder.Start()
                        .Content(new TypeScriptReExportStatement {
                        FileName = "blog-entry"
                    })
                        .Build()
                }
            };
            var ammendment = new AmmendmentFactory().CreateAmmendment(Constants.TypeScriptTarget);

            ammendment.AmmedSpecification(spec);
            var generator = new TypeScriptGenerator();

            // act
            var outputs = generator.GenerateOutputs(spec);

            // assert
            Assert.NotNull(outputs);
            Assert.True(outputs.SequenceEqual(typeScriptFiles, EqualityComparer <GeneratorOutput> .Default));
        }