示例#1
0
        public void GenerateResourcesAsyncWithOperationCancelledError(IResourceGenerator generator, AzureIntegrationServicesModel model, IList <YamlStream> config, Exception e)
        {
            "Given a resource generator"
            .x(() => generator = new YamlResourceGenerator(_mockLogger.Object));

            "And a model"
            .x(() => model = _model);

            "And configuration"
            .x(async() =>
            {
                var renderer   = new LiquidTemplateRenderer(_mockLogger.Object);
                var repository = new FileConfigurationRepository(renderer, _mockLogger.Object);
                await repository.RenderConfigurationAsync(model, OkMultiConfigPath, _tempOutputTemplatePath);
                config = repository.GetConfiguration(_tempOutputTemplatePath);
            });

            "And a cancelled token"
            .x(() => _source.Cancel());

            "When generating resources"
            .x(async() => e = await Record.ExceptionAsync(async() => await generator.GenerateResourcesAsync(model, config, _source.Token)));

            "Then the generation should error"
            .x(() => e.Should().NotBeNull().And.Subject.Should().BeOfType <OperationCanceledException>());
        }
示例#2
0
        public static BodyResourceData Load(IResourceGenerator generator, CelestialBody body, ConfigNode bodyNode)
        {
            if (bodyNode == null)
            {
                bodyNode = new ConfigNode();
            }
            var resources = generator.Load(body, bodyNode.GetNode("GeneratorData"));
            var scans     = new CellSet(KethaneData.GridLevel);

            var scanMask = bodyNode.GetValue("ScanMask");

            if (scanMask != null)
            {
                try
                {
                    scans = new CellSet(KethaneData.GridLevel, Misc.FromBase64String(scanMask));
                }
                catch (FormatException e)
                {
                    Debug.LogError(String.Format("[Kethane] Failed to parse {0} scan string, resetting ({1})", body.name, e.Message));
                }
            }

            return(new BodyResourceData(resources, scans));
        }
 /// <summary>
 /// Creates a new instance of a <see cref="ResourceGeneratorAnalyzer"/> class.
 /// </summary>
 /// <param name="repository">The repository.</param>
 /// <param name="generator">The generator.</param>
 /// <param name="model">The model.</param>
 /// <param name="context">The context.</param>
 /// <param name="logger">A logger.</param>
 public ResourceGeneratorAnalyzer(IConfigurationRepository repository, IResourceGenerator generator, IApplicationModel model, MigrationContext context, ILogger logger)
     : base(nameof(ResourceGeneratorAnalyzer), model, context, logger)
 {
     // Validate and set the member.
     _repository = repository ?? throw new ArgumentNullException(nameof(repository));
     _generator  = generator ?? throw new ArgumentNullException(nameof(generator));
     _logger     = logger ?? throw new ArgumentNullException(nameof(logger));
 }
示例#4
0
 public void Generate(IResourceGenerator generator, IZetboxServerContext ctx, IEnumerable<Zetbox.App.Base.Module> modules)
 {
     using (var writer = generator.AddFile("ZetboxBase\\Modules")) // See ZetboxAssetKeys.Modules
     {
         foreach (var m in modules.OrderBy(m => m.Name))
         {
             writer.AddResource(ZetboxAssetKeys.ConstructNameKey(m), m.Name);
             writer.AddResource(ZetboxAssetKeys.ConstructDescriptionKey(m), m.Description);
         }
     }
 }
