private ObjectTheoremResult TryToRemoveWrongAssumption(EFRoslynTheorem efRoslynTheorem, ObjectTheoremResult result,
                                                               List <IClassAssumption> classAssumptions, List <IPropertyAssumption> propertyAssumptions)
        {
            foreach (var assumes in classAssumptions)
            {
                if (result.IsAssumptionWrong(assumes.Assumption))
                {
                    classAssumptions.Remove(assumes);
                    efRoslynTheorem.RemoveAssumption(assumes.Assumption);
                    return(efRoslynTheorem.ReSolve());
                }
            }

            foreach (var assumes in propertyAssumptions)
            {
                if (result.IsAssumptionWrong(assumes.Assumption))
                {
                    propertyAssumptions.Remove(assumes);
                    efRoslynTheorem.RemoveAssumption(assumes.Assumption);
                    return(efRoslynTheorem.ReSolve());
                }
            }

            return(null);
        }
        public async Task RoslynWith_EFScenarioBad()
        {
            // Arrange
            var projectFilePath = @"..\..\..\EFScenario.Bad\EFScenario.Bad.csproj";

            var compilation = await LoadProjectAndGetCompilationAsync(projectFilePath);
            INamedTypeSymbol dbContextTypeSymbol;
            var entityTypeSymbols = SymbolHelper.GetAllEntityTypesFromDbContext(compilation, out dbContextTypeSymbol);

            // Act
            var efRoslynTheorem = new EFRoslynTheorem();
            ObjectTheoremResult solved = efRoslynTheorem.Solve(entityTypeSymbols);

            // Assert
            Assert.IsNotNull(solved);
            Assert.AreEqual(Status.Unsatisfiable, solved.Status);

            foreach (var assumes in efRoslynTheorem.ClassAssumptions)
            {
                efRoslynTheorem.RemoveAssumption(assumes.Assumption);
            }

            foreach (var assumes in efRoslynTheorem.PropertyAssumptions)
            {
                efRoslynTheorem.RemoveAssumption(assumes.Assumption);
            }

            solved = efRoslynTheorem.ReSolve();
            Assert.IsNotNull(solved);
            Assert.AreEqual(Status.Satisfiable, solved.Status);
        }
Beispiel #3
0
        public static string Add(Compilation compilation, EFRoslynTheorem efRoslynTheorem, ObjectTheoremResult objectTheoremResult)
        {
            var cacheId = compilation.AssemblyName;

            _cache[cacheId] = new Item(compilation, efRoslynTheorem, objectTheoremResult);
            return(cacheId);
        }
