public void Length_based_for_loop_with_anything_other_than_variable_access_cannot_be_rewritten() { // without the ability to perform a deep syntax comparison, this scenario (somewhat common in decompiled templates) // is not supported :( var bicepFile = @" var items = [ 'a' 'b' 'c' ] var container = { items: items } output test array = [for i in range(0, length(container.items)): { name: '${container.items[i]}' value: container.items[i] index: i }] "; var(_, _, compilation) = CompilationHelper.Compile(("main.bicep", bicepFile)); var rewriter = new ForExpressionSimplifierRewriter(compilation.GetEntrypointSemanticModel()); var newProgramSyntax = rewriter.Rewrite(compilation.SourceFileGrouping.EntryPoint.ProgramSyntax); // Reference equality check to ensure we're not regenerating syntax unnecessarily newProgramSyntax.Should().BeSameAs(compilation.SourceFileGrouping.EntryPoint.ProgramSyntax); }
public void Length_based_for_loop_is_rewritten() { var bicepFile = @" var items = [ 'a' 'b' 'c' ] output test array = [for i in range(0, length(items)): { name: '${items[i]}' value: items[i] }] "; var(_, _, compilation) = CompilationHelper.Compile(("main.bicep", bicepFile)); var rewriter = new ForExpressionSimplifierRewriter(compilation.GetEntrypointSemanticModel()); var newProgramSyntax = rewriter.Rewrite(compilation.SourceFileGrouping.EntryPoint.ProgramSyntax); PrintHelper.PrintAndCheckForParseErrors(newProgramSyntax).Should().Be( @"var items = [ 'a' 'b' 'c' ] output test array = [for item in items: { name: '${item}' value: item }]"); }
public void Length_based_for_loop_is_not_rewritten_with_incorrect_namespace() { var bicepFile = @" var items = [ 'a' 'b' 'c' ] // oops - we've used the wrong namespace! output test array = [for i in az.range(0, az.length(items)): { name: '${items[i]}' value: items[i] }] "; var(_, _, compilation) = CompilationHelper.Compile(("main.bicep", bicepFile)); var rewriter = new ForExpressionSimplifierRewriter(compilation.GetEntrypointSemanticModel()); var newProgramSyntax = rewriter.Rewrite(compilation.SyntaxTreeGrouping.EntryPoint.ProgramSyntax); // Reference equality check to ensure syntax has not been modified newProgramSyntax.Should().BeSameAs(compilation.SyntaxTreeGrouping.EntryPoint.ProgramSyntax); }
public void Loop_inside_a_loop() { var bicepFile = @" var vmNames = [ 'vm1' 'vm2' ] var dataDisks = [ { lun: 0 diskSizeGb: 1023 } { lun: 1 diskSizeGb: 1023 } ] resource vmsLoop 'Microsoft.Compute/virtualMachines@2020-06-01' = [for i in range(0, length(vmNames)): { name: '${vmPrefix}-${vmNames[i]}' location: resourceGroup().location properties: { hardwareProfile: { vmSize: vmSize } osProfile: { computerName: '${vmPrefix}-${vmNames[i]}' adminUsername: '******' adminPassword: adminPassword } storageProfile: { dataDisks: [for j in range(0, length(dataDisks)): { diskSizeGB: dataDisks[j].diskSizeGb lun: dataDisks[j].lun createOption: 'Empty' }] } } }] "; var(_, _, compilation) = CompilationHelper.Compile(("main.bicep", bicepFile)); var rewriter = new ForExpressionSimplifierRewriter(compilation.GetEntrypointSemanticModel()); var newProgramSyntax = rewriter.Rewrite(compilation.SyntaxTreeGrouping.EntryPoint.ProgramSyntax); PrintHelper.PrintAndCheckForParseErrors(newProgramSyntax).Should().Be( @"var vmNames = [ 'vm1' 'vm2' ] var dataDisks = [ { lun: 0 diskSizeGb: 1023 } { lun: 1 diskSizeGb: 1023 } ] resource vmsLoop 'Microsoft.Compute/virtualMachines@2020-06-01' = [for item_1 in vmNames: { name: '${vmPrefix}-${item_1}' location: resourceGroup().location properties: { hardwareProfile: { vmSize: vmSize } osProfile: { computerName: '${vmPrefix}-${item_1}' adminUsername: '******' adminPassword: adminPassword } storageProfile: { dataDisks: [for item in dataDisks: { diskSizeGB: item.diskSizeGb lun: item.lun createOption: 'Empty' }] } } }]"); }