示例#5
0
        public void GenerateResourcesWithMultipleTargetsAsyncWithSuccess(IResourceGenerator generator, AzureIntegrationServicesModel model, IList <YamlStream> config, Exception e)
        {
            "Given a resource generator"
            .x(() => generator = new YamlResourceGenerator(_mockLogger.Object));

            "And a model"
            .x(() =>
            {
                model = _model;
                model.MigrationTarget.TargetEnvironment = AzureIntegrationServicesTargetEnvironment.Consumption;
            });

            "And configuration"
            .x(async() =>
            {
                var renderer   = new LiquidTemplateRenderer(_mockLogger.Object);
                var repository = new FileConfigurationRepository(renderer, _mockLogger.Object);
                await repository.RenderConfigurationAsync(model, OkConfigPath, _tempOutputTemplatePath);
                config = repository.GetConfiguration(_tempOutputTemplatePath);
            });

            "When generating resources"
            .x(async() => e = await Record.ExceptionAsync(async() => await generator.GenerateResourcesAsync(model, config, _source.Token)));

            "Then the generation should succeed"
            .x(() => e.Should().BeNull());

            "And the model should have been populated with the template resources from the configuration"
            .x(() =>
            {
                model.MigrationTarget.MessageBus.Resources.Should().HaveCount(10);
                var app = model.MigrationTarget.MessageBus.Applications.Where(a => a.Name == "AppA").SingleOrDefault();
                app.Should().NotBeNull();
                app.Resources.Should().HaveCount(2);
                var msg = app.Messages.SingleOrDefault();
                msg.Should().NotBeNull();
                msg.Resources.Should().HaveCount(1);
            });

            "And the model should have been populated with the snippet resources from the configuration"
            .x(() =>
            {
                var app = model.MigrationTarget.MessageBus.Applications.Where(a => a.Name == "AppA").SingleOrDefault();
                app.Should().NotBeNull();
                var processManagers = app.Intermediaries.Where(i => i is ProcessManager);
                processManagers.Should().NotBeNull().And.HaveCount(1);
                var processManager = processManagers.Single();
                processManager.Snippets.Should().HaveCount(11);
            });
        }
示例#6
0
        public void ConstructWithSuccess(IResourceGenerator generator, ILogger logger, Exception e)
        {
            "Given a null generator"
            .x(() => generator.Should().BeNull());

            "And a logger"
            .x(() => logger = _mockLogger.Object);

            "When constructing the generator"
            .x(() => e = Record.Exception(() => new YamlResourceGenerator(logger)));

            "Then the constructor should succeed"
            .x(() => e.Should().BeNull());
        }
示例#7
0
        public void ConstructWithNullLogger(IResourceGenerator generator, ILogger logger, Exception e)
        {
            "Given a null generator"
            .x(() => generator.Should().BeNull());

            "And a null logger"
            .x(() => logger.Should().BeNull());

            "When constructing the generator with null logger"
            .x(() => e = Record.Exception(() => new YamlResourceGenerator(logger)));

            "Then the constructor should throw an exception"
            .x(() => e.Should().NotBeNull().And.Subject.Should().BeOfType <ArgumentNullException>().Which.ParamName.Should().Be("logger"));
        }
示例#8
0
        public void Generate(IResourceGenerator generator, IZetboxServerContext ctx, IEnumerable<Zetbox.App.Base.Module> modules)
        {
            var moduleNames = modules.Select(m => m.Name).ToArray();

            using (var writer = generator.AddFile("GUI\\NavigationEntries")) // See ZetboxAssetKeys.NavigationEntries
            {
                foreach (var nav in ctx.GetQuery<NavigationEntry>()
                                        .ToList()
                                        .Where(e => moduleNames.Contains(e.Module.Name))
                                        .OrderBy(e => e.Title))
                {
                    writer.AddResource(ZetboxAssetKeys.ConstructTitleKey(nav), nav.Title);
                    writer.AddResource(ZetboxAssetKeys.ConstructColorKey(nav), nav.Color);
                }
            }
        }
示例#9
0
        public void Generate(IResourceGenerator generator, IZetboxServerContext ctx, IEnumerable<Zetbox.App.Base.Module> modules)
        {
            var moduleNames = modules.Select(m => m.Name).ToArray();

            using (var writer = generator.AddFile("GUI\\Applications")) // See ZetboxAssetKeys.Applications
            {
                foreach (var app in ctx.GetQuery<Application>()
                                        .ToList()
                                        .Where(a => moduleNames.Contains(a.Module.Name))
                                        .OrderBy(a => a.Name))
                {
                    writer.AddResource(ZetboxAssetKeys.ConstructNameKey(app), app.Name);
                    writer.AddResource(ZetboxAssetKeys.ConstructDescriptionKey(app), app.Description);
                }
            }
        }