Beispiel #4
0
        public async Task RoslynWith_EFScenarioBad()
        {
            // Arrange
            var projectFilePath = @"..\..\..\EFScenario.Bad\EFScenario.Bad.csproj";

            var compilation = await LoadProjectAndGetCompilationAsync(projectFilePath);

            INamedTypeSymbol dbContextTypeSymbol;
            var entityTypeSymbols = SymbolHelper.GetAllEntityTypesFromDbContext(compilation, out dbContextTypeSymbol);

            // Act
            var efRoslynTheorem        = new EFRoslynTheorem();
            ObjectTheoremResult solved = efRoslynTheorem.Solve(entityTypeSymbols);

            // Assert
            Assert.IsNotNull(solved);
            Assert.AreEqual(Status.Unsatisfiable, solved.Status);

            foreach (var assumes in efRoslynTheorem.ClassAssumptions)
            {
                efRoslynTheorem.RemoveAssumption(assumes.Assumption);
            }

            foreach (var assumes in efRoslynTheorem.PropertyAssumptions)
            {
                efRoslynTheorem.RemoveAssumption(assumes.Assumption);
            }

            solved = efRoslynTheorem.ReSolve();
            Assert.IsNotNull(solved);
            Assert.AreEqual(Status.Satisfiable, solved.Status);
        }
        private void AnalyzeCompilation(CompilationAnalysisContext context)
        {
            Trace.WriteLine("AnalyzeCompilation");

            try
            {
                INamedTypeSymbol dbContextTypeSymbol;
                IEnumerable <INamedTypeSymbol> entityTypeSymbols = SymbolHelper.GetAllEntityTypesFromDbContext(context.Compilation, out dbContextTypeSymbol);
                if (!entityTypeSymbols.Any())
                {
                    return;
                }

                var allTypeSymbols   = context.Compilation.GetSymbolsWithName(s => !s.EndsWith("DbContext"), SymbolFilter.Type).Cast <INamedTypeSymbol>();
                var allMemberSymbols = allTypeSymbols.SelectMany(t => t.GetMembers().Where(m => m.Kind == SymbolKind.Property));
                Trace.WriteLine("Class count: " + allTypeSymbols.Count());
                Trace.WriteLine("Property count: " + allMemberSymbols.Count());

                var efRoslynTheorem = new EFRoslynTheorem();
                var result          = efRoslynTheorem.Solve(entityTypeSymbols);
                if (result.Status == Status.Unsatisfiable)
                {
                    var classAssumptions    = efRoslynTheorem.ClassAssumptions.ToList();
                    var propertyAssumptions = efRoslynTheorem.PropertyAssumptions.OrderBy(pa => pa.Rank).ToList();

                    do
                    {
                        result = TryToRemoveWrongAssumption(efRoslynTheorem, result, classAssumptions, propertyAssumptions);
                    } while (result != null && result.Status != Status.Satisfiable);

                    if (result == null || result.Status != Status.Satisfiable)
                    {
                        var diagnostic2 = Diagnostic.Create(UnsatisfiableRule, dbContextTypeSymbol.Locations[0], dbContextTypeSymbol.Name);
                        Trace.WriteLine("ReportDiagnostic " + diagnostic2.Descriptor.Id);
                        context.ReportDiagnostic(diagnostic2);
                        return;
                    }

                    var cacheId = EFRoslynTheoremCache.Add(context.Compilation, efRoslynTheorem, result);

                    var props = ImmutableDictionary.Create <string, string>();
                    props = props.Add("CacheId", cacheId);

                    var diagnostic = Diagnostic.Create(SatisfiableRule, dbContextTypeSymbol.Locations[0], props, dbContextTypeSymbol.Name);
                    Trace.WriteLine("ReportDiagnostic " + diagnostic.Descriptor.Id);
                    context.ReportDiagnostic(diagnostic);
                }
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex.ToString());
                throw;
            }
        }
        public async Task RoslynWith_EFScenarioGood()
        {
            // Arrange
            var projectFilePath = @"..\..\..\EFScenario.Good\EFScenario.Good.csproj";

            var compilation = await LoadProjectAndGetCompilationAsync(projectFilePath);
            INamedTypeSymbol dbContextTypeSymbol;
            var entityTypeSymbols = SymbolHelper.GetAllEntityTypesFromDbContext(compilation, out dbContextTypeSymbol);

            // Act
            var efRoslynTheorem = new EFRoslynTheorem();
            ObjectTheoremResult solved = efRoslynTheorem.Solve(entityTypeSymbols);

            // Assert
            Assert.IsNotNull(solved);
            Assert.AreEqual(Status.Satisfiable, solved.Status);
        }
