public async Task NameBindingsShouldBeConsistent()

in src/Bicep.Core.IntegrationTests/Semantics/SemanticModelTests.cs [103:178]


        public async Task NameBindingsShouldBeConsistent(DataSet dataSet)
        {
            var (compilation, _, _) = await dataSet.SetupPrerequisitesAndCreateCompilation(TestContext);
            var model = compilation.GetEntrypointSemanticModel();
            var symbolReferences = GetAllBoundSymbolReferences(compilation.SourceFileGrouping.EntryPoint.ProgramSyntax);

            // just a sanity check
            symbolReferences.Should().AllBeAssignableTo<ISymbolReference>();

            foreach (SyntaxBase symbolReference in symbolReferences)
            {
                var symbol = model.GetSymbolInfo(symbolReference);
                symbol.Should().NotBeNull();

                if (dataSet.IsValid)
                {
                    // valid cases should not return error symbols for any symbol reference node
                    symbol.Should().NotBeOfType<ErrorSymbol>();
                    symbol.Should().Match(s =>
                        s is MetadataSymbol ||
                        s is ParameterSymbol ||
                        s is TypeAliasSymbol ||
                        s is AmbientTypeSymbol ||
                        s is VariableSymbol ||
                        s is ResourceSymbol ||
                        s is ModuleSymbol ||
                        s is OutputSymbol ||
                        s is FunctionSymbol ||
                        s is DeclaredFunctionSymbol ||
                        s is ExtensionNamespaceSymbol ||
                        s is BuiltInNamespaceSymbol ||
                        s is LocalVariableSymbol ||
                        s is TestSymbol ||
                        s is ImportedTypeSymbol ||
                        s is ImportedVariableSymbol ||
                        s is ImportedFunctionSymbol ||
                        s is WildcardImportSymbol);
                }
                else
                {
                    // invalid files may return errors
                    symbol.Should().Match(s =>
                        s is ErrorSymbol ||
                        s is MetadataSymbol ||
                        s is ParameterSymbol ||
                        s is TypeAliasSymbol ||
                        s is AmbientTypeSymbol ||
                        s is VariableSymbol ||
                        s is ResourceSymbol ||
                        s is ModuleSymbol ||
                        s is OutputSymbol ||
                        s is FunctionSymbol ||
                        s is DeclaredFunctionSymbol ||
                        s is ExtensionNamespaceSymbol ||
                        s is BuiltInNamespaceSymbol ||
                        s is LocalVariableSymbol ||
                        s is TestSymbol ||
                        s is ImportedTypeSymbol ||
                        s is ImportedVariableSymbol ||
                        s is ImportedFunctionSymbol ||
                        s is ErroredImportSymbol ||
                        s is WildcardImportSymbol);
                }

                var foundRefs = model.FindReferences(symbol!);

                // the returned references should contain the original ref that we used to find the symbol
                foundRefs.Should().Contain(symbolReference);

                // each ref should map to the same exact symbol
                foreach (SyntaxBase foundRef in foundRefs)
                {
                    model.GetSymbolInfo(foundRef).Should().BeSameAs(symbol);
                }
            }
        }