示例#10
0
        public void GenerateResourcesAsyncWithConfigNullError(IResourceGenerator generator, AzureIntegrationServicesModel model, IList <YamlStream> config, Exception e)
        {
            "Given a resource generator"
            .x(() => generator = new YamlResourceGenerator(_mockLogger.Object));

            "And a model"
            .x(() => model = _model);

            "And null configuration"
            .x(() => config.Should().BeNull());

            "When generating resources"
            .x(async() => e = await Record.ExceptionAsync(async() => await generator.GenerateResourcesAsync(model, config, _source.Token)));

            "Then the generation should error"
            .x(() => e.Should().NotBeNull().And.Subject.Should().BeOfType <ArgumentNullException>().Which.ParamName.Should().Be("config"));
        }
示例#11
0
        public void Generate(IResourceGenerator generator, IZetboxServerContext ctx, IEnumerable<Zetbox.App.Base.Module> modules)
        {
            var moduleNames = modules.Select(m => m.Name).ToArray();

            var tags = GetTags(ctx, moduleNames);
            var exceptTags = moduleNames.Contains("ZetboxBase")
                    ? new List<string>()
                    : GetTags(ctx, "ZetboxBase", "GUI");

            using (var writer = generator.AddFile("ZetboxBase\\CategoryTags"))
            {
                foreach (var tag in tags.Except(exceptTags).OrderBy(i => i))
                {
                    if(!string.IsNullOrWhiteSpace(tag))
                        writer.AddResource(tag, tag);
                }
            }
        }
示例#12
0
        public static BodyResourceData Load(IResourceGenerator generator, CelestialBody body, ConfigNode bodyNode)
        {
            if (bodyNode == null) { bodyNode = new ConfigNode(); }
            var resources = generator.Load(body, bodyNode.GetNode("GeneratorData"));
            var scans = new CellSet(KethaneData.GridLevel);

            var scanMask = bodyNode.GetValue("ScanMask");
            if (scanMask != null)
            {
                try
                {
                    scans = new CellSet(KethaneData.GridLevel, Misc.FromBase64String(scanMask));
                }
                catch (FormatException e)
                {
                    Debug.LogError(String.Format("[Kethane] Failed to parse {0} scan string, resetting ({1})", body.name, e.Message));
                }
            }

            return new BodyResourceData(resources, scans);
        }
示例#13
0
        public static ResourceData Load(ResourceDefinition resource, ConfigNode resourceNode)
        {
            var bodyResources = new Dictionary<CelestialBody, BodyResourceData>();

            var generatorNode = resourceNode.GetNode("Generator") ?? resource.Generator;
            var generator = createGenerator(generatorNode.CreateCopy());
            if (generator == null)
            {
                Debug.LogWarning("[Kethane] Defaulting to empty generator for " + resource.Resource);
                generator = new EmptyResourceGenerator();
            }

            var bodyNodes = resourceNode.GetNodes("Body");

            foreach (var body in FlightGlobals.Bodies)
            {
                var bodyNode = bodyNodes.SingleOrDefault(n => n.GetValue("Name") == body.name);
                bodyResources[body] = BodyResourceData.Load(generator, body, bodyNode);
            }

            return new ResourceData(generator, generatorNode, bodyResources);
        }
示例#14
0
        public void GenerateResourcesAsyncWithMissingResourceMapKeyWithDebug(IResourceGenerator generator, AzureIntegrationServicesModel model, IList <YamlStream> config, Exception e)
        {
            "Given a resource generator"
            .x(() => generator = new YamlResourceGenerator(_mockLogger.Object));

            "And a model with a missing application resource map key"
            .x(() =>
            {
                model = _model;
                model.MigrationTarget.MessageBus.Applications.Where(a => a.Name == "System").Single().ResourceMapKey = null;
            });

            "And configuration"
            .x(async() =>
            {
                var renderer   = new LiquidTemplateRenderer(_mockLogger.Object);
                var repository = new FileConfigurationRepository(renderer, _mockLogger.Object);
                await repository.RenderConfigurationAsync(model, OkMultiConfigPath, _tempOutputTemplatePath);
                config = repository.GetConfiguration(_tempOutputTemplatePath);
            });

            "When generating resources"
            .x(async() => e = await Record.ExceptionAsync(async() => await generator.GenerateResourcesAsync(model, config, _source.Token)));

            "Then the generation should succeed"
            .x(() => e.Should().BeNull());

            "And it should have issued a debug message"
            .x(() =>
            {
                // Verify debug log message output once
                _mockLogger.Verify(l => l.Log(
                                       It.Is <LogLevel>(l => l == LogLevel.Debug),
                                       It.IsAny <EventId>(),
                                       It.Is <It.IsAnyType>((v, t) => v.ToString().Contains("is not associated with a resource map key", StringComparison.CurrentCultureIgnoreCase)),
                                       It.IsAny <Exception>(),
                                       It.Is <Func <It.IsAnyType, Exception, string> >((v, t) => true)), Times.Once);
            });
        }