Beispiel #7
0
        public async Task RoslynWith_EFScenarioGood()
        {
            // Arrange
            var projectFilePath = @"..\..\..\EFScenario.Good\EFScenario.Good.csproj";

            var compilation = await LoadProjectAndGetCompilationAsync(projectFilePath);

            INamedTypeSymbol dbContextTypeSymbol;
            var entityTypeSymbols = SymbolHelper.GetAllEntityTypesFromDbContext(compilation, out dbContextTypeSymbol);

            // Act
            var efRoslynTheorem        = new EFRoslynTheorem();
            ObjectTheoremResult solved = efRoslynTheorem.Solve(entityTypeSymbols);

            // Assert
            Assert.IsNotNull(solved);
            Assert.AreEqual(Status.Satisfiable, solved.Status);
        }
        public async Task TestMethod1()
        {
            // Arrange
            var projectFilePath = @"..\..\..\Z3.ObjectTheorem.EF.RoslynIntegration.PerfTests\Z3.ObjectTheorem.EF.RoslynIntegration.PerfTests.csproj";

            var compilation = await LoadProjectAndGetCompilationAsync(projectFilePath);

            var scenarioClasses  = compilation.GetSymbolsWithName(s => s.StartsWith("ScenarioClass"), SymbolFilter.Type).Cast <INamedTypeSymbol>();
            var allMemberSymbols = scenarioClasses.SelectMany(t => t.GetMembers().Where(m => m.Kind == SymbolKind.Property));

            Trace.WriteLine("Class count: " + scenarioClasses.Count());
            Trace.WriteLine("Total Property count: " + allMemberSymbols.Count());
            Trace.WriteLine("Property per class count: " + allMemberSymbols.Count() / scenarioClasses.Count());
            Trace.WriteLine("");

            // Act
            var efRoslynTheorem        = new EFRoslynTheorem();
            ObjectTheoremResult solved = efRoslynTheorem.Solve(scenarioClasses);

            // Assert
            Assert.IsNotNull(solved);
            Assert.AreEqual(Status.Unsatisfiable, solved.Status);

            foreach (var assumes in efRoslynTheorem.ClassAssumptions)
            {
                efRoslynTheorem.RemoveAssumption(assumes.Assumption);
            }

            foreach (var assumes in efRoslynTheorem.PropertyAssumptions)
            {
                efRoslynTheorem.RemoveAssumption(assumes.Assumption);
            }

            Trace.WriteLine("");
            solved = efRoslynTheorem.ReSolve();
            Assert.IsNotNull(solved);
            Assert.AreEqual(Status.Satisfiable, solved.Status);
        }
        public async Task TestMethod1()
        {
            // Arrange
            var projectFilePath = @"..\..\..\Z3.ObjectTheorem.EF.RoslynIntegration.PerfTests\Z3.ObjectTheorem.EF.RoslynIntegration.PerfTests.csproj";

            var compilation = await LoadProjectAndGetCompilationAsync(projectFilePath);

            var scenarioClasses = compilation.GetSymbolsWithName(s => s.StartsWith("ScenarioClass"), SymbolFilter.Type).Cast<INamedTypeSymbol>();
            var allMemberSymbols = scenarioClasses.SelectMany(t => t.GetMembers().Where(m => m.Kind == SymbolKind.Property));
            Trace.WriteLine("Class count: " + scenarioClasses.Count());
            Trace.WriteLine("Total Property count: " + allMemberSymbols.Count());
            Trace.WriteLine("Property per class count: " + allMemberSymbols.Count() / scenarioClasses.Count());
            Trace.WriteLine("");

            // Act
            var efRoslynTheorem = new EFRoslynTheorem();
            ObjectTheoremResult solved = efRoslynTheorem.Solve(scenarioClasses);

            // Assert
            Assert.IsNotNull(solved);
            Assert.AreEqual(Status.Unsatisfiable, solved.Status);

            foreach (var assumes in efRoslynTheorem.ClassAssumptions)
            {
                efRoslynTheorem.RemoveAssumption(assumes.Assumption);
            }

            foreach (var assumes in efRoslynTheorem.PropertyAssumptions)
            {
                efRoslynTheorem.RemoveAssumption(assumes.Assumption);
            }

            Trace.WriteLine("");
            solved = efRoslynTheorem.ReSolve();
            Assert.IsNotNull(solved);
            Assert.AreEqual(Status.Satisfiable, solved.Status);
        }
Beispiel #10
0
 public Item(Compilation compilation, EFRoslynTheorem efRoslynTheorem, ObjectTheoremResult objectTheoremResult)
 {
     Compilation         = compilation;
     EFRoslynTheorem     = efRoslynTheorem;
     ObjectTheoremResult = objectTheoremResult;
 }