public void Imported_function_symbols_with_a_lengthy_reference_chain_should_have_declarations_injected_into_compiled_template()

in src/Bicep.Core.IntegrationTests/CompileTimeImportTests.cs [945:1161]


    public void Imported_function_symbols_with_a_lengthy_reference_chain_should_have_declarations_injected_into_compiled_template()
    {
        var result = CompilationHelper.Compile(
            ("main.bicep", """
                import {foo} from 'mod.bicep'

                var greeting = foo('friend')
                """),
            ("mod.bicep", """
                import {bar} from 'mod2.bicep'

                @export()
                func foo(name nonEmptyString) nonEmptyString => bar(name)

                @minLength(1)
                type nonEmptyString = string
                """),
            ("mod2.bicep", """
                import * as baz from 'mod3.bicep'

                @export()
                func bar(name nonEmptyString) nonEmptyString => baz.quux(name)

                @minLength(1)
                type nonEmptyString = string
                """),
            ("mod3.bicep", """
                import {greet} from 'mod4.bicep'

                @export()
                func quux(name nonEmptyString) nonEmptyString => indirection(name)

                func indirection(name nonEmptyString) nonEmptyString => greet(name)

                @minLength(1)
                type nonEmptyString = string
                """),
            ("mod4.bicep", """
                import {nonEmptyString} from 'mod5.bicep'

                @export()
                func greet(name indirection) indirection => 'Hi, ${name}!'

                type indirection = nonEmptyString
                """),
            ("mod5.bicep", """
                @export()
                @minLength(1)
                type nonEmptyString = string
                """));

        result.ExcludingLinterDiagnostics().Should().NotHaveAnyDiagnostics();
        result.Template.Should().HaveValueAtPath("definitions", JToken.Parse($$"""
            {
                "_1.nonEmptyString": {
                    "type": "string",
                    "minLength": 1,
                    "metadata": {
                        "{{LanguageConstants.MetadataImportedFromPropertyName}}": {
                            "{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod.bicep"
                        }
                    }
                },
                "_2.nonEmptyString": {
                    "type": "string",
                    "minLength": 1,
                    "metadata": {
                        "{{LanguageConstants.MetadataImportedFromPropertyName}}": {
                            "{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod2.bicep"
                        }
                    }
                },
                "_3.nonEmptyString": {
                    "type": "string",
                    "minLength": 1,
                    "metadata": {
                        "{{LanguageConstants.MetadataImportedFromPropertyName}}": {
                            "{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod3.bicep"
                        }
                    }
                },
                "_4.indirection": {
                    "$ref": "#/definitions/_5.nonEmptyString",
                    "metadata": {
                        "{{LanguageConstants.MetadataImportedFromPropertyName}}": {
                            "{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod4.bicep"
                        }
                    }
                },
                "_5.nonEmptyString": {
                    "type": "string",
                    "minLength": 1,
                    "metadata": {
                        "{{LanguageConstants.MetadataImportedFromPropertyName}}": {
                            "{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod5.bicep"
                        }
                    }
                },
            }
            """));

        result.Template.Should().HaveValueAtPath("functions", JToken.Parse($$"""
            [
                {
                    "namespace": "_2",
                    "members": {
                        "bar": {
                            "parameters": [
                                {
                                    "$ref": "#/definitions/_2.nonEmptyString",
                                    "name": "name"
                                }
                            ],
                            "output": {
                                "$ref": "#/definitions/_2.nonEmptyString",
                                "value": "[_3.quux(parameters('name'))]"
                            },
                            "metadata": {
                                "{{LanguageConstants.MetadataImportedFromPropertyName}}": {
                                    "{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod2.bicep"
                                }
                            }
                        }
                    }
                },
                {
                    "namespace": "__bicep",
                    "members": {
                        "foo": {
                            "parameters": [
                                {
                                    "$ref": "#/definitions/_1.nonEmptyString",
                                    "name": "name"
                                }
                            ],
                            "output": {
                                "$ref": "#/definitions/_1.nonEmptyString",
                                "value": "[_2.bar(parameters('name'))]"
                            },
                            "metadata": {
                                "{{LanguageConstants.MetadataImportedFromPropertyName}}": {
                                    "{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod.bicep"
                                }
                            }
                        }
                    }
                },
                {
                    "namespace": "_4",
                    "members": {
                        "greet": {
                            "parameters": [
                                {
                                    "$ref": "#/definitions/_4.indirection",
                                    "name": "name"
                                }
                            ],
                            "output": {
                                "$ref": "#/definitions/_4.indirection",
                                "value": "[format('Hi, {0}!', parameters('name'))]"
                            },
                            "metadata": {
                                "{{LanguageConstants.MetadataImportedFromPropertyName}}": {
                                    "{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod4.bicep"
                                }
                            }
                        }
                    }
                },
                {
                    "namespace": "_3",
                    "members": {
                        "indirection": {
                            "parameters": [
                                {
                                    "$ref": "#/definitions/_3.nonEmptyString",
                                    "name": "name"
                                }
                            ],
                            "output": {
                                "$ref": "#/definitions/_3.nonEmptyString",
                                "value": "[_4.greet(parameters('name'))]"
                            },
                            "metadata": {
                                "{{LanguageConstants.MetadataImportedFromPropertyName}}": {
                                    "{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod3.bicep"
                                }
                            }
                        },
                        "quux": {
                            "parameters": [
                                {
                                    "$ref": "#/definitions/_3.nonEmptyString",
                                    "name": "name"
                                }
                            ],
                            "output": {
                                "$ref": "#/definitions/_3.nonEmptyString",
                                "value": "[_3.indirection(parameters('name'))]"
                            },
                            "metadata": {
                                "{{LanguageConstants.MetadataImportedFromPropertyName}}": {
                                    "{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod3.bicep"
                                }
                            }
                        }
                    }
                }
            ]
            """));

        result.Template.Should().HaveValueAtPath("variables", JToken.Parse($$"""
            {
                "greeting": "[__bicep.foo('friend')]"
            }
            """));
    }