示例#15
0
        public static ResourceData Load(ResourceDefinition resource, ConfigNode resourceNode)
        {
            var bodyResources = new Dictionary <CelestialBody, BodyResourceData>();

            var generatorNode = resourceNode.GetNode("Generator") ?? resource.Generator;
            var generator     = createGenerator(generatorNode.CreateCopy());

            if (generator == null)
            {
                Debug.LogWarning("[Kethane] Defaulting to empty generator for " + resource.Resource);
                generator = new EmptyResourceGenerator();
            }

            var bodyNodes = resourceNode.GetNodes("Body");

            foreach (var body in FlightGlobals.Bodies)
            {
                var bodyNode = bodyNodes.SingleOrDefault(n => n.GetValue("Name") == body.name);
                bodyResources[body] = BodyResourceData.Load(generator, body, bodyNode);
            }

            return(new ResourceData(generator, generatorNode, bodyResources));
        }
示例#16
0
        public void Generate(IResourceGenerator generator, IZetboxServerContext ctx, IEnumerable<Zetbox.App.Base.Module> modules)
        {
            var moduleNames = modules.Select(m => m.Name).ToArray();

            using (var writer = generator.AddFile("ZetboxBase\\DataTypes")) // See ZetboxAssetKeys.DataTypes
            {
                foreach (var dt in ctx.GetQuery<DataType>()
                                        .ToList()
                                        .Where(dt => moduleNames.Contains(dt.Module.Name))
                                        .OrderBy(dt => dt.Name))
                {
                    writer.AddResource(ZetboxAssetKeys.ConstructNameKey(dt), dt.Name);
                    writer.AddResource(ZetboxAssetKeys.ConstructDescriptionKey(dt), dt.Description);
                }
            }

            foreach (var grp in ctx.GetQuery<Property>()
                                        .ToList()
                                        .Where(p => moduleNames.Contains(p.Module.Name))
                                        .GroupBy(p => p.ObjectClass)
                                        .OrderBy(p => p.Key.Module.Namespace)
                                        .ThenBy(p => p.Key.Name))
            {
                var dtName = grp.Key.Module.Namespace + "." + grp.Key.Name;
                using (var writer = generator.AddFile("ZetboxBase\\Properties\\" + dtName)) // See ZetboxAssetKeys.ConstructBaseName
                {
                    foreach (var prop in grp.OrderBy(p => p.Name))
                    {
                        writer.AddResource(ZetboxAssetKeys.ConstructLabelKey(prop), string.IsNullOrWhiteSpace(prop.Label) ? prop.Name : prop.Label);
                        writer.AddResource(ZetboxAssetKeys.ConstructDescriptionKey(prop), prop.Description);
                    }
                }
            }

            foreach (var grp in ctx.GetQuery<Method>()
                                        .ToList()
                                        .Where(m => moduleNames.Contains(m.Module.Name))
                                        .GroupBy(m => m.ObjectClass)
                                        .OrderBy(m => m.Key.Module.Namespace)
                                        .ThenBy(m => m.Key.Name))
            {
                var dtName = grp.Key.Module.Namespace + "." + grp.Key.Name;
                using (var writer = generator.AddFile("ZetboxBase\\Methods\\" + dtName)) // See ZetboxAssetKeys.ConstructBaseName
                {
                    foreach (var meth in grp.OrderBy(p => p.Name))
                    {
                        writer.AddResource(ZetboxAssetKeys.ConstructLabelKey(meth), string.IsNullOrWhiteSpace(meth.Label) ? meth.Name : meth.Label);
                        writer.AddResource(ZetboxAssetKeys.ConstructDescriptionKey(meth), meth.Description);

                        foreach (var param in meth.Parameter)
                        {
                            writer.AddResource(ZetboxAssetKeys.ConstructLabelKey(param), string.IsNullOrWhiteSpace(param.Label) ? param.Name : param.Label);
                            writer.AddResource(ZetboxAssetKeys.ConstructDescriptionKey(param), param.Description);
                        }
                    }
                }
            }

            foreach (var enumeration in ctx.GetQuery<Enumeration>()
                                            .ToList()
                                            .Where(dt => moduleNames.Contains(dt.Module.Name))
                                            .OrderBy(dt => dt.Name))
            {
                using (var writer = generator.AddFile("ZetboxBase\\Enumerations\\" + enumeration.Module.Namespace + "." + enumeration.Name)) // See ZetboxAssetKeys.ConstructBaseName
                {
                    foreach (var entry in enumeration.EnumerationEntries)
                    {
                        writer.AddResource(ZetboxAssetKeys.ConstructLabelKey(entry), string.IsNullOrWhiteSpace(entry.Label) ? entry.Name : entry.Label);
                        writer.AddResource(ZetboxAssetKeys.ConstructDescriptionKey(entry), entry.Description);
                    }
                }
            }
        }
示例#17
0
 protected ResourceData(IResourceGenerator generator, ConfigNode generatorNode, IDictionary <CelestialBody, BodyResourceData> bodies)
 {
     this.generator     = generator;
     this.generatorNode = generatorNode;
     this.bodies        = new Dictionary <CelestialBody, BodyResourceData>(bodies);
 }
示例#18
0
        public void ConstructWithNullRepository(ResourceGeneratorAnalyzer analyzer, IConfigurationRepository repository, IResourceGenerator generator, IApplicationModel model, ILogger logger, MigrationContext context, Exception e)
        {
            "Given an analyzer"
            .x(() => analyzer.Should().BeNull());

            "And a null repository"
            .x(() => repository.Should().BeNull());

            "And a generator"
            .x(() => generator = _mockGenerator.Object);

            "And a model"
            .x(() => model = TestHelper.CreateDefaultModelForAnalyzing());

            "And a context"
            .x(() => context = TestHelper.BuildContext());

            "And a logger"
            .x(() => logger = _mockLogger.Object);

            "When constructing with a null repository"
            .x(() => e = Record.Exception(() => new ResourceGeneratorAnalyzer(repository, generator, model, context, logger)));

            "Then the constructor should throw an exception"
            .x(() => e.Should().NotBeNull().And.Subject.Should().BeOfType <ArgumentNullException>().Which.ParamName.Should().Be("repository"));
        }
示例#19
0
        public void ConstructWithSuccess(ResourceGeneratorAnalyzer analyzer, IConfigurationRepository repository, IResourceGenerator generator, IApplicationModel model, ILogger logger, MigrationContext context, Exception e)
        {
            "Given an analyzer"
            .x(() => analyzer.Should().BeNull());

            "And a repository"
            .x(() => repository = _mockRepository.Object);

            "And a generator"
            .x(() => generator = _mockGenerator.Object);

            "And a model"
            .x(() => model = TestHelper.CreateDefaultModelForAnalyzing());

            "And a context"
            .x(() => context = TestHelper.BuildContext());

            "And a logger"
            .x(() => logger = _mockLogger.Object);

            "When constructing"
            .x(() => e = Record.Exception(() => new ResourceGeneratorAnalyzer(repository, generator, model, context, logger)));

            "Then the constructor should succeed"
            .x(() => e.Should().BeNull());
        }
示例#20
0
 protected ResourceData(IResourceGenerator generator, ConfigNode generatorNode, IDictionary<CelestialBody, BodyResourceData> bodies)
 {
     this.generator = generator;
     this.generatorNode = generatorNode;
     this.bodies = new Dictionary<CelestialBody, BodyResourceData>(bodies);
 }