[
  {
    "path": ".github/workflows/continuous-integration-checks.yml",
    "content": "name: Continuous Integration Checks\n\non:\n  push:\n  schedule:\n    - cron: \"0 9 * * 3\"\n\njobs:\n  build-and-test:\n    name: Build and test\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v5\n\n      - name: Setup dotnet\n        uses: actions/setup-dotnet@v5\n        with:\n          dotnet-version: 10.0.x\n\n      - name: Build\n        run: dotnet build --configuration Release\n\n#      - name: List dependencies\n#        run: dotnet list EntityFrameworkCore.Testing.sln package\n\n      - name: Test\n        run: dotnet test --configuration Release --no-build /p:CollectCoverage=\\\"true\\\" /p:Exclude=\\\"[*.Tests]*,[rgvlee.Core.*]*\\\" /p:SkipAutoProps=\\\"false\\\" /p:IncludeTestAssembly=\\\"false\\\" /p:CoverletOutput=\\\"../../CoverageResults/\\\" /p:MergeWith=\\\"../../CoverageResults/coverage.json\\\" /p:CoverletOutputFormat=\\\"opencover,json\\\" -m:1\n\n      - name: Update dependencies\n        run: |\n          dotnet add src/EntityFrameworkCore.Testing.Common package Microsoft.EntityFrameworkCore.InMemory --version 10.*-*\n          dotnet add src/EntityFrameworkCore.Testing.Common package Microsoft.EntityFrameworkCore.Relational --version 10.*-*\n          dotnet add src/EntityFrameworkCore.Testing.Common package Microsoft.Extensions.Logging --version 10.*-*\n          dotnet add src/EntityFrameworkCore.Testing.Common package rgvlee.Core\n\n          dotnet add src/EntityFrameworkCore.Testing.Common.Tests package Microsoft.Extensions.Logging.Console --version 10.*-*\n\n          dotnet add src/EntityFrameworkCore.Testing.Moq package Moq\n\n          dotnet add src/EntityFrameworkCore.Testing.NSubstitute package NSubstitute\n\n#      - name: List dependencies\n#        run: dotnet list EntityFrameworkCore.Testing.sln package\n\n      - name: Test with updated dependencies\n        run: dotnet test --configuration Release /p:CollectCoverage=\\\"false\\\" /p:Exclude=\\\"[*.Tests]*,[rgvlee.Core.*]*\\\" /p:SkipAutoProps=\\\"false\\\" /p:IncludeTestAssembly=\\\"false\\\" -m:1\n\n      - name: Send coverage results to Codacy\n        uses: codacy/codacy-coverage-reporter-action@master\n        with:\n          project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}\n          coverage-reports: ./CoverageResults/coverage.*opencover.xml"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\n\non:\n  release:\n    types: [published]\n\njobs:\n  build-and-test:\n    name: Build, pack and push\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v5\n\n      - name: Setup dotnet\n        uses: actions/setup-dotnet@v5\n        with:\n          dotnet-version: 10.0.x\n\n      - run: sudo apt install mono-devel\n\n      - name: Setup NuGet\n        uses: nuget/setup-nuget@v2\n        with:\n          nuget-version: latest\n\n      - name: Build\n        run: dotnet build --configuration Release\n\n      - name: Pack\n        run: |\n          nuget pack EntityFrameworkCore.Testing.Moq.nuspec -Version ${{ github.event.release.name }} -Symbols -SymbolPackageFormat snupkg\n          nuget pack EntityFrameworkCore.Testing.NSubstitute.nuspec -Version ${{ github.event.release.name }} -Symbols -SymbolPackageFormat snupkg\n\n      - name: Push\n        run: |\n          nuget push EntityFrameworkCore.Testing.Moq*.nupkg -Source https://api.nuget.org/v3/index.json -ApiKey ${{ secrets.NUGET_API_KEY }}\n          nuget push EntityFrameworkCore.Testing.NSubstitute*.nupkg -Source https://api.nuget.org/v3/index.json -ApiKey ${{ secrets.NUGET_API_KEY }}"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n**/Properties/launchSettings.json\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk \n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output \nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder \n.mfractor/\n"
  },
  {
    "path": "EntityFrameworkCore.Testing.Moq.nuspec",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd\">\n  <metadata>\n    <id>EntityFrameworkCore.Testing.Moq</id>\n    <version>10.0.0</version>\n    <authors>rgvlee</authors>\n    <owners>rgvlee</owners>\n    <requireLicenseAcceptance>false</requireLicenseAcceptance>\n    <license type=\"file\">LICENSE</license>\n    <projectUrl>https://github.com/rgvlee/EntityFrameworkCore.Testing</projectUrl>\n    <description>Adds relational support to the Microsoft EntityFrameworkCore in-memory database provider by mocking relational operations.\n\nEntityFrameworkCore.Testing v1.x = EntityFrameworkCore 2 (2.1.0+)\nEntityFrameworkCore.Testing v2.x = EntityFrameworkCore 3\nEntityFrameworkCore.Testing v3.x = EntityFrameworkCore 5\nEntityFrameworkCore.Testing v4.x = EntityFrameworkCore 6\nEntityFrameworkCore.Testing v5.x = EntityFrameworkCore 7\nEntityFrameworkCore.Testing v8.x = EntityFrameworkCore 8\nEntityFrameworkCore.Testing v9.x = EntityFrameworkCore 9\nEntityFrameworkCore.Testing v10.x = EntityFrameworkCore 10</description>\n    <copyright>Copyright (c) 2025 Lee Anderson</copyright>\n    <tags>EntityFrameworkCore EFCore Moq mock testing</tags>\n    <repository url=\"https://github.com/rgvlee/EntityFrameworkCore.Testing\" />\n    <dependencies>\n      <group targetFramework=\"net10.0\">\n        <dependency id=\"Microsoft.EntityFrameworkCore.InMemory\" version=\"[10,11)\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"Microsoft.EntityFrameworkCore.Relational\" version=\"[10,11)\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"Microsoft.Extensions.Logging\" version=\"[10,)\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"Moq\" version=\"4.9.0\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"rgvlee.Core\" version=\"1.2.1\" exclude=\"Build,Analyzers\" />\n      </group>\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"src\\EntityFrameworkCore.Testing.Common\\bin\\Release\\net10.0\\EntityFrameworkCore.Testing.Common.dll\" target=\"lib\\net10.0\" />\n    <file src=\"src\\EntityFrameworkCore.Testing.Common\\bin\\Release\\net10.0\\EntityFrameworkCore.Testing.Common.pdb\" target=\"lib\\net10.0\" />\n    <file src=\"src\\EntityFrameworkCore.Testing.Common\\bin\\Release\\net10.0\\EntityFrameworkCore.Testing.Common.xml\" target=\"lib\\net10.0\" />\n    <file src=\"src\\EntityFrameworkCore.Testing.Moq\\bin\\Release\\net10.0\\EntityFrameworkCore.Testing.Moq.dll\" target=\"lib\\net10.0\" />\n    <file src=\"src\\EntityFrameworkCore.Testing.Moq\\bin\\Release\\net10.0\\EntityFrameworkCore.Testing.Moq.pdb\" target=\"lib\\net10.0\" />\n    <file src=\"src\\EntityFrameworkCore.Testing.Moq\\bin\\Release\\net10.0\\EntityFrameworkCore.Testing.Moq.xml\" target=\"lib\\net10.0\" />\n    <file src=\"LICENSE\" />\n  </files>\n</package>"
  },
  {
    "path": "EntityFrameworkCore.Testing.NSubstitute.nuspec",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd\">\n  <metadata>\n    <id>EntityFrameworkCore.Testing.NSubstitute</id>\n    <version>10.0.0</version>\n    <authors>rgvlee</authors>\n    <owners>rgvlee</owners>\n    <requireLicenseAcceptance>false</requireLicenseAcceptance>\n    <license type=\"file\">LICENSE</license>\n    <projectUrl>https://github.com/rgvlee/EntityFrameworkCore.Testing</projectUrl>\n    <description>Adds relational support to the Microsoft EntityFrameworkCore in-memory database provider by mocking relational operations.\n\nEntityFrameworkCore.Testing v1.x = EntityFrameworkCore 2 (2.1.0+)\nEntityFrameworkCore.Testing v2.x = EntityFrameworkCore 3\nEntityFrameworkCore.Testing v3.x = EntityFrameworkCore 5\nEntityFrameworkCore.Testing v4.x = EntityFrameworkCore 6\nEntityFrameworkCore.Testing v5.x = EntityFrameworkCore 7\nEntityFrameworkCore.Testing v8.x = EntityFrameworkCore 8\nEntityFrameworkCore.Testing v9.x = EntityFrameworkCore 9\nEntityFrameworkCore.Testing v10.x = EntityFrameworkCore 10</description>\n    <copyright>Copyright (c) 2025 Lee Anderson</copyright>\n    <tags>EntityFrameworkCore EFCore NSubstitute nsub mock testing</tags>\n    <repository url=\"https://github.com/rgvlee/EntityFrameworkCore.Testing\" />\n    <dependencies>\n      <group targetFramework=\"net10.0\">\n        <dependency id=\"Microsoft.EntityFrameworkCore.InMemory\" version=\"[10,11)\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"Microsoft.EntityFrameworkCore.Relational\" version=\"[10,11)\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"Microsoft.Extensions.Logging\" version=\"[10,)\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"NSubstitute\" version=\"4.1.0\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"rgvlee.Core\" version=\"1.2.1\" exclude=\"Build,Analyzers\" />\n      </group>\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"src\\EntityFrameworkCore.Testing.Common\\bin\\Release\\net10.0\\EntityFrameworkCore.Testing.Common.dll\" target=\"lib\\net10.0\" />\n    <file src=\"src\\EntityFrameworkCore.Testing.Common\\bin\\Release\\net10.0\\EntityFrameworkCore.Testing.Common.pdb\" target=\"lib\\net10.0\" />\n    <file src=\"src\\EntityFrameworkCore.Testing.Common\\bin\\Release\\net10.0\\EntityFrameworkCore.Testing.Common.xml\" target=\"lib\\net10.0\" />\n    <file src=\"src\\EntityFrameworkCore.Testing.NSubstitute\\bin\\Release\\net10.0\\EntityFrameworkCore.Testing.NSubstitute.dll\" target=\"lib\\net10.0\" />\n    <file src=\"src\\EntityFrameworkCore.Testing.NSubstitute\\bin\\Release\\net10.0\\EntityFrameworkCore.Testing.NSubstitute.pdb\" target=\"lib\\net10.0\" />\n    <file src=\"src\\EntityFrameworkCore.Testing.NSubstitute\\bin\\Release\\net10.0\\EntityFrameworkCore.Testing.NSubstitute.xml\" target=\"lib\\net10.0\" />\n    <file src=\"LICENSE\" />\n  </files>\n</package>"
  },
  {
    "path": "EntityFrameworkCore.Testing.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.3.32811.315\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{F7DF11CE-7549-4808-B9BE-66CE1BD1F150}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t.gitignore = .gitignore\n\t\t.github\\workflows\\continuous-integration-checks.yml = .github\\workflows\\continuous-integration-checks.yml\n\t\tsrc\\EntityFrameworkCore.Testing.Common\\EntityFrameworkCore.Testing.Common.xml = src\\EntityFrameworkCore.Testing.Common\\EntityFrameworkCore.Testing.Common.xml\n\t\tEntityFrameworkCore.Testing.Moq.nuspec = EntityFrameworkCore.Testing.Moq.nuspec\n\t\tsrc\\EntityFrameworkCore.Testing.Moq\\EntityFrameworkCore.Testing.Moq.xml = src\\EntityFrameworkCore.Testing.Moq\\EntityFrameworkCore.Testing.Moq.xml\n\t\tEntityFrameworkCore.Testing.NSubstitute.nuspec = EntityFrameworkCore.Testing.NSubstitute.nuspec\n\t\tsrc\\EntityFrameworkCore.Testing.NSubstitute\\EntityFrameworkCore.Testing.NSubstitute.xml = src\\EntityFrameworkCore.Testing.NSubstitute\\EntityFrameworkCore.Testing.NSubstitute.xml\n\t\tgooglea6bd68d4a55b1e59.html = googlea6bd68d4a55b1e59.html\n\t\tLICENSE = LICENSE\n\t\tREADME.md = README.md\n\t\t.github\\workflows\\release.yml = .github\\workflows\\release.yml\n\t\tTODO.md = TODO.md\n\tEndProjectSection\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"EntityFrameworkCore.Testing.Moq\", \"src\\EntityFrameworkCore.Testing.Moq\\EntityFrameworkCore.Testing.Moq.csproj\", \"{3A00A558-6614-4D2C-8BC0-A74EFBB8F844}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"EntityFrameworkCore.Testing.Moq.Tests\", \"src\\EntityFrameworkCore.Testing.Moq.Tests\\EntityFrameworkCore.Testing.Moq.Tests.csproj\", \"{6567AA47-8E4D-4E69-8075-B8C25DC7F4A4}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Tests\", \"Tests\", \"{5B717CD0-96CD-4862-95EB-80ECCDCD1D07}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"EntityFrameworkCore.Testing.Common\", \"src\\EntityFrameworkCore.Testing.Common\\EntityFrameworkCore.Testing.Common.csproj\", \"{F2211544-E6EA-439A-9C31-3972B48B9D5E}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"EntityFrameworkCore.Testing.Common.Tests\", \"src\\EntityFrameworkCore.Testing.Common.Tests\\EntityFrameworkCore.Testing.Common.Tests.csproj\", \"{4B97C16B-E27D-4900-A535-6D5AC116B893}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"EntityFrameworkCore.DefaultBehaviour.Tests\", \"src\\EntityFrameworkCore.DefaultBehaviour.Tests\\EntityFrameworkCore.DefaultBehaviour.Tests.csproj\", \"{9C08E46C-C902-473F-93E6-FCB89DEC8C97}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"EntityFrameworkCore.Testing.NSubstitute\", \"src\\EntityFrameworkCore.Testing.NSubstitute\\EntityFrameworkCore.Testing.NSubstitute.csproj\", \"{A70976F0-38EA-461C-9BDE-BEE8232B048D}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"EntityFrameworkCore.Testing.NSubstitute.Tests\", \"src\\EntityFrameworkCore.Testing.NSubstitute.Tests\\EntityFrameworkCore.Testing.NSubstitute.Tests.csproj\", \"{2F67273D-B7B8-49A5-9A91-E37CBC10F563}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{3A00A558-6614-4D2C-8BC0-A74EFBB8F844}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3A00A558-6614-4D2C-8BC0-A74EFBB8F844}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3A00A558-6614-4D2C-8BC0-A74EFBB8F844}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3A00A558-6614-4D2C-8BC0-A74EFBB8F844}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{6567AA47-8E4D-4E69-8075-B8C25DC7F4A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{6567AA47-8E4D-4E69-8075-B8C25DC7F4A4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{6567AA47-8E4D-4E69-8075-B8C25DC7F4A4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{6567AA47-8E4D-4E69-8075-B8C25DC7F4A4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F2211544-E6EA-439A-9C31-3972B48B9D5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F2211544-E6EA-439A-9C31-3972B48B9D5E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F2211544-E6EA-439A-9C31-3972B48B9D5E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F2211544-E6EA-439A-9C31-3972B48B9D5E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4B97C16B-E27D-4900-A535-6D5AC116B893}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4B97C16B-E27D-4900-A535-6D5AC116B893}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4B97C16B-E27D-4900-A535-6D5AC116B893}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4B97C16B-E27D-4900-A535-6D5AC116B893}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{9C08E46C-C902-473F-93E6-FCB89DEC8C97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9C08E46C-C902-473F-93E6-FCB89DEC8C97}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9C08E46C-C902-473F-93E6-FCB89DEC8C97}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9C08E46C-C902-473F-93E6-FCB89DEC8C97}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A70976F0-38EA-461C-9BDE-BEE8232B048D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A70976F0-38EA-461C-9BDE-BEE8232B048D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A70976F0-38EA-461C-9BDE-BEE8232B048D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A70976F0-38EA-461C-9BDE-BEE8232B048D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2F67273D-B7B8-49A5-9A91-E37CBC10F563}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2F67273D-B7B8-49A5-9A91-E37CBC10F563}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2F67273D-B7B8-49A5-9A91-E37CBC10F563}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2F67273D-B7B8-49A5-9A91-E37CBC10F563}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{6567AA47-8E4D-4E69-8075-B8C25DC7F4A4} = {5B717CD0-96CD-4862-95EB-80ECCDCD1D07}\n\t\t{4B97C16B-E27D-4900-A535-6D5AC116B893} = {5B717CD0-96CD-4862-95EB-80ECCDCD1D07}\n\t\t{9C08E46C-C902-473F-93E6-FCB89DEC8C97} = {5B717CD0-96CD-4862-95EB-80ECCDCD1D07}\n\t\t{2F67273D-B7B8-49A5-9A91-E37CBC10F563} = {5B717CD0-96CD-4862-95EB-80ECCDCD1D07}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {0E585345-42EF-438B-8212-2C328D36D9AD}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Lee Anderson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# EntityFrameworkCore.Testing\n\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/6d641ce391264f45b99acee8694a88d6?branch=10.x)](https://www.codacy.com/manual/rgvlee/EntityFrameworkCore.Testing?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=rgvlee/EntityFrameworkCore.Testing&amp;utm_campaign=Badge_Grade) [![Codacy Badge](https://app.codacy.com/project/badge/Coverage/6d641ce391264f45b99acee8694a88d6?branch=10.x)](https://www.codacy.com/manual/rgvlee/EntityFrameworkCore.Testing?utm_source=github.com&utm_medium=referral&utm_content=rgvlee/EntityFrameworkCore.Testing&utm_campaign=Badge_Coverage)\n\n## Overview\n\nEntityFrameworkCore.Testing adds relational support to the Microsoft EntityFrameworkCore in-memory database provider by mocking relational operations. It's easy to use (usually just a single line of code) with implementations for both Moq and NSubstitute.\n\nThe aim of this library is to allow you use the in-memory database provider in unit tests where the SUT invokes a relational operation. It'll allow you to specify expected results for these relational operations. It does not test your relational operations.\n\n[Microsoft does not recommend mocking a db context](https://docs.microsoft.com/en-us/ef/core/testing/#unit-testing) and EntityFrameworkCore.Testing follows this advice by sending operations supported by the in-memory database provider to the in-memory database provider.\n\n### EntityFrameworkCore 10\n\n- [Source](https://github.com/rgvlee/EntityFrameworkCore.Testing/tree/10.x)\n- [EntityFrameworkCore.Testing.Moq - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.Moq/10.0.0)\n- [EntityFrameworkCore.Testing.NSubstitute - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.NSubstitute/10.0.0)\n\n### EntityFrameworkCore 9\n\n- [Source](https://github.com/rgvlee/EntityFrameworkCore.Testing/tree/9.x)\n- [EntityFrameworkCore.Testing.Moq - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.Moq/9.0.2)\n- [EntityFrameworkCore.Testing.NSubstitute - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.NSubstitute/9.0.2)\n\n### EntityFrameworkCore 8\n\n- [Source](https://github.com/rgvlee/EntityFrameworkCore.Testing/tree/8.x)\n- [EntityFrameworkCore.Testing.Moq - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.Moq/8.1.2)\n- [EntityFrameworkCore.Testing.NSubstitute - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.NSubstitute/8.1.2)\n\n### EntityFrameworkCore 7\n\n- [Source](https://github.com/rgvlee/EntityFrameworkCore.Testing/tree/5.x)\n- [EntityFrameworkCore.Testing.Moq - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.Moq/5.0.0)\n- [EntityFrameworkCore.Testing.NSubstitute - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.NSubstitute/5.0.0)\n\n### EntityFrameworkCore 6\n\n- [Source](https://github.com/rgvlee/EntityFrameworkCore.Testing/tree/4.x)\n- [EntityFrameworkCore.Testing.Moq - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.Moq/4.0.2)\n- [EntityFrameworkCore.Testing.NSubstitute - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.NSubstitute/4.0.2)\n\n### EntityFrameworkCore 5\n\n- [Source](https://github.com/rgvlee/EntityFrameworkCore.Testing/tree/3.x)\n- [EntityFrameworkCore.Testing.Moq - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.Moq/3.0.5)\n- [EntityFrameworkCore.Testing.NSubstitute - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.NSubstitute/3.0.5)\n\n### EntityFrameworkCore 3\n\n- [Source](https://github.com/rgvlee/EntityFrameworkCore.Testing/tree/2.x)\n- [EntityFrameworkCore.Testing.Moq - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.Moq/2.4.5)\n- [EntityFrameworkCore.Testing.NSubstitute - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.NSubstitute/2.4.5)\n\n### EntityFrameworkCore 2 (2.1.0+)\n\n- [Source](https://github.com/rgvlee/EntityFrameworkCore.Testing/tree/1.x)\n- [EntityFrameworkCore.Testing.Moq - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.Moq/1.3.5)\n- [EntityFrameworkCore.Testing.NSubstitute - NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Testing.NSubstitute/1.3.5)\n\n## Prerequisites\n\n### An accessible constructor\n\nYour db context must have an accessible constructor.\n\n### Virtual sets/queries\n\nYour db context set/query properties must be overridable:\n\n```c#\npublic virtual DbSet<TestEntity> TestEntities { get; set; }\n```\n\n## Creating a mocked DbContext\n\nIf your db context has an accessible constructor with a single `DbContextOptions` or `DbContextOptions<TDbContext>` parameter, creating a mocked db context is as easy as:\n\n```c#\nvar mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n```\n\nAny accessible constructor can be used provided it has a `DbContextOptions` or `DbContextOptions<TDbContext>` parameter:\n\n```c#\nvar mockedLogger = Mock.Of<ILogger<TestDbContext>>();\nvar dbContextOptions = new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;\nvar mockedDbContext = Create.MockedDbContextFor<TestDbContext>(mockedLogger, dbContextOptions);\n```\n\nBoth of the above examples automatically create and use a Microsoft in-memory provider instance for the EntityFrameworkCore provider. If you want more control e.g., to specify the EntityFrameworkCore provider instance, use the builder:\n\n```c#\nvar options = new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;\nvar dbContextToMock = new TestDbContext(options);\nvar mockedDbContext = new MockedDbContextBuilder<TestDbContext>().UseDbContext(dbContextToMock).UseConstructorWithParameters(options).MockedDbContext;\n```\n\nThere is no requirement to use the Microsoft in-memory provider. The following example uses the SQLite in-memory provider for a db context with a parameterless constructor:\n\n```c#\nusing (var connection = new SqliteConnection(\"Filename=:memory:\"))\n{\n    connection.Open();\n    var testEntity = _fixture.Create<TestEntity>();\n    var dbContextToMock = new TestDbContext(new DbContextOptionsBuilder<TestDbContext>().UseSqlite(connection).Options);\n    dbContextToMock.Database.EnsureCreated();\n    var mockedDbContext = new MockedDbContextBuilder<TestDbContext>().UseDbContext(dbContextToMock).MockedDbContext;\n\n    mockedDbContext.Set<TestEntity>().Add(testEntity);\n    mockedDbContext.SaveChanges();\n\n    Assert.Multiple(() =>\n    {\n        Assert.AreNotEqual(default(Guid), testEntity.Id);\n        Assert.DoesNotThrow(() => mockedDbContext.Set<TestEntity>().Single());\n        Assert.AreEqual(testEntity, mockedDbContext.Find<TestEntity>(testEntity.Id));\n    });\n}\n```\n\n## Usage\n\nStart by creating a mocked db context and, if the SUT requires, populate it as if you were using the real thing:\n\n```c#\nvar testEntity = _fixture.Create<TestEntity>();\nvar mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\nmockedDbContext.Set<TestEntity>().Add(testEntity);\nmockedDbContext.SaveChanges();\n\nAssert.Multiple(() =>\n{\n    Assert.AreNotEqual(default(Guid), testEntity.Id);\n    Assert.DoesNotThrow(() => mockedDbContext.Set<TestEntity>().Single());\n    Assert.AreEqual(testEntity, mockedDbContext.Find<TestEntity>(testEntity.Id));\n});\n```\n\nThe Moq implementation of `Create.MockedDbContextFor<T>()` returns the mocked db context. If you need the mock itself (e.g., to verify an invocation) use `Mock.Get(mockedDbSet)`:\n\n```c#\nvar mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\nmockedDbContext.Set<TestEntity>().AddRange(_fixture.CreateMany<TestEntity>().ToList());\nmockedDbContext.SaveChanges();\n\nAssert.Multiple(() =>\n{\n    var dbContextMock = Mock.Get(mockedDbContext);\n    dbContextMock.Verify(m => m.SaveChanges(), Times.Once);\n});\n```\n\n### FromSql\n\nUse `AddFromSqlResult` to add a from SQL result to the mock. The following will return `expectedResult` for any `FromSql<TestEntity>` invocation:\n\n```c#\nvar expectedResult = _fixture.CreateMany<TestEntity>().ToList();\nvar mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\nmockedDbContext.Set<TestEntity>().AddFromSqlRawResult(expectedResult);\n\nvar actualResult = mockedDbContext.Set<TestEntity>().FromSqlRaw(\"[dbo].[USP_StoredProcedureWithNoParameters]\").ToList();\n\nAssert.Multiple(() =>\n{\n    Assert.IsNotNull(actualResult);\n    Assert.IsTrue(actualResult.Any());\n    CollectionAssert.AreEquivalent(expectedResult, actualResult);\n});\n```\n\nThe following will return `expectedResult` if the `FromSql` SQL query text contains `usp_StoredProcedureWithParameters` and a `@Parameter2` SQL parameter with a value of `Value2` has been provided:\n\n```c#\nvar expectedResult = _fixture.CreateMany<TestEntity>().ToList();\nvar sqlParameters = new List<SqlParameter> { new SqlParameter(\"@Parameter2\", \"Value2\") };\nvar mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\nmockedDbContext.Set<TestEntity>().AddFromSqlRawResult(\"usp_StoredProcedureWithParameters\", sqlParameters, expectedResult);\n\nvar actualResult = mockedDbContext.Set<TestEntity>()\n    .FromSqlRaw(\"[dbo].[USP_StoredProcedureWithParameters] @Parameter1 @Parameter2\",\n        new SqlParameter(\"@parameter1\", \"Value1\"),\n        new SqlParameter(\"@parameter2\", \"value2\"))\n    .ToList();\n\nAssert.Multiple(() =>\n{\n    Assert.IsNotNull(actualResult);\n    Assert.IsTrue(actualResult.Any());\n    CollectionAssert.AreEquivalent(expectedResult, actualResult);\n});\n```\n\nSQL query text matching supports partial, case insensitive matches. Individual parameter name and value matching is also case insensitive. Case insensitive interpolated strings are also supported:\n\n```c#\nvar expectedResult = _fixture.CreateMany<TestEntity>().ToList();\nvar parameter1 = _fixture.Create<DateTime>();\nvar parameter2 = _fixture.Create<string>();\nvar mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\nmockedDbContext.Set<TestEntity>().AddFromSqlInterpolatedResult($\"usp_StoredProcedureWithParameters {parameter1}, {parameter2.ToUpper()}\", expectedResult);\n\nvar actualResult = mockedDbContext.Set<TestEntity>().FromSqlInterpolated($\"USP_StoredProcedureWithParameters {parameter1}, {parameter2.ToLower()}\").ToList();\n\nAssert.Multiple(() =>\n{\n    Assert.IsNotNull(actualResult);\n    Assert.IsTrue(actualResult.Any());\n    CollectionAssert.AreEquivalent(expectedResult, actualResult);\n});\n```\n\n### FromSqlRaw/FromSqlInterpolated (EntityFrameworkCore 3.\\*)\n\nUse `AddFromSqlRawResult` and `AddFromSqlInterpolatedResult` to add results for `FromSqlRaw` and `FromSqlInterpolated` invocations. Refer to the FromSql section above for usage.\n\n### Queries\n\nUse `AddToReadOnlySource`, `AddRangeToReadOnlySource` and `ClearReadOnlySource` to manage a query source.\n\n```c#\nvar expectedResult = _fixture.CreateMany<TestReadOnlyEntity>().ToList();\nvar mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n\nmockedDbContext.Set<TestReadOnlyEntity>().AddRangeToReadOnlySource(expectedResult);\n\nAssert.Multiple(() =>\n{\n    CollectionAssert.AreEquivalent(expectedResult, mockedDbContext.Set<TestReadOnlyEntity>().ToList());\n    CollectionAssert.AreEquivalent(mockedDbContext.Set<TestReadOnlyEntity>().ToList(), mockedDbContext.TestReadOnlyEntities.ToList());\n});\n```\n\nSpecifying a from SQL result for a query is exactly the same as for a set.\n\n### Keyless Sets (EntityFrameworkCore 3.\\*)\n\nRefer to the Queries section above for usage.\n\n### ExecuteSqlCommand\n\nAdding an execute SQL command result is similar to adding a from SQL result with the main difference being the return type. `ExecuteSqlCommand` returns an `int` (the number of rows affected by executing the SQL command text).\n\n```c#\nvar commandText = \"usp_StoredProcedureWithNoParameters\";\nvar expectedResult = 1;\nvar mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\nmockedDbContext.AddExecuteSqlRawResult(commandText, new List<SqlParameter>(), expectedResult);\n\nvar result = mockedDbContext.Database.ExecuteSqlRaw(\"USP_StoredProcedureWithNoParameters\");\n\nAssert.AreEqual(expectedResult, result);\n```\n\nAll of the overloads have an optional `Action<string, IEnumerable<object>>` parameter which allows you to perform operations post invocation. The following provides a basic example where invoking `ExecuteSqlCommand` deletes a specified number of rows from a set:\n\n```c#\n//Arrange\nvar mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n\nvar itemsToCreate = 100;\nmockedDbContext.Set<TestEntity>().AddRange(_fixture.CreateMany<TestEntity>(itemsToCreate).ToList());\nmockedDbContext.SaveChanges();\n\nvar numberOfRowsToDelete = itemsToCreate / 2;\nvar rowsToDelete = mockedDbContext.Set<TestEntity>().Take(numberOfRowsToDelete).ToList();\nvar remainingRows = mockedDbContext.Set<TestEntity>().Skip(numberOfRowsToDelete).ToList();\n\nmockedDbContext.AddExecuteSqlRawResult(\"usp_MyStoredProc\",\n    numberOfRowsToDelete,\n    (providedSql, providedParameters) =>\n    {\n        mockedDbContext.Set<TestEntity>().RemoveRange(rowsToDelete);\n        mockedDbContext.SaveChanges();\n    });\n\n//Act\nvar actualResult = mockedDbContext.Database.ExecuteSqlRaw($\"usp_MyStoredProc {numberOfRowsToDelete}\");\n\n//Assert\nAssert.Multiple(() =>\n{\n    Assert.That(actualResult, Is.EqualTo(numberOfRowsToDelete));\n    Assert.That(mockedDbContext.Set<TestEntity>().Count(), Is.EqualTo(itemsToCreate - numberOfRowsToDelete));\n    Assert.That(mockedDbContext.Set<TestEntity>().ToList(), Is.EquivalentTo(remainingRows));\n});\n```\n\n### ExecuteSqlRaw/ExecuteSqlInterpolated (EntityFrameworkCore 3.\\*)\n\nUse `AddExecuteSqlRawResult` and `AddExecuteSqlInterpolatedResult` to add results for `ExecuteSqlRaw` and `ExecuteSqlInterpolated` invocations. Refer to the ExecuteSqlCommand section above for usage.\n\n### Async and LINQ queryable operations\n\nWhenever you add a from SQL or execute SQL command result, EntityFrameworkCore.Testing sets up both the sync and async methods. It also automatically provides support for all sync and async LINQ queryable operations that are not supported by the Microsoft in-memory provider.\n\n### Asserting mock invocations\n\nThe db context and each set, query and their respective query providers are separate mocks. The following Moq example asserts that the `DbContext.SaveChanges` and `DbSet<TestEntity>.AddRange` methods were both invoked once.\n\n```c#\nvar mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\nmockedDbContext.Set<TestEntity>().AddRange(_fixture.CreateMany<TestEntity>().ToList());\nmockedDbContext.SaveChanges();\n\nvar dbContextMock = Mock.Get(mockedDbContext);\ndbContextMock.Verify(m => m.SaveChanges(), Times.Once);\n\nvar byTypeDbSetMock = Mock.Get(mockedDbContext.Set<TestEntity>());\nbyTypeDbSetMock.Verify(m => m.AddRange(It.IsAny<IEnumerable<TestEntity>>()), Times.Once);\n\nvar byPropertyDbSetMock = Mock.Get(mockedDbContext.TestEntities);\nbyPropertyDbSetMock.Verify(m => m.AddRange(It.IsAny<IEnumerable<TestEntity>>()), Times.Once);\n```\n"
  },
  {
    "path": "TODO.md",
    "content": "# TODO\n\n- Add tests for untested functionality\n- Remove repeated set up code\n- Unify test structures to assist with cross project comparisons\n- Add default behaviour tests for SQL Server provider\n"
  },
  {
    "path": "googlea6bd68d4a55b1e59.html",
    "content": "google-site-verification: googlea6bd68d4a55b1e59.html"
  },
  {
    "path": "src/EntityFrameworkCore.DefaultBehaviour.Tests/ByTypeDbSetTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing AutoFixture;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing FluentAssertions;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\nusing static FluentAssertions.FluentActions;\n\nnamespace EntityFrameworkCore.DefaultBehaviour.Tests;\n\npublic class ByTypeDbSetTests : BaseForQueryableTests<TestEntity>\n{\n    protected TestDbContext DbContext;\n\n    protected DbSet<TestEntity> DbSet => DbContext.Set<TestEntity>();\n\n    protected override IQueryable<TestEntity> Queryable => DbSet;\n\n    [SetUp]\n    public override void SetUp()\n    {\n        base.SetUp();\n\n        DbContext = new TestDbContext(new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options);\n    }\n\n    protected override void SeedQueryableSource()\n    {\n        var itemsToAdd = Fixture.Build<TestEntity>().With(p => p.CreatedAt, DateTime.Today).With(p => p.LastModifiedAt, DateTime.Today).CreateMany().ToList();\n        DbContext.Set<TestEntity>().AddRange(itemsToAdd);\n        DbContext.SaveChanges();\n        ItemsAddedToQueryableSource = itemsToAdd;\n    }\n\n    [Test]\n    public virtual async Task AsAsyncEnumerable_ReturnsAsyncEnumerable()\n    {\n        var expectedResult = Fixture.Create<TestEntity>();\n        DbSet.Add(expectedResult);\n        DbContext.SaveChanges();\n\n        var asyncEnumerable = DbSet.AsAsyncEnumerable();\n\n        var actualResults = new List<TestEntity>();\n        await foreach (var item in asyncEnumerable) actualResults.Add(item);\n\n        Assert.Multiple(() =>\n        {\n            Assert.That(actualResults.Single(), Is.EqualTo(expectedResult));\n            Assert.That(actualResults.Single(), Is.EqualTo(expectedResult));\n        });\n    }\n\n    [Test]\n    public virtual void AsQueryable_ReturnsQueryable()\n    {\n        var expectedResult = Fixture.Create<TestEntity>();\n        DbSet.Add(expectedResult);\n        DbContext.SaveChanges();\n\n        var queryable = DbSet.AsQueryable();\n\n        Assert.Multiple(() =>\n        {\n            Assert.That(queryable.Single(), Is.EqualTo(expectedResult));\n            Assert.That(queryable.Single(), Is.EqualTo(expectedResult));\n        });\n    }\n\n    [Test]\n    public virtual void FromSqlInterpolated_ThrowsException()\n    {\n        Invoking(() => DbSet.FromSqlInterpolated($\"sp_NoParams\").ToList()).Should().ThrowExactly<InvalidOperationException>();\n    }\n\n    [Test]\n    public virtual void FromSqlRaw_ThrowsException()\n    {\n        Invoking(() => DbSet.FromSqlRaw(\"sp_NoParams\").ToList()).Should().ThrowExactly<InvalidOperationException>();\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.DefaultBehaviour.Tests/ByTypeReadOnlyDbSetExceptionTests.cs",
    "content": "﻿using System;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.DefaultBehaviour.Tests\n{\n    public class ReadOnlyDbSetExceptionTests : ReadOnlyDbSetExceptionTests<TestReadOnlyEntity>\n    {\n        protected TestDbContext DbContext;\n\n        protected override DbSet<TestReadOnlyEntity> DbSet => DbContext.Set<TestReadOnlyEntity>();\n\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            DbContext = new TestDbContext(new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.DefaultBehaviour.Tests/ByTypeReadOnlyDbSetTests.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.DefaultBehaviour.Tests\n{\n    public class ByTypeReadOnlyDbSetTests : BaseForTests\n    {\n        protected TestDbContext DbContext;\n\n        protected DbSet<TestReadOnlyEntity> DbSet => DbContext.Set<TestReadOnlyEntity>();\n\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            DbContext = new TestDbContext(new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options);\n        }\n\n        [Test]\n        public virtual void AsAsyncEnumerable_ReturnsAsyncEnumerable()\n        {\n            var asyncEnumerable = DbSet.AsAsyncEnumerable();\n\n            Assert.That(asyncEnumerable, Is.Not.Null);\n        }\n\n        [Test]\n        public virtual void AsQueryable_ReturnsQueryable()\n        {\n            var queryable = DbSet.AsQueryable();\n\n            Assert.That(queryable, Is.Not.Null);\n        }\n\n        [Test]\n        public void ContainsListCollection_ReturnsFalse()\n        {\n            var containsListCollection = ((IListSource) DbSet).ContainsListCollection;\n            Assert.That(containsListCollection, Is.False);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.DefaultBehaviour.Tests/DbContextTests.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing EntityFrameworkCore.Testing.Common;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.DefaultBehaviour.Tests\n{\n    public class DbContextTests : BaseForTests\n    {\n        protected TestDbContext DbContext;\n\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            DbContext = new TestDbContext(new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options);\n        }\n\n        [Test]\n        public virtual void ExecuteSqlInterpolated_ThrowsException()\n        {\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                var actualResult = DbContext.Database.ExecuteSqlInterpolated($\"sp_NoParams\");\n            });\n        }\n\n        [Test]\n        public virtual void ExecuteSqlRaw_ThrowsException()\n        {\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                var actualResult = DbContext.Database.ExecuteSqlRaw(\"sp_NoParams\");\n            });\n        }\n\n        [Test]\n        public virtual void Set_TypeNotIncludedInModel_ThrowsException()\n        {\n            Assert.Multiple(() =>\n            {\n                var ex = Assert.Throws<InvalidOperationException>(() => DbContext.Set<NotRegisteredEntity>().ToList());\n                Assert.That(ex.Message, Is.EqualTo(string.Format(ExceptionMessages.CannotCreateDbSetTypeNotIncludedInModel, nameof(NotRegisteredEntity))));\n            });\n        }\n\n        [Test]\n        public virtual void SetCommandTimeout_ValidTimeout_ThrowsException()\n        {\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                DbContext.Database.SetCommandTimeout(60);\n            });\n        }\n\n        [Test]\n        public virtual void GetCommandTimeout_ThrowsException()\n        {\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                DbContext.Database.GetCommandTimeout();\n            });\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.DefaultBehaviour.Tests/EntityFrameworkCore.DefaultBehaviour.Tests.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Debug' \">\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Release' \">\n    <DebugSymbols>true</DebugSymbols>\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"NUnit\" Version=\"4.4.0\" />\n    <PackageReference Include=\"NUnit3TestAdapter\" Version=\"5.2.0\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"18.0.1\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\EntityFrameworkCore.Testing.Common.Tests\\EntityFrameworkCore.Testing.Common.Tests.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/EntityFrameworkCore.DefaultBehaviour.Tests/Issue114Tests.cs",
    "content": "﻿using System;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace EntityFrameworkCore.DefaultBehaviour.Tests\n{\n    public class Issue114Tests : Testing.Common.Tests.Issue114Tests\n    {\n        protected override TestDbContext MockedDbContextFactory()\n        {\n            return new TestDbContext(new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.DefaultBehaviour.Tests/Issue117Tests.cs",
    "content": "﻿using System;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace EntityFrameworkCore.DefaultBehaviour.Tests\n{\n    public class Issue117Tests : Testing.Common.Tests.Issue117Tests\n    {\n        protected override TestDbContext MockedDbContextFactory()\n        {\n            return new TestDbContext(new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.DefaultBehaviour.Tests/Issue49Tests.cs",
    "content": "﻿using System;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.DefaultBehaviour.Tests\n{\n    public class Issue49Tests : Issue49Tests<TestDbContext, TestEntity>\n    {\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            DbContext = new TestDbContext(new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.DefaultBehaviour.Tests/Issue88Tests.cs",
    "content": "﻿using System;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Diagnostics;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.DefaultBehaviour.Tests\n{\n    public class Issue88Tests : Issue88Tests<TestDbContext, TestEntity>\n    {\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            var options = new DbContextOptionsBuilder<TestDbContext>()\n                .UseInMemoryDatabase(Guid.NewGuid().ToString())\n                .ConfigureWarnings(x => x.Ignore(InMemoryEventId.TransactionIgnoredWarning))\n                .Options;\n\n            DbContextFactory = () => new TestDbContext(options);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/AsyncEnumerable.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Threading;\nusing Microsoft.EntityFrameworkCore.Query;\n\nnamespace EntityFrameworkCore.Testing.Common\n{\n    public class AsyncEnumerable<T> : IAsyncEnumerable<T>, IOrderedQueryable<T>\n    {\n        private readonly IQueryable<T> _source;\n\n        public AsyncEnumerable(IEnumerable<T> enumerable)\n        {\n            _source = enumerable.AsQueryable();\n\n            Provider = new AsyncQueryProvider<T>(_source);\n\n            Expression = _source.Expression;\n        }\n\n        public AsyncEnumerable(IEnumerable<T> enumerable, QueryRootExpression expression) : this(enumerable)\n        {\n            Expression = expression;\n        }\n\n        public IAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = new())\n        {\n            return new AsyncEnumerator<T>(_source);\n        }\n\n        IEnumerator<T> IEnumerable<T>.GetEnumerator()\n        {\n            return _source.GetEnumerator();\n        }\n\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return _source.GetEnumerator();\n        }\n\n        public Type ElementType => typeof(T);\n\n        public Expression Expression { get; }\n\n        public IQueryProvider Provider { get; }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/AsyncEnumerator.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace EntityFrameworkCore.Testing.Common\n{\n    public class AsyncEnumerator<T> : IAsyncEnumerator<T>\n    {\n        private readonly IEnumerator<T> _enumerator;\n\n        public AsyncEnumerator(IEnumerable<T> enumerable)\n        {\n            _enumerator = enumerable.GetEnumerator();\n        }\n\n        public ValueTask DisposeAsync()\n        {\n            return new();\n        }\n\n        public ValueTask<bool> MoveNextAsync()\n        {\n            return new(_enumerator.MoveNext());\n        }\n\n        public T Current => _enumerator.Current;\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/AsyncQueryProvider.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Reflection;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.EntityFrameworkCore.Query;\nusing Microsoft.EntityFrameworkCore.Query.Internal;\nusing Microsoft.Extensions.Logging;\nusing rgvlee.Core.Common.Helpers;\nusing ProjectExpressionHelper = EntityFrameworkCore.Testing.Common.Helpers.ExpressionHelper;\n\nnamespace EntityFrameworkCore.Testing.Common\n{\n    /// <inheritdoc />\n    public class AsyncQueryProvider<T> : IAsyncQueryProvider\n    {\n        private static readonly ILogger Logger = LoggingHelper.CreateLogger<AsyncQueryProvider<T>>();\n\n        public AsyncQueryProvider(IEnumerable<T> enumerable)\n        {\n            Source = enumerable.AsQueryable();\n        }\n\n        /// <summary>\n        ///     The query provider source.\n        /// </summary>\n        public IQueryable<T> Source { get; set; }\n\n        /// <inheritdoc />\n        /// <remarks>In this implementation it is just a wrapper for <see cref=\"AsyncQueryProvider{T}.CreateQuery{T}(Expression)\" /></remarks>\n        public virtual IQueryable CreateQuery(Expression expression)\n        {\n            Logger.LogDebug(\"CreateQuery: invoked\");\n\n            //Handles cases where we are projecting to another type\n            if (expression is MethodCallExpression mce)\n            {\n                var returnType = mce.Method.ReturnType;\n                if (returnType.GetGenericTypeDefinition() != typeof(IQueryable<>))\n                {\n                    throw new InvalidOperationException($\"Expected IQueryable<>; actual {returnType.FullName}\");\n                }\n\n                var createQueryMethod = typeof(IQueryProvider).GetMethods().Single(x => x.Name.Equals(nameof(IQueryProvider.CreateQuery)) && x.IsGenericMethod);\n\n                var createQueryResult = createQueryMethod.MakeGenericMethod(returnType.GetGenericArguments().Single()).Invoke(this, new[] { expression });\n\n                return (IQueryable) Activator.CreateInstance(typeof(AsyncEnumerable<>).GetGenericTypeDefinition().MakeGenericType(returnType.GetGenericArguments().Single()),\n                    createQueryResult);\n            }\n\n            return CreateQuery<T>(expression);\n        }\n\n        /// <inheritdoc />\n        public virtual IQueryable<TElement> CreateQuery<TElement>(Expression expression)\n        {\n            Logger.LogDebug(\"CreateQuery<TElement>: invoked\");\n\n            if (expression is FromSqlQueryRootExpression)\n            {\n                Logger.LogDebug(\"CreateQuery: catch all exception invoked\");\n                throw new NotSupportedException();\n            }\n\n            ProjectExpressionHelper.ThrowIfExpressionIsNotSupported(expression);\n\n            return new AsyncEnumerable<TElement>(Source.Provider.CreateQuery<TElement>(EnsureExpressionCanBeResolvedBySourceProvider(expression)));\n        }\n\n        /// <inheritdoc />\n        public virtual object Execute(Expression expression)\n        {\n            Logger.LogDebug(\"Execute: invoked\");\n            ProjectExpressionHelper.ThrowIfExpressionIsNotSupported(expression);\n            return Source.Provider.Execute(EnsureExpressionCanBeResolvedBySourceProvider(expression));\n        }\n\n        /// <inheritdoc />\n        public virtual TResult Execute<TResult>(Expression expression)\n        {\n            Logger.LogDebug(\"Execute<TResult>: invoked\");\n            ProjectExpressionHelper.ThrowIfExpressionIsNotSupported(expression);\n            return Source.Provider.Execute<TResult>(EnsureExpressionCanBeResolvedBySourceProvider(expression));\n        }\n\n        /// <inheritdoc />\n        public virtual TResult ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken)\n        {\n            //TResult is a Task<T>. The provider requires T.\n            return (TResult) typeof(AsyncQueryProvider<T>).GetMethod(nameof(WrapExecuteAsync), BindingFlags.Instance | BindingFlags.NonPublic)\n                .MakeGenericMethod(typeof(TResult).GetGenericArguments())\n                .Invoke(this, new object[] { expression, cancellationToken });\n        }\n\n        private Task<TResult> WrapExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken)\n        {\n            return Task.FromResult(Execute<TResult>(expression));\n        }\n\n        private Expression EnsureExpressionCanBeResolvedBySourceProvider(Expression expression)\n        {\n            Logger.LogDebug(\"EnsureExpressionCanBeResolvedBySourceProvider: invoked\");\n\n            if (expression is MethodCallExpression mce && mce.Arguments[0] is Microsoft.EntityFrameworkCore.Query.QueryRootExpression)\n            {\n                for (var i = 0; i < mce.Arguments.Count; i++)\n                {\n                    Logger.LogDebug(\"argument[{i}]: {argument}\", i, mce.Arguments[i].ToString());\n                }\n\n                //This ensures that Source provider will always be able to resolve the expression\n                var arguments = new List<Expression>();\n                arguments.Add(Source.Expression);\n                arguments.AddRange(mce.Arguments.Skip(1));\n\n                Logger.LogDebug(\"sourceExpression: {sourceExpression}\", Source.Expression.ToString());\n\n                for (var i = 0; i < mce.Arguments.Count; i++)\n                {\n                    Logger.LogDebug(\"argument[{i}]: {argument}\", i, mce.Arguments[i].ToString());\n                }\n\n                return Expression.Call(mce.Method, arguments);\n            }\n\n            return expression;\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/EntityFrameworkCore.Testing.Common.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n    <Authors>rgvlee</Authors>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <DocumentationFile>EntityFrameworkCore.Testing.Common.xml</DocumentationFile>\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <DocumentationFile>EntityFrameworkCore.Testing.Common.xml</DocumentationFile>\n    <DebugSymbols>true</DebugSymbols>\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.EntityFrameworkCore.InMemory\" Version=\"10.0.0\" />\n    <PackageReference Include=\"Microsoft.EntityFrameworkCore.Relational\" Version=\"10.0.0\" />\n    <PackageReference Include=\"Microsoft.Extensions.Logging\" Version=\"10.0.0\" />\n    <PackageReference Include=\"rgvlee.Core\" Version=\"1.2.1\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Compile Update=\"ExceptionMessages.Designer.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>ExceptionMessages.resx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n\n  <ItemGroup>\n    <EmbeddedResource Update=\"ExceptionMessages.resx\">\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>ExceptionMessages.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/EntityFrameworkCore.Testing.Common.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>EntityFrameworkCore.Testing.Common</name>\n    </assembly>\n    <members>\n        <member name=\"T:EntityFrameworkCore.Testing.Common.AsyncQueryProvider`1\">\n            <inheritdoc />\n        </member>\n        <member name=\"P:EntityFrameworkCore.Testing.Common.AsyncQueryProvider`1.Source\">\n            <summary>\n                The query provider source.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.AsyncQueryProvider`1.CreateQuery(System.Linq.Expressions.Expression)\">\n            <inheritdoc />\n            <remarks>In this implementation it is just a wrapper for <see cref=\"M:EntityFrameworkCore.Testing.Common.AsyncQueryProvider`1.CreateQuery``1(System.Linq.Expressions.Expression)\" /></remarks>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.AsyncQueryProvider`1.CreateQuery``1(System.Linq.Expressions.Expression)\">\n            <inheritdoc />\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.AsyncQueryProvider`1.Execute(System.Linq.Expressions.Expression)\">\n            <inheritdoc />\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.AsyncQueryProvider`1.Execute``1(System.Linq.Expressions.Expression)\">\n            <inheritdoc />\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.AsyncQueryProvider`1.ExecuteAsync``1(System.Linq.Expressions.Expression,System.Threading.CancellationToken)\">\n            <inheritdoc />\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.Common.ExceptionMessages\">\n            <summary>\n              A strongly-typed resource class, for looking up localized strings, etc.\n            </summary>\n        </member>\n        <member name=\"P:EntityFrameworkCore.Testing.Common.ExceptionMessages.ResourceManager\">\n            <summary>\n              Returns the cached ResourceManager instance used by this class.\n            </summary>\n        </member>\n        <member name=\"P:EntityFrameworkCore.Testing.Common.ExceptionMessages.Culture\">\n            <summary>\n              Overrides the current thread's CurrentUICulture property for all\n              resource lookups using this strongly typed resource class.\n            </summary>\n        </member>\n        <member name=\"P:EntityFrameworkCore.Testing.Common.ExceptionMessages.CannotCreateDbSetTypeNotIncludedInModel\">\n            <summary>\n              Looks up a localized string similar to Cannot create a DbSet for &apos;{0}&apos; because this type is not included in the model for the context..\n            </summary>\n        </member>\n        <member name=\"P:EntityFrameworkCore.Testing.Common.ExceptionMessages.UnableToFindSuitableDbContextConstructor\">\n            <summary>\n              Looks up a localized string similar to Unable to find a suitable constructor. TDbContext must have a parameterless or DbContextOptions/DbContextOptions&lt;TDbContext&gt; constructor..\n            </summary>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.Common.Helpers.BaseMockedDbContextBuilder`1\">\n            <summary>\n                The mocked db context builder.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        </member>\n        <member name=\"F:EntityFrameworkCore.Testing.Common.Helpers.BaseMockedDbContextBuilder`1.Options\">\n            <summary>\n                The create factory options.\n            </summary>\n        </member>\n        <member name=\"P:EntityFrameworkCore.Testing.Common.Helpers.BaseMockedDbContextBuilder`1.MockedDbContext\">\n            <summary>\n                The mocked db context.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.Helpers.BaseMockedDbContextBuilder`1.UseConstructorWithParameters(System.Object[])\">\n            <summary>\n                The parameters that will be used to create the mocked db context and, if one is not provided,\n                the in-memory context that the mocked db context will use for in-memory provider supported operations.\n            </summary>\n            <param name=\"constructorParameters\">\n                The constructor parameters.\n            </param>\n            <returns>The mocked db context builder.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.Helpers.BaseMockedDbContextBuilder`1.UseDbContext(`0)\">\n            <summary>\n                The db context instance that the mocked db context will use for in-memory provider supported operations.\n            </summary>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.Common.Helpers.BaseMockedDbContextFactory`1\">\n            <summary>\n                The base mocked db context factory.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        </member>\n        <member name=\"F:EntityFrameworkCore.Testing.Common.Helpers.BaseMockedDbContextFactory`1.Logger\">\n            <summary>\n                The logger instance.\n            </summary>\n        </member>\n        <member name=\"F:EntityFrameworkCore.Testing.Common.Helpers.BaseMockedDbContextFactory`1.ConstructorParameters\">\n            <summary>\n                The parameters that will be used to create the mocked db context and, if one is not provided,\n                the in-memory context that the mocked db context will use for in-memory provider supported operations.\n            </summary>\n        </member>\n        <member name=\"F:EntityFrameworkCore.Testing.Common.Helpers.BaseMockedDbContextFactory`1.DbContext\">\n            <summary>\n                The db context instance that the mocked db context will use for in-memory provider supported operations.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.Helpers.BaseMockedDbContextFactory`1.#ctor(EntityFrameworkCore.Testing.Common.Helpers.MockedDbContextFactoryOptions{`0})\">\n            <summary>\n                Constructor.\n            </summary>\n            <param name=\"options\">The mocked db context factory options.</param>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.Helpers.BaseMockedDbContextFactory`1.Create\">\n            <summary>\n                Creates and sets up a mocked db context.\n            </summary>\n            <returns>A mocked db context.</returns>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.Common.Helpers.ExpressionHelper\">\n            <summary>\n                A helper for expressions.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.Helpers.ExpressionHelper.CreatePropertyExpression``2(System.Reflection.PropertyInfo)\">\n            <summary>\n                Creates a property expression for the specified property.\n            </summary>\n            <typeparam name=\"TParameter\">The expression parameter.</typeparam>\n            <typeparam name=\"TProperty\">The expression property.</typeparam>\n            <param name=\"propertyInfo\">The property info of the property to create the expression for.</param>\n            <returns>A property expression for the specified property.</returns>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.Common.Helpers.IMockedDbContextBuilder`1\">\n            <summary>\n                The mocked db context builder.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        </member>\n        <member name=\"P:EntityFrameworkCore.Testing.Common.Helpers.IMockedDbContextBuilder`1.MockedDbContext\">\n            <summary>\n                The mocked db context.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.Helpers.IMockedDbContextBuilder`1.UseConstructorWithParameters(System.Object[])\">\n            <summary>\n                The parameters that will be used to create the mocked db context and, if one is not provided,\n                the in-memory context that the mocked db context will use for in-memory provider supported operations.\n            </summary>\n            <param name=\"constructorParameters\">\n                The constructor parameters.\n            </param>\n            <returns>The mocked db context builder.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.Helpers.IMockedDbContextBuilder`1.UseDbContext(`0)\">\n            <summary>\n                The db context instance that the mocked db context will use for in-memory provider supported operations.\n            </summary>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.Common.Helpers.MockedDbContextFactoryOptions`1\">\n            <summary>\n                The mocked db context factory options.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        </member>\n        <member name=\"P:EntityFrameworkCore.Testing.Common.Helpers.MockedDbContextFactoryOptions`1.DbContext\">\n            <summary>\n                The db context instance that the mocked db context will use for in-memory provider supported operations.\n            </summary>\n        </member>\n        <member name=\"P:EntityFrameworkCore.Testing.Common.Helpers.MockedDbContextFactoryOptions`1.ConstructorParameters\">\n            <summary>\n                The parameters that will be used to create the mocked db context and, if one is not provided,\n                the in-memory context that the mocked db context will use for in-memory provider supported operations.\n            </summary>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.Common.Helpers.ParameterMatchingHelper\">\n            <summary>\n                A helper for parameter matching.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.Helpers.ParameterMatchingHelper.DoInvocationParametersMatchSetUpParameters(System.Collections.Generic.IEnumerable{System.Object},System.Collections.Generic.IEnumerable{System.Object})\">\n            <summary>\n                Determines whether the invocation parameters match the set up parameters.\n            </summary>\n            <param name=\"setUpParameters\">The set up parameters.</param>\n            <param name=\"invocationParameters\">The invocation parameters.</param>\n            <returns>true the invocation parameters are a partial or full match of the set up parameters.</returns>\n            <remarks>\n                If the parameters are DbParameters, parameter name and value are compared.\n                Parameter name matching is case insensitive.\n                If the value is a string, the matching is case insensitive.\n                For everything else an exact match is required.\n            </remarks>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Common.Helpers.ParameterMatchingHelper.StringifyParameters(System.Collections.Generic.IEnumerable{System.Object})\">\n            <summary>\n                Converts a sequence of invocation parameters to a string of parameter names and values.\n            </summary>\n            <param name=\"invocationParameters\">The invocation parameters.</param>\n            <returns>A string of parameter names and values.</returns>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/ExceptionMessages.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EntityFrameworkCore.Testing.Common {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public class ExceptionMessages {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal ExceptionMessages() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EntityFrameworkCore.Testing.Common.ExceptionMessages\", typeof(ExceptionMessages).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Cannot create a DbSet for &apos;{0}&apos; because this type is not included in the model for the context..\n        /// </summary>\n        public static string CannotCreateDbSetTypeNotIncludedInModel {\n            get {\n                return ResourceManager.GetString(\"CannotCreateDbSetTypeNotIncludedInModel\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unable to find a suitable constructor. TDbContext must have a parameterless or DbContextOptions/DbContextOptions&lt;TDbContext&gt; constructor..\n        /// </summary>\n        public static string UnableToFindSuitableDbContextConstructor {\n            get {\n                return ResourceManager.GetString(\"UnableToFindSuitableDbContextConstructor\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/ExceptionMessages.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"CannotCreateDbSetTypeNotIncludedInModel\" xml:space=\"preserve\">\n    <value>Cannot create a DbSet for '{0}' because this type is not included in the model for the context.</value>\n  </data>\n  <data name=\"UnableToFindSuitableDbContextConstructor\" xml:space=\"preserve\">\n    <value>Unable to find a suitable constructor. TDbContext must have a parameterless or DbContextOptions/DbContextOptions&lt;TDbContext&gt; constructor.</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/Helpers/BaseMockedDbContextBuilder.cs",
    "content": "﻿using Microsoft.EntityFrameworkCore;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.Common.Helpers\n{\n    /// <summary>\n    ///     The mocked db context builder.\n    /// </summary>\n    /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n    public abstract class BaseMockedDbContextBuilder<TDbContext> : IMockedDbContextBuilder<TDbContext> where TDbContext : DbContext\n    {\n        /// <summary>\n        ///     The create factory options.\n        /// </summary>\n        protected readonly MockedDbContextFactoryOptions<TDbContext> Options = new();\n\n        /// <summary>\n        ///     The mocked db context.\n        /// </summary>\n        public abstract TDbContext MockedDbContext { get; }\n\n        /// <summary>\n        ///     The parameters that will be used to create the mocked db context and, if one is not provided,\n        ///     the in-memory context that the mocked db context will use for in-memory provider supported operations.\n        /// </summary>\n        /// <param name=\"constructorParameters\">\n        ///     The constructor parameters.\n        /// </param>\n        /// <returns>The mocked db context builder.</returns>\n        public IMockedDbContextBuilder<TDbContext> UseConstructorWithParameters(params object[] constructorParameters)\n        {\n            EnsureArgument.IsNotEmpty(constructorParameters, nameof(constructorParameters));\n            Options.ConstructorParameters = constructorParameters;\n            return this;\n        }\n\n        /// <summary>\n        ///     The db context instance that the mocked db context will use for in-memory provider supported operations.\n        /// </summary>\n        public IMockedDbContextBuilder<TDbContext> UseDbContext(TDbContext dbContext)\n        {\n            EnsureArgument.IsNotNull(dbContext, nameof(dbContext));\n            Options.DbContext = dbContext;\n            return this;\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/Helpers/BaseMockedDbContextFactory.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.Extensions.Logging;\nusing rgvlee.Core.Common.Extensions;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.Common.Helpers\n{\n    /// <summary>\n    ///     The base mocked db context factory.\n    /// </summary>\n    /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n    public abstract class BaseMockedDbContextFactory<TDbContext> where TDbContext : DbContext\n    {\n        /// <summary>\n        ///     The logger instance.\n        /// </summary>\n        protected static readonly ILogger Logger = LoggingHelper.CreateLogger<BaseMockedDbContextFactory<TDbContext>>();\n\n        /// <summary>\n        ///     The parameters that will be used to create the mocked db context and, if one is not provided,\n        ///     the in-memory context that the mocked db context will use for in-memory provider supported operations.\n        /// </summary>\n        protected readonly List<object> ConstructorParameters;\n\n        /// <summary>\n        ///     The db context instance that the mocked db context will use for in-memory provider supported operations.\n        /// </summary>\n        protected readonly TDbContext DbContext;\n\n        /// <summary>\n        ///     Constructor.\n        /// </summary>\n        /// <param name=\"options\">The mocked db context factory options.</param>\n        protected BaseMockedDbContextFactory(MockedDbContextFactoryOptions<TDbContext> options)\n        {\n            DbContext = options.DbContext;\n\n            ConstructorParameters = options.ConstructorParameters?.ToList();\n\n            if (ConstructorParameters == null || !ConstructorParameters.Any())\n            {\n                var dbContextType = typeof(TDbContext);\n\n                if (!dbContextType.HasConstructor(typeof(DbContextOptions)) &&\n                    !dbContextType.HasConstructor(typeof(DbContextOptions<TDbContext>)) &&\n                    !dbContextType.HasParameterlessConstructor())\n                {\n                    throw new MissingMethodException(ExceptionMessages.UnableToFindSuitableDbContextConstructor);\n                }\n\n                if (DbContext != null && dbContextType.HasParameterlessConstructor())\n                {\n                    ConstructorParameters = new List<object>();\n                }\n                else if (!dbContextType.HasConstructor(typeof(DbContextOptions<>)))\n                {\n                    ConstructorParameters = new List<object> { new DbContextOptionsBuilder<TDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options };\n                }\n                else if (!dbContextType.HasConstructor(typeof(DbContextOptions)))\n                {\n                    ConstructorParameters = new List<object> { new DbContextOptionsBuilder().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options };\n                }\n            }\n\n            if (DbContext == null)\n            {\n                DbContext = (TDbContext) Activator.CreateInstance(typeof(TDbContext), ConstructorParameters?.ToArray());\n            }\n        }\n\n        /// <summary>\n        ///     Creates and sets up a mocked db context.\n        /// </summary>\n        /// <returns>A mocked db context.</returns>\n        public abstract TDbContext Create();\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/Helpers/ExpressionHelper.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Reflection;\nusing Microsoft.EntityFrameworkCore.Query.Internal;\nusing Microsoft.Extensions.Logging;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.Common.Helpers\n{\n    /// <summary>\n    ///     A helper for expressions.\n    /// </summary>\n    public static class ExpressionHelper\n    {\n        private static readonly ILogger Logger = LoggingHelper.CreateLogger(typeof(ExpressionHelper));\n\n        /// <summary>\n        ///     Creates a property expression for the specified property.\n        /// </summary>\n        /// <typeparam name=\"TParameter\">The expression parameter.</typeparam>\n        /// <typeparam name=\"TProperty\">The expression property.</typeparam>\n        /// <param name=\"propertyInfo\">The property info of the property to create the expression for.</param>\n        /// <returns>A property expression for the specified property.</returns>\n        public static Expression<Func<TParameter, TProperty>> CreatePropertyExpression<TParameter, TProperty>(PropertyInfo propertyInfo)\n        {\n            EnsureArgument.IsNotNull(propertyInfo, nameof(propertyInfo));\n\n            var parameter = Expression.Parameter(typeof(TParameter));\n            return Expression.Lambda<Func<TParameter, TProperty>>(Expression.Property(parameter, propertyInfo), parameter);\n        }\n\n        public static bool SqlAndParametersMatchFromSqlExpression(string sql, IEnumerable<object> parameters, FromSqlQueryRootExpression expression)\n        {\n            EnsureArgument.IsNotNull(expression, nameof(expression));\n            EnsureArgument.IsNotNull(parameters, nameof(parameters));\n\n            var result = SqlMatchesFromSqlExpression(sql, expression) &&\n                         ParameterMatchingHelper.DoInvocationParametersMatchSetUpParameters(parameters, (object[]) ((ConstantExpression) expression.Argument).Value);\n\n            Logger.LogDebug(\"Match? {result}\", result);\n\n            return result;\n        }\n\n        private static bool SqlMatchesFromSqlExpression(string sql, FromSqlQueryRootExpression expression)\n        {\n            EnsureArgument.IsNotNull(expression, nameof(expression));\n\n            var expressionSql = expression.Sql;\n            var parts = new List<string>();\n            parts.Add($\"Invocation sql: '{expressionSql}'\");\n            parts.Add($\"Set up sql: '{sql}'\");\n            Logger.LogDebug(string.Join(Environment.NewLine, parts));\n\n            var result = expressionSql.Contains(sql, StringComparison.OrdinalIgnoreCase);\n\n            Logger.LogDebug(\"Match? {result}\", result);\n\n            return result;\n        }\n\n        public static string StringifyFromSqlExpression(FromSqlQueryRootExpression expression)\n        {\n            EnsureArgument.IsNotNull(expression, nameof(expression));\n\n            var expressionSql = expression.Sql;\n            var expressionParameters = (object[]) ((ConstantExpression) expression.Argument).Value;\n            var parts = new List<string>();\n            parts.Add($\"Invocation sql: '{expressionSql}'\");\n            parts.Add(\"Invocation Parameters:\");\n            parts.Add(ParameterMatchingHelper.StringifyParameters(expressionParameters));\n            return string.Join(Environment.NewLine, parts);\n        }\n\n        public static void ThrowIfExpressionIsNotSupported(Expression expression)\n        {\n            if (expression is MethodCallExpression mce)\n            {\n                Logger.LogDebug(\"{methodName} invoked; expression: '{expression}'\", mce.Method.Name, mce);\n\n                if (mce.Method.Name.Equals(nameof(Queryable.ElementAt)))\n                {\n                    throw new InvalidOperationException();\n                }\n\n                if (mce.Method.Name.Equals(nameof(Queryable.ElementAtOrDefault)))\n                {\n                    throw new InvalidOperationException();\n                }\n\n                if (mce.Method.Name.Equals(nameof(Queryable.Select)))\n                {\n                    var unaryExpression = (UnaryExpression) mce.Arguments[1];\n                    var predicateExpression = unaryExpression.Operand;\n                    if (predicateExpression.Type.GetGenericArguments().ToList().Count.Equals(3))\n                    {\n                        throw new InvalidOperationException();\n                    }\n                }\n\n                if (mce.Method.Name.Equals(nameof(Queryable.SkipWhile)))\n                {\n                    throw new InvalidOperationException();\n                }\n\n                if (mce.Method.Name.Equals(nameof(Queryable.TakeWhile)))\n                {\n                    throw new InvalidOperationException();\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/Helpers/IMockedDbContextBuilder.cs",
    "content": "﻿using Microsoft.EntityFrameworkCore;\n\nnamespace EntityFrameworkCore.Testing.Common.Helpers\n{\n    /// <summary>\n    ///     The mocked db context builder.\n    /// </summary>\n    /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n    public interface IMockedDbContextBuilder<TDbContext> where TDbContext : DbContext\n    {\n        /// <summary>\n        ///     The mocked db context.\n        /// </summary>\n        TDbContext MockedDbContext { get; }\n\n        /// <summary>\n        ///     The parameters that will be used to create the mocked db context and, if one is not provided,\n        ///     the in-memory context that the mocked db context will use for in-memory provider supported operations.\n        /// </summary>\n        /// <param name=\"constructorParameters\">\n        ///     The constructor parameters.\n        /// </param>\n        /// <returns>The mocked db context builder.</returns>\n        IMockedDbContextBuilder<TDbContext> UseConstructorWithParameters(params object[] constructorParameters);\n\n        /// <summary>\n        ///     The db context instance that the mocked db context will use for in-memory provider supported operations.\n        /// </summary>\n        IMockedDbContextBuilder<TDbContext> UseDbContext(TDbContext dbContext);\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/Helpers/MockedDbContextFactoryOptions.cs",
    "content": "﻿using System.Collections.Generic;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace EntityFrameworkCore.Testing.Common.Helpers\n{\n    /// <summary>\n    ///     The mocked db context factory options.\n    /// </summary>\n    /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n    public class MockedDbContextFactoryOptions<TDbContext> where TDbContext : DbContext\n    {\n        /// <summary>\n        ///     The db context instance that the mocked db context will use for in-memory provider supported operations.\n        /// </summary>\n        public TDbContext DbContext { get; set; }\n\n        /// <summary>\n        ///     The parameters that will be used to create the mocked db context and, if one is not provided,\n        ///     the in-memory context that the mocked db context will use for in-memory provider supported operations.\n        /// </summary>\n        public IEnumerable<object> ConstructorParameters { get; set; }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/Helpers/ParameterMatchingHelper.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Data.Common;\nusing System.Linq;\nusing System.Text;\nusing Microsoft.Extensions.Logging;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.Common.Helpers\n{\n    /// <summary>\n    ///     A helper for parameter matching.\n    /// </summary>\n    public class ParameterMatchingHelper\n    {\n        private static readonly ILogger Logger = LoggingHelper.CreateLogger(typeof(ParameterMatchingHelper));\n\n        /// <summary>\n        ///     Determines whether the invocation parameters match the set up parameters.\n        /// </summary>\n        /// <param name=\"setUpParameters\">The set up parameters.</param>\n        /// <param name=\"invocationParameters\">The invocation parameters.</param>\n        /// <returns>true the invocation parameters are a partial or full match of the set up parameters.</returns>\n        /// <remarks>\n        ///     If the parameters are DbParameters, parameter name and value are compared.\n        ///     Parameter name matching is case insensitive.\n        ///     If the value is a string, the matching is case insensitive.\n        ///     For everything else an exact match is required.\n        /// </remarks>\n        public static bool DoInvocationParametersMatchSetUpParameters(IEnumerable<object> setUpParameters, IEnumerable<object> invocationParameters)\n        {\n            var setUpParametersAsList = setUpParameters.ToList();\n            var invocationParametersAsList = invocationParameters.ToList();\n\n            var matches = new Dictionary<int, int>();\n            for (var i = 0; i < invocationParametersAsList.Count; i++)\n            {\n                var invocationParameter = invocationParametersAsList[i];\n                Logger.LogDebug(\"Checking invocationParameter '{invocationParameter}'\", invocationParameter);\n                matches.Add(i, -1);\n\n                //What was the last set up parameter matched?\n                var startAt = matches.Any() ? matches.Max(x => x.Value) + 1 : 0;\n                Logger.LogDebug(\"startAt: {startAt}\", startAt);\n\n                for (var j = 0; j < setUpParametersAsList.Count; j++)\n                {\n                    var setUpParameter = setUpParametersAsList[j];\n                    Logger.LogDebug(\"Checking setUpParameter '{setUpParameter}'\", setUpParameter);\n\n                    if (invocationParameter is DbParameter dbInvocationParameter &&\n                        setUpParameter is DbParameter dbSetUpParameter &&\n                        DoesInvocationParameterMatchSetUpParameter(dbSetUpParameter, dbInvocationParameter))\n                    {\n                        matches[i] = j;\n                        break;\n                    }\n\n                    if (DoesInvocationParameterValueMatchSetUpParameterValue(setUpParameter, invocationParameter))\n                    {\n                        matches[i] = j;\n                        break;\n                    }\n                }\n            }\n\n            Logger.LogDebug(\"Match summary '{summary}'\", string.Join(Environment.NewLine, matches.Select(x => $\"{x.Key}: {x.Value}\")));\n\n            return matches.Count(x => x.Value > -1) >= setUpParametersAsList.Count;\n        }\n\n        private static bool DoesInvocationParameterValueMatchSetUpParameterValue(object setUpParameter, object invocationParameter)\n        {\n            if (invocationParameter == setUpParameter)\n            {\n                return true;\n            }\n\n            if (invocationParameter != null && setUpParameter != null && invocationParameter.Equals(setUpParameter))\n            {\n                return true;\n            }\n\n            if (invocationParameter is string stringInvocationParameterValue &&\n                setUpParameter is string stringSetUpParameterValue &&\n                stringInvocationParameterValue.Equals(stringSetUpParameterValue, StringComparison.OrdinalIgnoreCase))\n            {\n                return true;\n            }\n\n            return false;\n        }\n\n        private static bool DoesInvocationParameterMatchSetUpParameter(IDataParameter setUpParameter, IDataParameter invocationParameter)\n        {\n            var setUpParameterParameterName = setUpParameter.ParameterName ?? string.Empty;\n            var invocationParameterParameterName = invocationParameter.ParameterName ?? string.Empty;\n\n            if (!invocationParameterParameterName.Equals(setUpParameterParameterName, StringComparison.OrdinalIgnoreCase))\n            {\n                return false;\n            }\n\n            return DoesInvocationParameterValueMatchSetUpParameterValue(setUpParameter.Value, invocationParameter.Value);\n        }\n\n        /// <summary>\n        ///     Converts a sequence of invocation parameters to a string of parameter names and values.\n        /// </summary>\n        /// <param name=\"invocationParameters\">The invocation parameters.</param>\n        /// <returns>A string of parameter names and values.</returns>\n        public static string StringifyParameters(IEnumerable<object> invocationParameters)\n        {\n            var invocationParametersAsList = invocationParameters.ToList();\n            var parts = new List<string>();\n            for (var i = 0; i < invocationParametersAsList.Count; i++)\n            {\n                var invocationParameter = invocationParametersAsList[i];\n\n                var sb = new StringBuilder();\n                switch (invocationParameter)\n                {\n                    case DbParameter dbInvocationParameter:\n                    {\n                        sb.Append(dbInvocationParameter.ParameterName);\n                        sb.Append(\": \");\n                        if (dbInvocationParameter.Value == null)\n                        {\n                            sb.Append(\"null\");\n                        }\n                        else\n                        {\n                            sb.Append(dbInvocationParameter.Value);\n                        }\n\n                        break;\n                    }\n\n                    case null:\n                        sb.Append(\"Parameter \");\n                        sb.Append(i);\n                        sb.Append(\": null\");\n                        break;\n\n                    default:\n                        sb.Append(\"Parameter \");\n                        sb.Append(i);\n                        sb.Append(\": \");\n                        sb.Append(invocationParameter);\n                        break;\n                }\n\n                parts.Add(sb.ToString());\n            }\n\n            return string.Join(Environment.NewLine, parts);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common/QueryRootExpression.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.EntityFrameworkCore.Query;\n\nnamespace EntityFrameworkCore.Testing.Common\n{\n    public class FakeQueryRootExpression : EntityQueryRootExpression\n    {\n        public FakeQueryRootExpression(IAsyncQueryProvider asyncQueryProvider, IEntityType entityType) : base(asyncQueryProvider, entityType)\n        {\n            Type = typeof(IOrderedQueryable<>).MakeGenericType(entityType.ClrType);\n        }\n\n        public override Type Type { get; }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/AsyncEnumerableTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing AutoFixture;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public class AsyncEnumerableTests : BaseForQueryableTests<TestEntity>\n    {\n        private IQueryable<TestEntity> _source;\n\n        protected override IQueryable<TestEntity> Queryable => _source;\n\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            _source = new AsyncEnumerable<TestEntity>(new List<TestEntity>());\n        }\n\n        protected override void SeedQueryableSource()\n        {\n            var itemsToAdd = Fixture.Build<TestEntity>().With(p => p.CreatedAt, DateTime.Today).With(p => p.LastModifiedAt, DateTime.Today).CreateMany().ToList();\n            _source = new AsyncEnumerable<TestEntity>(itemsToAdd);\n            ItemsAddedToQueryableSource = itemsToAdd;\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/BaseForDbContextTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing Microsoft.Data.SqlClient;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing AutoFixture;\nusing FluentAssertions;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public abstract class BaseForDbContextTests<TDbContext> : BaseForTests where TDbContext : DbContext\n    {\n        protected TDbContext MockedDbContext;\n\n        public abstract void AddExecuteSqlInterpolatedResult(TDbContext mockedDbContext, int expectedResult);\n\n        public abstract void AddExecuteSqlInterpolatedResult(TDbContext mockedDbContext, FormattableString sql, int expectedResult);\n\n        public abstract void AddExecuteSqlInterpolatedResult(TDbContext mockedDbContext, string sql, IEnumerable<object> parameters, int expectedResult);\n\n        public abstract void AddExecuteSqlRawResult(TDbContext mockedDbContext, int expectedResult);\n\n        public abstract void AddExecuteSqlRawResult(TDbContext mockedDbContext, string sql, int expectedResult);\n\n        public abstract void AddExecuteSqlRawResult(TDbContext mockedDbContext, string sql, IEnumerable<object> parameters, int expectedResult);\n\n        [Test]\n        public void ExecuteSqlInterpolated_AnySql_ReturnsExpectedResult()\n        {\n            var expectedResult = 1;\n            AddExecuteSqlInterpolatedResult(MockedDbContext, expectedResult);\n\n            var actualResult1 = MockedDbContext.Database.ExecuteSqlInterpolated($\"sp_NoParams\");\n            var actualResult2 = MockedDbContext.Database.ExecuteSqlInterpolated($\"sp_NoParams\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlInterpolated_SpecifiedFormattableStringWithSqlParameterParameters_ReturnsExpectedResult()\n        {\n            var sql = \"sp_WithParams\";\n            var parameters = new List<SqlParameter> { new(\"@SomeParameter2\", \"Value2\") };\n            var expectedResult = 1;\n            AddExecuteSqlInterpolatedResult(MockedDbContext, sql, parameters, expectedResult);\n\n            var actualResult1 = MockedDbContext.Database.ExecuteSqlInterpolated($\"[dbo].[sp_WithParams] {parameters[0]} {Fixture.Create<string>()}\");\n            var actualResult2 = MockedDbContext.Database.ExecuteSqlInterpolated($\"[dbo].[sp_WithParams] {parameters[0]} {Fixture.Create<string>()}\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlInterpolated_SpecifiedFormattableStringWithSqlParameterParametersThatDoNotMatchSetUp_ThrowsException()\n        {\n            var sql = \"sp_WithParams\";\n            var setUpParameters = new List<SqlParameter> { new(\"@SomeParameter3\", \"Value3\") };\n            var invocationParameters = new List<SqlParameter> { new(\"@SomeParameter1\", \"Value1\"), new(\"@SomeParameter2\", \"Value2\") };\n            var expectedResult = 1;\n            AddExecuteSqlInterpolatedResult(MockedDbContext, sql, setUpParameters, expectedResult);\n\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                var actualResult1 = MockedDbContext.Database.ExecuteSqlInterpolated($\"[dbo].[sp_WithParams] {invocationParameters[0]}, {invocationParameters[1]}\");\n            });\n\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                var actualResult2 = MockedDbContext.Database.ExecuteSqlInterpolated($\"[dbo].[sp_WithParams] {invocationParameters[0]}, {invocationParameters[1]}\");\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlInterpolated_SpecifiedSql_ReturnsExpectedResult()\n        {\n            var sql = (FormattableString) $\"sp_NoParams\";\n            var expectedResult = 1;\n            AddExecuteSqlInterpolatedResult(MockedDbContext, sql, expectedResult);\n\n            var actualResult1 = MockedDbContext.Database.ExecuteSqlInterpolated($\"sp_NoParams\");\n            var actualResult2 = MockedDbContext.Database.ExecuteSqlInterpolated($\"sp_NoParams\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlInterpolated_SpecifiedSqlThatDoesNotMatchSetUp_ThrowsException()\n        {\n            var sql = (FormattableString) $\"asdf\";\n            var expectedResult = 1;\n            AddExecuteSqlInterpolatedResult(MockedDbContext, sql, expectedResult);\n\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                var actualResult = MockedDbContext.Database.ExecuteSqlInterpolated($\"sp_NoParams\");\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlInterpolated_WithNoMatchesAdded_ThrowsException()\n        {\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                var actualResult = MockedDbContext.Database.ExecuteSqlInterpolated($\"sp_NoParams\");\n            });\n        }\n\n        [Test]\n        public async Task ExecuteSqlInterpolatedAsync_AnySql_ReturnsExpectedResult()\n        {\n            var expectedResult = 1;\n            AddExecuteSqlInterpolatedResult(MockedDbContext, expectedResult);\n\n            var actualResult1 = await MockedDbContext.Database.ExecuteSqlInterpolatedAsync($\"sp_NoParams\");\n            var actualResult2 = await MockedDbContext.Database.ExecuteSqlInterpolatedAsync($\"sp_NoParams\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public async Task ExecuteSqlInterpolatedAsync_SpecifiedFormattableStringWithSqlParameterParameters_ReturnsExpectedResult()\n        {\n            var sql = \"sp_WithParams\";\n            var parameters = new List<SqlParameter> { new(\"@SomeParameter2\", \"Value2\") };\n            var expectedResult = 1;\n            AddExecuteSqlInterpolatedResult(MockedDbContext, sql, parameters, expectedResult);\n\n            var actualResult1 = await MockedDbContext.Database.ExecuteSqlInterpolatedAsync($\"[dbo].[sp_WithParams] {parameters[0]} {Fixture.Create<string>()}\");\n            var actualResult2 = await MockedDbContext.Database.ExecuteSqlInterpolatedAsync($\"[dbo].[sp_WithParams] {parameters[0]} {Fixture.Create<string>()}\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public async Task ExecuteSqlInterpolatedAsync_SpecifiedFormattableStringWithStringParameters_ReturnsExpectedResult()\n        {\n            var sql = \"sp_WithParams\";\n            var parameters = new List<string> { \"Value2\" };\n            var expectedResult = 1;\n            AddExecuteSqlInterpolatedResult(MockedDbContext, sql, parameters, expectedResult);\n\n            var actualResult1 = await MockedDbContext.Database.ExecuteSqlInterpolatedAsync($\"[dbo].[sp_WithParams] {parameters[0]} {Fixture.Create<string>()}\");\n            var actualResult2 = await MockedDbContext.Database.ExecuteSqlInterpolatedAsync($\"[dbo].[sp_WithParams] {parameters[0]} {Fixture.Create<string>()}\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public async Task ExecuteSqlInterpolatedAsync_SpecifiedSql_ReturnsExpectedResult()\n        {\n            var sql = (FormattableString) $\"sp_NoParams\";\n            var expectedResult = 1;\n            AddExecuteSqlInterpolatedResult(MockedDbContext, sql, expectedResult);\n\n            var actualResult1 = await MockedDbContext.Database.ExecuteSqlInterpolatedAsync($\"sp_NoParams\");\n            var actualResult2 = await MockedDbContext.Database.ExecuteSqlInterpolatedAsync($\"sp_NoParams\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlInterpolatedAsync_SpecifiedSqlThatDoesNotMatchSetUp_ThrowsException()\n        {\n            var sql = (FormattableString) $\"asdf\";\n            var expectedResult = 1;\n            AddExecuteSqlInterpolatedResult(MockedDbContext, sql, expectedResult);\n\n            Assert.ThrowsAsync<InvalidOperationException>(async () =>\n            {\n                var actualResult = await MockedDbContext.Database.ExecuteSqlInterpolatedAsync($\"sp_NoParams\");\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlInterpolatedUsingFormattableStringSetUp_SpecifiedFormattableStringWithStringParameters_ReturnsExpectedResult()\n        {\n            var parameters = new List<string> { \"Value2\" };\n            var sql = (FormattableString) $\"[sp_WithParams] {parameters[0]}\";\n            var expectedResult = 1;\n            AddExecuteSqlInterpolatedResult(MockedDbContext, sql, expectedResult);\n\n            var actualResult1 = MockedDbContext.Database.ExecuteSqlInterpolated($\"[dbo].[sp_WithParams] {parameters[0]} {Fixture.Create<string>()}\");\n            var actualResult2 = MockedDbContext.Database.ExecuteSqlInterpolated($\"[dbo].[sp_WithParams] {parameters[0]} {Fixture.Create<string>()}\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlInterpolatedUsingFormattableStringSetUp_SpecifiedFormattableStringWithStringParametersThatDoesNotMatchSetUp_ThrowsException()\n        {\n            var parameters = new List<string> { \"Value2\" };\n            var sql = (FormattableString) $\"[sp_WithParams] {parameters[0]}\";\n            var expectedResult = 1;\n            AddExecuteSqlInterpolatedResult(MockedDbContext, sql, expectedResult);\n\n            var actualResult1 = MockedDbContext.Database.ExecuteSqlInterpolated($\"[dbo].[sp_WithParams] {Fixture.Create<string>()} {parameters[0]}\");\n            var actualResult2 = MockedDbContext.Database.ExecuteSqlInterpolated($\"[dbo].[sp_WithParams] {Fixture.Create<string>()} {parameters[0]}\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlInterpolatedUsingSqlAndParameterSetUp_SpecifiedFormattableStringWithStringParameters_ReturnsExpectedResult()\n        {\n            var sql = \"sp_WithParams\";\n            var parameters = new List<string> { \"Value2\" };\n            var expectedResult = 1;\n            AddExecuteSqlInterpolatedResult(MockedDbContext, sql, parameters, expectedResult);\n\n            var actualResult1 = MockedDbContext.Database.ExecuteSqlInterpolated($\"[dbo].[sp_WithParams] {parameters[0]} {Fixture.Create<string>()}\");\n            var actualResult2 = MockedDbContext.Database.ExecuteSqlInterpolated($\"[dbo].[sp_WithParams] {parameters[0]} {Fixture.Create<string>()}\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlRaw_AnySql_ReturnsExpectedResult()\n        {\n            var expectedResult = 1;\n            AddExecuteSqlRawResult(MockedDbContext, expectedResult);\n\n            var actualResult1 = MockedDbContext.Database.ExecuteSqlRaw(\"sp_NoParams\");\n            var actualResult2 = MockedDbContext.Database.ExecuteSqlRaw(\"sp_NoParams\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlRaw_SpecifiedSql_ReturnsExpectedResult()\n        {\n            var sql = \"sp_NoParams\";\n            var expectedResult = 1;\n            AddExecuteSqlRawResult(MockedDbContext, sql, expectedResult);\n\n            var actualResult1 = MockedDbContext.Database.ExecuteSqlRaw(\"sp_NoParams\");\n            var actualResult2 = MockedDbContext.Database.ExecuteSqlRaw(\"sp_NoParams\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlRaw_SpecifiedSqlThatDoesNotMatchSetUp_ThrowsException()\n        {\n            var sql = \"asdf\";\n            var expectedResult = 1;\n            AddExecuteSqlRawResult(MockedDbContext, sql, expectedResult);\n\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                var actualResult = MockedDbContext.Database.ExecuteSqlRaw(\"sp_NoParams\");\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlRaw_SpecifiedSqlWithSqlParameterParameters_ReturnsExpectedResult()\n        {\n            var sql = \"sp_WithParams\";\n            var parameters = new List<SqlParameter> { new(\"@SomeParameter2\", \"Value2\") };\n            var expectedResult = 1;\n            AddExecuteSqlRawResult(MockedDbContext, sql, parameters, expectedResult);\n\n            var actualResult1 = MockedDbContext.Database.ExecuteSqlRaw(\"[dbo].[sp_WithParams] @SomeParameter1 @SomeParameter2\", parameters);\n            var actualResult2 = MockedDbContext.Database.ExecuteSqlRaw(\"[dbo].[sp_WithParams] @SomeParameter1 @SomeParameter2\", parameters);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlRaw_SpecifiedSqlWithSqlParameterParametersThatDoNotMatchSetUp_ThrowsException()\n        {\n            var sql = \"sp_WithParams\";\n            var setUpParameters = new List<SqlParameter> { new(\"@SomeParameter3\", \"Value3\") };\n            var invocationParameters = new List<SqlParameter> { new(\"@SomeParameter1\", \"Value1\"), new(\"@SomeParameter2\", \"Value2\") };\n            var expectedResult = 1;\n            AddExecuteSqlRawResult(MockedDbContext, sql, setUpParameters, expectedResult);\n\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                var actualResult1 = MockedDbContext.Database.ExecuteSqlRaw(\"[dbo].[sp_WithParams] @SomeParameter1 @SomeParameter2\", invocationParameters);\n            });\n\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                var actualResult2 = MockedDbContext.Database.ExecuteSqlRaw(\"[dbo].[sp_WithParams] @SomeParameter1 @SomeParameter2\", invocationParameters);\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlRaw_SpecifiedSqlWithStringParameters_ReturnsExpectedResult()\n        {\n            var sql = \"sp_WithParams\";\n            var parameters = new List<string> { \"Value2\" };\n            var expectedResult = 1;\n            AddExecuteSqlRawResult(MockedDbContext, sql, parameters, expectedResult);\n\n            var actualResult1 = MockedDbContext.Database.ExecuteSqlRaw(\"[dbo].[sp_WithParams] @SomeParameter1 @SomeParameter2\", parameters);\n            var actualResult2 = MockedDbContext.Database.ExecuteSqlRaw(\"[dbo].[sp_WithParams] @SomeParameter1 @SomeParameter2\", parameters);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlRaw_WithNoMatchesAdded_ThrowsException()\n        {\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                var actualResult = MockedDbContext.Database.ExecuteSqlRaw(\"sp_NoParams\");\n            });\n        }\n\n        [Test]\n        public async Task ExecuteSqlRawAsync_AnySql_ReturnsExpectedResult()\n        {\n            var expectedResult = 1;\n            AddExecuteSqlRawResult(MockedDbContext, expectedResult);\n\n            var actualResult1 = await MockedDbContext.Database.ExecuteSqlRawAsync(\"sp_NoParams\");\n            var actualResult2 = await MockedDbContext.Database.ExecuteSqlRawAsync(\"sp_NoParams\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public async Task ExecuteSqlRawAsync_SpecifiedSql_ReturnsExpectedResult()\n        {\n            var sql = \"sp_NoParams\";\n            var expectedResult = 1;\n            AddExecuteSqlRawResult(MockedDbContext, sql, expectedResult);\n\n            var actualResult1 = await MockedDbContext.Database.ExecuteSqlRawAsync(\"sp_NoParams\");\n            var actualResult2 = await MockedDbContext.Database.ExecuteSqlRawAsync(\"sp_NoParams\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public void ExecuteSqlRawAsync_SpecifiedSqlThatDoesNotMatchSetUp_ThrowsException()\n        {\n            var sql = \"asdf\";\n            var expectedResult = 1;\n            AddExecuteSqlRawResult(MockedDbContext, sql, expectedResult);\n\n            Assert.ThrowsAsync<InvalidOperationException>(async () =>\n            {\n                var actualResult = await MockedDbContext.Database.ExecuteSqlRawAsync(\"sp_NoParams\");\n            });\n        }\n\n        [Test]\n        public async Task ExecuteSqlRawAsync_SpecifiedSqlWithSqlParameterParameters_ReturnsExpectedResult()\n        {\n            var sql = \"sp_WithParams\";\n            var parameters = new List<SqlParameter> { new(\"@SomeParameter2\", \"Value2\") };\n            var expectedResult = 1;\n            AddExecuteSqlRawResult(MockedDbContext, sql, parameters, expectedResult);\n\n            var actualResult1 = await MockedDbContext.Database.ExecuteSqlRawAsync(\"[dbo].[sp_WithParams] @SomeParameter2\", parameters);\n            var actualResult2 = await MockedDbContext.Database.ExecuteSqlRawAsync(\"[dbo].[sp_WithParams] @SomeParameter2\", parameters);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public async Task ExecuteSqlRawAsync_SpecifiedSqlWithStringParameters_ReturnsExpectedResult()\n        {\n            var sql = \"sp_WithParams\";\n            var parameters = new List<string> { \"Value2\" };\n            var expectedResult = 1;\n            AddExecuteSqlRawResult(MockedDbContext, sql, parameters, expectedResult);\n\n            var actualResult1 = await MockedDbContext.Database.ExecuteSqlRawAsync(\"[dbo].[sp_WithParams] @SomeParameter2\", parameters);\n            var actualResult2 = await MockedDbContext.Database.ExecuteSqlRawAsync(\"[dbo].[sp_WithParams] @SomeParameter2\", parameters);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult));\n                Assert.That(actualResult2, Is.EqualTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public void Set_TypeNotIncludedInModel_ThrowsException()\n        {\n            Assert.Multiple(() =>\n            {\n                var ex = Assert.Throws<InvalidOperationException>(() => MockedDbContext.Set<NotRegisteredEntity>().ToList());\n                Assert.That(ex.Message, Is.EqualTo(string.Format(ExceptionMessages.CannotCreateDbSetTypeNotIncludedInModel, nameof(NotRegisteredEntity))));\n            });\n        }\n\n        [Test]\n        public virtual void SetCommandTimeout_ValidTimeout_DoesNotThrowException()\n        {\n            Assert.DoesNotThrow(() =>\n            {\n                MockedDbContext.Database.SetCommandTimeout(60);\n            });\n        }\n\n        [Test]\n        public virtual void GetCommandTimeout_ReturnsZero()\n        {\n            var actualResult = MockedDbContext.Database.GetCommandTimeout();\n\n            actualResult.Should().Be(0);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/BaseForDbSetTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing AutoFixture;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public abstract class BaseForDbSetTests<TDbContext, TEntity> : BaseForMockedQueryableTests<TEntity> where TDbContext : DbContext\n        where TEntity : BaseTestEntity\n    {\n        protected TDbContext MockedDbContext;\n\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            MockedDbContext = CreateMockedDbContext();\n        }\n\n        [TearDown]\n        public override void TearDown()\n        {\n            MockedDbContext.Dispose();\n            \n            base.TearDown();\n        }\n\n        protected override void SeedQueryableSource()\n        {\n            var itemsToAdd = Fixture.Build<TEntity>().With(p => p.CreatedAt, DateTime.Today).With(p => p.LastModifiedAt, DateTime.Today).CreateMany().ToList();\n            DbSet.AddRange(itemsToAdd);\n            MockedDbContext.SaveChanges();\n            ItemsAddedToQueryableSource = itemsToAdd;\n        }\n\n        protected abstract TDbContext CreateMockedDbContext();\n\n        [Test]\n        public virtual void AddAndPersist_Item_AddsAndPersistsItem()\n        {\n            var expectedResult = Fixture.Create<TEntity>();\n\n            DbSet.Add(expectedResult);\n            MockedDbContext.SaveChanges();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(DbSet.Single(), Is.EqualTo(expectedResult));\n                Assert.That(DbSet.Single(), Is.EqualTo(expectedResult));\n            });\n        }\n\n        [Test]\n        public virtual void AddAndPersist_Items_AddsAndPersistsItems()\n        {\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n\n            DbSet.AddRange(expectedResult);\n            MockedDbContext.SaveChanges();\n\n            var actualResult = DbSet.ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult, Is.EquivalentTo(expectedResult));\n                Assert.That(DbSet.ToList(), Is.EquivalentTo(actualResult));\n            });\n        }\n\n        [Test]\n        public virtual async Task AddAndPersistAsync_Item_AddsAndPersistsItem()\n        {\n            var expectedResult = Fixture.Create<TEntity>();\n\n            await DbSet.AddAsync(expectedResult);\n            await MockedDbContext.SaveChangesAsync();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(DbSet.Single(), Is.EqualTo(expectedResult));\n                Assert.That(DbSet.Single(), Is.EqualTo(expectedResult));\n            });\n        }\n\n        [Test]\n        public virtual async Task AddAndPersistAsync_Items_AddsAndPersistsItems()\n        {\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n\n            await DbSet.AddRangeAsync(expectedResult);\n            await MockedDbContext.SaveChangesAsync();\n\n            var actualResult = DbSet.ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult, Is.EquivalentTo(expectedResult));\n                Assert.That(DbSet.ToList(), Is.EquivalentTo(actualResult));\n            });\n        }\n\n        [Test]\n        public virtual void AddThenSingleThenAddRangeThenToListThenWhereThenSelect_ReturnsExpectedResults()\n        {\n            var items = Fixture.CreateMany<TEntity>().ToList();\n            DbSet.Add(items[0]);\n            MockedDbContext.SaveChanges();\n\n            var singleResult = DbSet.Single();\n\n            DbSet.AddRange(items.Skip(1));\n            MockedDbContext.SaveChanges();\n\n            var toListResult = DbSet.ToList();\n\n            var selectedItem = items.Last();\n            var whereResult = DbSet.Where(x => x.Equals(selectedItem)).ToList();\n\n            var selectResult = DbSet.Select(x => new { Item = x }).ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(singleResult, Is.EqualTo(items[0]));\n                Assert.That(toListResult, Is.EquivalentTo(items));\n                Assert.That(whereResult, Is.EquivalentTo(new List<TEntity> { selectedItem }));\n                for (var i = 0; i < items.Count; i++)\n                {\n                    Assert.That(selectResult[i].Item, Is.EqualTo(items[i]));\n                }\n            });\n        }\n\n        [Test]\n        public virtual void AnyThenAddThenPersistThenAny_ReturnsFalseThenTrue()\n        {\n            var actualResult1 = DbSet.Any();\n            DbSet.Add(Fixture.Create<TEntity>());\n            MockedDbContext.SaveChanges();\n            var actualResult2 = DbSet.Any();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.False);\n                Assert.That(actualResult2, Is.True);\n            });\n        }\n\n        [Test]\n        public virtual async Task AsAsyncEnumerable_ReturnsAsyncEnumerable()\n        {\n            var expectedResult = Fixture.Create<TEntity>();\n            DbSet.Add(expectedResult);\n            MockedDbContext.SaveChanges();\n\n            var asyncEnumerable = DbSet.AsAsyncEnumerable();\n\n            var actualResults = new List<TEntity>();\n            await foreach (var item in asyncEnumerable)\n            {\n                actualResults.Add(item);\n            }\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResults.Single(), Is.EqualTo(expectedResult));\n                Assert.That(actualResults.Single(), Is.EqualTo(expectedResult));\n            });\n        }\n\n        [Test]\n        public virtual void AsQueryable_ReturnsQueryable()\n        {\n            var expectedResult = Fixture.Create<TEntity>();\n            DbSet.Add(expectedResult);\n            MockedDbContext.SaveChanges();\n\n            var queryable = DbSet.AsQueryable();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(queryable.Single(), Is.EqualTo(expectedResult));\n                Assert.That(queryable.Single(), Is.EqualTo(expectedResult));\n            });\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/BaseForMockedQueryableTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing Microsoft.Data.SqlClient;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing AutoFixture;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public abstract class BaseForMockedQueryableTests<TEntity> : BaseForQueryableTests<TEntity> where TEntity : BaseTestEntity\n    {\n        protected DbSet<TEntity> DbSet => (DbSet<TEntity>) Queryable;\n\n        protected abstract void AddFromSqlRawResult(DbSet<TEntity> mockedDbSet, IEnumerable<TEntity> expectedResult);\n\n        protected abstract void AddFromSqlRawResult(DbSet<TEntity> mockedDbSet, string sql, IEnumerable<TEntity> expectedResult);\n\n        protected abstract void AddFromSqlRawResult(DbSet<TEntity> mockedDbSet, string sql, IEnumerable<object> parameters, IEnumerable<TEntity> expectedResult);\n\n        protected abstract void AddFromSqlInterpolatedResult(DbSet<TEntity> mockedDbSet, IEnumerable<TEntity> expectedResult);\n\n        protected abstract void AddFromSqlInterpolatedResult(DbSet<TEntity> mockedDbSet, FormattableString sql, IEnumerable<TEntity> expectedResult);\n\n        protected abstract void AddFromSqlInterpolatedResult(DbSet<TEntity> mockedDbSet, string sql, IEnumerable<object> parameters, IEnumerable<TEntity> expectedResult);\n\n        [Test]\n        public virtual void FormattableStringSetUpFromSqlInterpolated_SpecifiedSqlWithStringParameters_ReturnsExpectedResult()\n        {\n            var parameters = new List<string> { \"Value2\" };\n            var sql = (FormattableString) $\"[sp_WithParams] {parameters[0]}\";\n\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlInterpolatedResult(DbSet, sql, expectedResult);\n\n            var actualResult1 = DbSet.FromSqlInterpolated($\"[dbo].[sp_WithParams] {parameters[0]}\").ToList();\n            var actualResult2 = DbSet.FromSqlInterpolated($\"[dbo].[sp_WithParams] {parameters[0]}\").ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EquivalentTo(expectedResult));\n                Assert.That(actualResult2, Is.EquivalentTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlInterpolated_AnySql_ReturnsExpectedResult()\n        {\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlInterpolatedResult(DbSet, expectedResult);\n\n            var actualResult1 = DbSet.FromSqlInterpolated($\"sp_NoParams\").ToList();\n            var actualResult2 = DbSet.FromSqlInterpolated($\"sp_NoParams\").ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EquivalentTo(expectedResult));\n                Assert.That(actualResult2, Is.EquivalentTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlInterpolated_SpecifiedSql_ReturnsExpectedResult()\n        {\n            var sql = (FormattableString) $\"sp_NoParams\";\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlInterpolatedResult(DbSet, sql, expectedResult);\n\n            var actualResult1 = DbSet.FromSqlInterpolated($\"[dbo].[sp_NoParams]\").ToList();\n            var actualResult2 = DbSet.FromSqlInterpolated($\"sp_NoParams\").ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EquivalentTo(expectedResult));\n                Assert.That(actualResult2, Is.EquivalentTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlInterpolated_SpecifiedSqlThatDoesNotMatchSetUp_ThrowsException()\n        {\n            var sql = (FormattableString) $\"asdf\";\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlInterpolatedResult(DbSet, sql, expectedResult);\n\n            Assert.Throws<NotSupportedException>(() =>\n            {\n                var actualResult = DbSet.FromSqlInterpolated($\"sp_NoParams\").ToList();\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlInterpolated_SpecifiedSqlWithSqlParameterParameters_ReturnsExpectedResult()\n        {\n            var sql = \"sp_WithParams\";\n            var parameters = new List<SqlParameter> { new(\"@SomeParameter2\", \"Value2\") };\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlInterpolatedResult(DbSet, sql, parameters, expectedResult);\n\n            var actualResult1 = DbSet.FromSqlInterpolated($\"[dbo].[sp_WithParams] {Fixture.Create<string>()}, {parameters[0]}\").ToList();\n            var actualResult2 = DbSet.FromSqlInterpolated($\"sp_WithParams {Fixture.Create<string>()}, {parameters[0]}\").ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EquivalentTo(expectedResult));\n                Assert.That(actualResult2, Is.EquivalentTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlInterpolated_SpecifiedSqlWithSqlParameterParametersThatDoNotMatchSetUp_ThrowsException()\n        {\n            var sql = \"sp_WithParams\";\n            var setUpParameters = new List<SqlParameter> { new(\"@SomeParameter3\", \"Value3\") };\n            var invocationParameters = new List<SqlParameter> { new(\"@SomeParameter1\", \"Value1\"), new(\"@SomeParameter2\", \"Value2\") };\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlInterpolatedResult(DbSet, sql, setUpParameters, expectedResult);\n\n            Assert.Throws<NotSupportedException>(() =>\n            {\n                var actualResult1 = DbSet.FromSqlInterpolated($\"[dbo].[sp_WithParams] {invocationParameters[0]}, {invocationParameters[1]}\").ToList();\n            });\n\n            Assert.Throws<NotSupportedException>(() =>\n            {\n                var actualResult2 = DbSet.FromSqlInterpolated($\"sp_WithParams {invocationParameters[0]}, {invocationParameters[1]}\").ToList();\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlInterpolated_SpecifiedSqlWithStringParameters_ReturnsExpectedResult()\n        {\n            var sql = \"sp_WithParams\";\n            var parameters = new List<string> { \"Value2\" };\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlInterpolatedResult(DbSet, sql, parameters, expectedResult);\n\n            var actualResult1 = DbSet.FromSqlInterpolated($\"[dbo].[sp_WithParams] {Fixture.Create<string>()}, {parameters[0]}\").ToList();\n            var actualResult2 = DbSet.FromSqlInterpolated($\"sp_WithParams {Fixture.Create<string>()}, {parameters[0]}\").ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EquivalentTo(expectedResult));\n                Assert.That(actualResult2, Is.EquivalentTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlInterpolated_ThrowsException()\n        {\n            Assert.Throws<NotSupportedException>(() =>\n            {\n                var actualResult = DbSet.FromSqlInterpolated($\"sp_NoParams\").ToList();\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlRaw_AnySql_ReturnsExpectedResult()\n        {\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlRawResult(DbSet, expectedResult);\n\n            var actualResult1 = DbSet.FromSqlRaw(\"sp_NoParams\").ToList();\n            var actualResult2 = DbSet.FromSqlRaw(\"sp_NoParams\").ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EquivalentTo(expectedResult));\n                Assert.That(actualResult2, Is.EquivalentTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlRaw_QueryProviderWithManyFromSqlResults_ReturnsExpectedResults()\n        {\n            var sql1 = \"sp_NoParams\";\n            var expectedResult1 = Fixture.CreateMany<TEntity>().ToList();\n\n            var sql2 = \"sp_WithParams\";\n            var parameters2 = new List<SqlParameter> { new(\"@SomeParameter1\", \"Value1\"), new(\"@SomeParameter2\", \"Value2\") };\n            var expectedResult2 = Fixture.CreateMany<TEntity>().ToList();\n\n            AddFromSqlRawResult(DbSet, sql1, expectedResult1);\n            AddFromSqlRawResult(DbSet, sql2, parameters2, expectedResult2);\n\n            Console.WriteLine(\"actualResult1\");\n            var actualResult1 = DbSet.FromSqlRaw(\"[dbo].[sp_NoParams]\").ToList();\n\n            Console.WriteLine(\"actualResult2\");\n            var actualResult2 = DbSet.FromSqlRaw(\"[dbo].[sp_WithParams]\", parameters2.ToArray()).ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EquivalentTo(expectedResult1));\n                Assert.That(actualResult2, Is.EquivalentTo(expectedResult2));\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlRaw_SpecifiedSql_ReturnsExpectedResult()\n        {\n            var sql = \"sp_NoParams\";\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlRawResult(DbSet, sql, expectedResult);\n\n            var actualResult1 = DbSet.FromSqlRaw(\"[dbo].[sp_NoParams]\").ToList();\n            var actualResult2 = DbSet.FromSqlRaw(\"sp_NoParams\").ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EquivalentTo(expectedResult));\n                Assert.That(actualResult2, Is.EquivalentTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlRaw_SpecifiedSqlThatDoesNotMatchSetUp_ThrowsException()\n        {\n            var sql = \"asdf\";\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlRawResult(DbSet, sql, expectedResult);\n\n            Assert.Throws<NotSupportedException>(() =>\n            {\n                var actualResult = DbSet.FromSqlRaw(\"sp_NoParams\").ToList();\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlRaw_SpecifiedSqlWithSqlParameterParameters_ReturnsExpectedResult()\n        {\n            var sql = \"sp_WithParams\";\n            var parameters = new List<SqlParameter> { new(\"@SomeParameter2\", \"Value2\") };\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlRawResult(DbSet, sql, parameters, expectedResult);\n\n            var actualResult1 = DbSet.FromSqlRaw(\"[dbo].[sp_WithParams] @SomeParameter1 @SomeParameter2\", parameters.ToArray()).ToList();\n            var actualResult2 = DbSet.FromSqlRaw(\"sp_WithParams @SomeParameter1 @SomeParameter2\", parameters.ToArray()).ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EquivalentTo(expectedResult));\n                Assert.That(actualResult2, Is.EquivalentTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlRaw_SpecifiedSqlWithSqlParameterParametersThatDoNotMatchSetUp_ThrowsException()\n        {\n            var sql = \"sp_WithParams\";\n            var setUpParameters = new List<SqlParameter> { new(\"@SomeParameter3\", \"Value3\") };\n            var invocationParameters = new List<SqlParameter> { new(\"@SomeParameter1\", \"Value1\"), new(\"@SomeParameter2\", \"Value2\") };\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlRawResult(DbSet, sql, setUpParameters, expectedResult);\n\n            Assert.Throws<NotSupportedException>(() =>\n            {\n                var actualResult1 = DbSet.FromSqlRaw(\"[dbo].[sp_WithParams] @SomeParameter1 @SomeParameter2\", invocationParameters.ToArray()).ToList();\n            });\n\n            Assert.Throws<NotSupportedException>(() =>\n            {\n                var actualResult2 = DbSet.FromSqlRaw(\"sp_WithParams @SomeParameter1 @SomeParameter2\", invocationParameters.ToArray()).ToList();\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlRaw_SpecifiedSqlWithStringParameters_ReturnsExpectedResult()\n        {\n            var sql = \"sp_WithParams\";\n            var parameters = new List<string> { \"Value2\" };\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlRawResult(DbSet, sql, parameters, expectedResult);\n\n            var actualResult1 = DbSet.FromSqlRaw(\"[dbo].[sp_WithParams] @SomeParameter1 @SomeParameter2\", parameters.ToArray()).ToList();\n            var actualResult2 = DbSet.FromSqlRaw(\"sp_WithParams @SomeParameter1 @SomeParameter2\", parameters.ToArray()).ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EquivalentTo(expectedResult));\n                Assert.That(actualResult2, Is.EquivalentTo(actualResult1));\n            });\n        }\n\n        [Test]\n        public virtual void FromSqlRaw_ThrowsException()\n        {\n            Assert.Throws<NotSupportedException>(() =>\n            {\n                var actualResult = DbSet.FromSqlRaw(\"sp_NoParams\").ToList();\n            });\n        }\n\n        [Test]\n        public virtual async Task FromSqlRawThenFirstOrDefaultAsync_ReturnsFirstElement()\n        {\n            var sql = \"sp_NoParams\";\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddFromSqlRawResult(DbSet, sql, expectedResult);\n\n            var actualResult1 = await DbSet.FromSqlRaw(\"[dbo].[sp_NoParams]\").FirstOrDefaultAsync();\n            var actualResult2 = await DbSet.FromSqlRaw(\"[dbo].[sp_NoParams]\").FirstOrDefaultAsync();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(expectedResult.First()));\n                Assert.That(actualResult2, Is.EqualTo(expectedResult.First()));\n            });\n        }\n\n        [Test]\n        public void ContainsListCollection_ReturnsFalse()\n        {\n            var containsListCollection = ((IListSource) Queryable).ContainsListCollection;\n            Assert.That(containsListCollection, Is.False);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/BaseForQueryableTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing AutoFixture;\nusing AutoMapper;\nusing KellermanSoftware.CompareNetObjects;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public abstract class BaseForQueryableTests<T> : BaseForTests where T : BaseTestEntity\n    {\n        protected List<T> ItemsAddedToQueryableSource;\n\n        protected abstract IQueryable<T> Queryable { get; }\n\n        protected abstract void SeedQueryableSource();\n\n        [Test]\n        public virtual void All_FalseCondition_ReturnsFalse()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.All(x => string.IsNullOrWhiteSpace(x.FullName));\n            var actualResult2 = Queryable.All(x => string.IsNullOrWhiteSpace(x.FullName));\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.False);\n                Assert.That(actualResult2, Is.False);\n            });\n        }\n\n        [Test]\n        public virtual void All_TrueCondition_ReturnsTrue()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.All(x => !string.IsNullOrWhiteSpace(x.FullName));\n            var actualResult2 = Queryable.All(x => !string.IsNullOrWhiteSpace(x.FullName));\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.True);\n                Assert.That(actualResult2, Is.True);\n            });\n        }\n\n        [Test]\n        public virtual async Task AllAsync_FalseCondition_ReturnsFalse()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = await Queryable.AllAsync(x => string.IsNullOrWhiteSpace(x.FullName));\n            var actualResult2 = await Queryable.AllAsync(x => string.IsNullOrWhiteSpace(x.FullName));\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.False);\n                Assert.That(actualResult2, Is.False);\n            });\n        }\n\n        [Test]\n        public virtual async Task AllAsync_TrueCondition_ReturnsTrue()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = await Queryable.AllAsync(x => !string.IsNullOrWhiteSpace(x.FullName));\n            var actualResult2 = await Queryable.AllAsync(x => !string.IsNullOrWhiteSpace(x.FullName));\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.True);\n                Assert.That(actualResult2, Is.True);\n            });\n        }\n\n        [Test]\n        public virtual void Any_ReturnsTrue()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.Any();\n            var actualResult2 = Queryable.Any();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.True);\n                Assert.That(actualResult2, Is.True);\n            });\n        }\n\n        [Test]\n        public virtual void Any_WithNoItemsAdded_ReturnsFalse()\n        {\n            var actualResult1 = Queryable.Any();\n            var actualResult2 = Queryable.Any();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.False);\n                Assert.That(actualResult2, Is.False);\n            });\n        }\n\n        [Test]\n        public virtual async Task AnyAsync_ReturnsTrue()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = await Queryable.AnyAsync();\n            var actualResult2 = await Queryable.AnyAsync();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.True);\n                Assert.That(actualResult2, Is.True);\n            });\n        }\n\n        [Test]\n        public virtual async Task AnyAsyncWithCancellationToken_ReturnsTrue()\n        {\n            SeedQueryableSource();\n\n            using (var cancellationTokenSource = new CancellationTokenSource(new TimeSpan(0, 1, 0)))\n            {\n                var actualResult1 = await Queryable.AnyAsync(cancellationTokenSource.Token);\n                var actualResult2 = await Queryable.AnyAsync(cancellationTokenSource.Token);\n\n                Assert.Multiple(() =>\n                {\n                    Assert.That(actualResult1, Is.True);\n                    Assert.That(actualResult2, Is.True);\n                });\n            }\n        }\n\n        [Test]\n        public virtual void Average_Decimal_ReturnsAverage()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.Average(x => x.Weight);\n            var actualResult2 = Queryable.Average(x => x.Weight);\n\n            Assert.Multiple(() =>\n            {\n                var average = 0m;\n                for (var i = 0; i < ItemsAddedToQueryableSource.Count; i++)\n                {\n                    average += ItemsAddedToQueryableSource[i].Weight;\n                }\n\n                average = average / ItemsAddedToQueryableSource.Count;\n\n                Assert.That(actualResult1, Is.EqualTo(average));\n                Assert.That(actualResult2, Is.EqualTo(average));\n            });\n        }\n\n        [Test]\n        public virtual async Task AverageAsync_Decimal_ReturnsAverage()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = await Queryable.AverageAsync(x => x.Weight);\n            var actualResult2 = await Queryable.AverageAsync(x => x.Weight);\n\n            Assert.Multiple(() =>\n            {\n                var average = 0m;\n                for (var i = 0; i < ItemsAddedToQueryableSource.Count; i++)\n                {\n                    average += ItemsAddedToQueryableSource[i].Weight;\n                }\n\n                average = average / ItemsAddedToQueryableSource.Count;\n\n                Assert.That(actualResult1, Is.EqualTo(average));\n                Assert.That(actualResult2, Is.EqualTo(average));\n            });\n        }\n\n        [Test]\n        public virtual void Contains_FalseCondition_ReturnsFalse()\n        {\n            SeedQueryableSource();\n\n            var itemToFind = Fixture.Create<T>();\n\n            var actualResult1 = Queryable.Contains(itemToFind);\n            var actualResult2 = Queryable.Contains(itemToFind);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.False);\n                Assert.That(actualResult2, Is.False);\n            });\n        }\n\n        [Test]\n        public virtual void Contains_TrueCondition_ReturnsTrue()\n        {\n            SeedQueryableSource();\n\n            var itemToFind = Queryable.First();\n\n            var actualResult1 = Queryable.Contains(itemToFind);\n            var actualResult2 = Queryable.Contains(itemToFind);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.True);\n                Assert.That(actualResult2, Is.True);\n            });\n        }\n\n        [Test]\n        public virtual async Task ContainsAsync_FalseCondition_ReturnsFalse()\n        {\n            SeedQueryableSource();\n\n            var itemToFind = Fixture.Create<T>();\n\n            var actualResult1 = await Queryable.ContainsAsync(itemToFind);\n            var actualResult2 = await Queryable.ContainsAsync(itemToFind);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.False);\n                Assert.That(actualResult2, Is.False);\n            });\n        }\n\n        [Test]\n        public virtual async Task ContainsAsync_TrueCondition_ReturnsTrue()\n        {\n            SeedQueryableSource();\n\n            var itemToFind = Queryable.First();\n\n            var actualResult1 = await Queryable.ContainsAsync(itemToFind);\n            var actualResult2 = await Queryable.ContainsAsync(itemToFind);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.True);\n                Assert.That(actualResult2, Is.True);\n            });\n        }\n\n        [Test]\n        public virtual void ElementAt_ThrowsException()\n        {\n            SeedQueryableSource();\n\n            Assert.Multiple(() =>\n            {\n                var ex1 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var firstElement = Queryable.ElementAt(0);\n                });\n\n                //Assert.That(ex1.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, $\"DbSet<{typeof(T).Name}>()\\r\\n    .ElementAt(0)\")));\n\n                var ex2 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var lastElement = Queryable.ElementAt(Queryable.ToList().Count - 1);\n                });\n\n                //Assert.That(ex2.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, $\"DbSet<{typeof(T).Name}>()\\r\\n    .ElementAt({Queryable.ToList().Count - 1})\")));\n            });\n        }\n\n        [Test]\n        public virtual void ElementAt_AfterAsEnumerable_DoesNotThrowException()\n        {\n            SeedQueryableSource();\n\n            Console.WriteLine(\"Assert start\");\n\n            Assert.Multiple(() =>\n            {\n                Assert.DoesNotThrow(() =>\n                {\n                    var firstElement = Queryable.AsEnumerable().ElementAt(0);\n                });\n\n                Assert.DoesNotThrow(() =>\n                {\n                    var lastElement = Queryable.AsEnumerable().ElementAt(Queryable.ToList().Count - 1);\n                });\n            });\n        }\n\n        [Test]\n        public virtual void ElementAt_AfterToList_DoesNotThrowException()\n        {\n            SeedQueryableSource();\n\n            Assert.Multiple(() =>\n            {\n                Assert.DoesNotThrow(() =>\n                {\n                    var firstElement = Queryable.ToList().ElementAt(0);\n                });\n\n                Assert.DoesNotThrow(() =>\n                {\n                    var lastElement = Queryable.ToList().ElementAt(Queryable.ToList().Count - 1);\n                });\n            });\n        }\n\n        [Test]\n        public virtual void ElementAtOrDefault_ThrowsException()\n        {\n            SeedQueryableSource();\n\n            Assert.Multiple(() =>\n            {\n                var ex1 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var firstElement = Queryable.ElementAtOrDefault(0);\n                });\n\n                //Assert.That(ex1.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, $\"DbSet<{typeof(T).Name}>()\\r\\n    .ElementAtOrDefault(0)\")));\n\n                var ex2 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var lastElement = Queryable.ElementAtOrDefault(Queryable.ToList().Count - 1);\n                });\n\n                //Assert.That(ex2.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, $\"DbSet<{typeof(T).Name}>()\\r\\n    .ElementAtOrDefault({Queryable.ToList().Count - 1})\")));\n            });\n        }\n\n        [Test]\n        public virtual void ElementAtOrDefault_WithNoItemsAdded_ThrowsException()\n        {\n            Assert.Multiple(() =>\n            {\n                var ex1 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var firstElement = Queryable.ElementAtOrDefault(0);\n                });\n\n                //Assert.That(ex1.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, $\"DbSet<{typeof(T).Name}>()\\r\\n    .ElementAtOrDefault(0)\")));\n\n                var ex2 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var lastElement = Queryable.ElementAtOrDefault(Queryable.ToList().Count - 1);\n                });\n\n                //Assert.That(ex2.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, $\"DbSet<{typeof(T).Name}>()\\r\\n    .ElementAtOrDefault({Queryable.ToList().Count - 1})\")));\n            });\n        }\n\n        [Test]\n        public virtual void First_ReturnsFirstElement()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.First();\n            var actualResult2 = Queryable.First();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(ItemsAddedToQueryableSource.First()));\n                Assert.That(actualResult2, Is.EqualTo(ItemsAddedToQueryableSource.First()));\n            });\n        }\n\n        [Test]\n        public virtual void First_WithNoItemsAdded_ThrowsException()\n        {\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                var actualResult1 = Queryable.First();\n            });\n        }\n\n        [Test]\n        public virtual async Task FirstAsync_ReturnsFirstElement()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = await Queryable.FirstAsync();\n            var actualResult2 = await Queryable.FirstAsync();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(ItemsAddedToQueryableSource.First()));\n                Assert.That(actualResult2, Is.EqualTo(ItemsAddedToQueryableSource.First()));\n            });\n        }\n\n        [Test]\n        public virtual void FirstOrDefault_ReturnsFirstElement()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.FirstOrDefault();\n            var actualResult2 = Queryable.FirstOrDefault();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(ItemsAddedToQueryableSource.First()));\n                Assert.That(actualResult2, Is.EqualTo(ItemsAddedToQueryableSource.First()));\n            });\n        }\n\n        [Test]\n        public virtual void FirstOrDefault_WithNoItemsAdded_ReturnsFirstElement()\n        {\n            var actualResult1 = Queryable.FirstOrDefault();\n            var actualResult2 = Queryable.FirstOrDefault();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(default(T)));\n                Assert.That(actualResult2, Is.EqualTo(default(T)));\n            });\n        }\n\n        [Test]\n        public virtual async Task FirstOrDefaultAsync_ReturnsFirstElement()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = await Queryable.FirstOrDefaultAsync();\n            var actualResult2 = await Queryable.FirstOrDefaultAsync();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(ItemsAddedToQueryableSource.First()));\n                Assert.That(actualResult2, Is.EqualTo(ItemsAddedToQueryableSource.First()));\n            });\n        }\n\n        [Test]\n        public virtual void Last_ReturnsLastElement()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.Last();\n            var actualResult2 = Queryable.Last();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(ItemsAddedToQueryableSource.Last()));\n                Assert.That(actualResult2, Is.EqualTo(ItemsAddedToQueryableSource.Last()));\n            });\n        }\n\n        [Test]\n        public virtual void Last_WithNoItemsAdded_ThrowsException()\n        {\n            Assert.Throws<InvalidOperationException>(() =>\n            {\n                var actualResult1 = Queryable.Last();\n            });\n        }\n\n        [Test]\n        public virtual async Task LastAsync_ReturnsLastElement()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = await Queryable.LastAsync();\n            var actualResult2 = await Queryable.LastAsync();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(ItemsAddedToQueryableSource.Last()));\n                Assert.That(actualResult2, Is.EqualTo(ItemsAddedToQueryableSource.Last()));\n            });\n        }\n\n        [Test]\n        public virtual void LastOrDefault_ReturnsLastElement()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.LastOrDefault();\n            var actualResult2 = Queryable.LastOrDefault();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(ItemsAddedToQueryableSource.Last()));\n                Assert.That(actualResult2, Is.EqualTo(ItemsAddedToQueryableSource.Last()));\n            });\n        }\n\n        [Test]\n        public virtual void LastOrDefault_WithNoItemsAdded_ReturnsLastElement()\n        {\n            var actualResult1 = Queryable.LastOrDefault();\n            var actualResult2 = Queryable.LastOrDefault();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(default(T)));\n                Assert.That(actualResult2, Is.EqualTo(default(T)));\n            });\n        }\n\n        [Test]\n        public virtual async Task LastOrDefaultAsync_ReturnsLastElement()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = await Queryable.LastOrDefaultAsync();\n            var actualResult2 = await Queryable.LastOrDefaultAsync();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EqualTo(ItemsAddedToQueryableSource.Last()));\n                Assert.That(actualResult2, Is.EqualTo(ItemsAddedToQueryableSource.Last()));\n            });\n        }\n\n        [Test]\n        public virtual void Max_DateTime_ReturnsMaxDateTime()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.Max(x => x.DateOfBirth);\n            var actualResult2 = Queryable.Max(x => x.DateOfBirth);\n\n            Assert.Multiple(() =>\n            {\n                var maxDateTime = ItemsAddedToQueryableSource[0].DateOfBirth;\n                for (var i = 1; i < ItemsAddedToQueryableSource.Count; i++)\n                {\n                    if (ItemsAddedToQueryableSource[i].DateOfBirth > maxDateTime)\n                    {\n                        maxDateTime = ItemsAddedToQueryableSource[i].DateOfBirth;\n                    }\n                }\n\n                Assert.That(actualResult1, Is.EqualTo(maxDateTime));\n                Assert.That(actualResult2, Is.EqualTo(maxDateTime));\n            });\n        }\n\n        [Test]\n        public virtual async Task MaxAsync_DateTime_ReturnsMaxDateTime()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = await Queryable.MaxAsync(x => x.DateOfBirth);\n            var actualResult2 = await Queryable.MaxAsync(x => x.DateOfBirth);\n\n            Assert.Multiple(() =>\n            {\n                var maxDateTime = ItemsAddedToQueryableSource[0].DateOfBirth;\n                for (var i = 1; i < ItemsAddedToQueryableSource.Count; i++)\n                {\n                    if (ItemsAddedToQueryableSource[i].DateOfBirth > maxDateTime)\n                    {\n                        maxDateTime = ItemsAddedToQueryableSource[i].DateOfBirth;\n                    }\n                }\n\n                Assert.That(actualResult1, Is.EqualTo(maxDateTime));\n                Assert.That(actualResult2, Is.EqualTo(maxDateTime));\n            });\n        }\n\n        [Test]\n        public virtual void Min_DateTime_ReturnsMinDateTime()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.Min(x => x.DateOfBirth);\n            var actualResult2 = Queryable.Min(x => x.DateOfBirth);\n\n            Assert.Multiple(() =>\n            {\n                var minDateTime = ItemsAddedToQueryableSource[0].DateOfBirth;\n                for (var i = 1; i < ItemsAddedToQueryableSource.Count; i++)\n                {\n                    if (ItemsAddedToQueryableSource[i].DateOfBirth < minDateTime)\n                    {\n                        minDateTime = ItemsAddedToQueryableSource[i].DateOfBirth;\n                    }\n                }\n\n                Assert.That(actualResult1, Is.EqualTo(minDateTime));\n                Assert.That(actualResult2, Is.EqualTo(minDateTime));\n            });\n        }\n\n        [Test]\n        public virtual async Task MinAsync_DateTime_ReturnsMinDateTime()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = await Queryable.MinAsync(x => x.DateOfBirth);\n            var actualResult2 = await Queryable.MinAsync(x => x.DateOfBirth);\n\n            Assert.Multiple(() =>\n            {\n                var minDateTime = ItemsAddedToQueryableSource[0].DateOfBirth;\n                for (var i = 1; i < ItemsAddedToQueryableSource.Count; i++)\n                {\n                    if (ItemsAddedToQueryableSource[i].DateOfBirth < minDateTime)\n                    {\n                        minDateTime = ItemsAddedToQueryableSource[i].DateOfBirth;\n                    }\n                }\n\n                Assert.That(actualResult1, Is.EqualTo(minDateTime));\n                Assert.That(actualResult2, Is.EqualTo(minDateTime));\n            });\n        }\n\n        [Test]\n        public virtual void OrderBy_DateTime_ReturnsItemsInAscendingOrder()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.OrderBy(x => x.DateOfBirth).ToList();\n            var actualResult2 = Queryable.OrderBy(x => x.DateOfBirth).ToList();\n\n            Assert.Multiple(() =>\n            {\n                for (var i = 1; i < actualResult1.Count; i++)\n                {\n                    Assert.That(actualResult1[i].DateOfBirth, Is.GreaterThanOrEqualTo(actualResult1[i - 1].DateOfBirth));\n                }\n\n                for (var i = 1; i < actualResult2.Count; i++)\n                {\n                    Assert.That(actualResult2[i].DateOfBirth, Is.GreaterThanOrEqualTo(actualResult2[i - 1].DateOfBirth));\n                }\n            });\n        }\n\n        [Test]\n        public virtual void OrderByDescending_DateTime_ReturnsItemsInDescendingOrder()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.OrderByDescending(x => x.DateOfBirth).ToList();\n            var actualResult2 = Queryable.OrderByDescending(x => x.DateOfBirth).ToList();\n\n            Assert.Multiple(() =>\n            {\n                for (var i = 1; i < actualResult1.Count; i++)\n                {\n                    Assert.That(actualResult1[i].DateOfBirth, Is.LessThanOrEqualTo(actualResult1[i - 1].DateOfBirth));\n                }\n\n                for (var i = 1; i < actualResult2.Count; i++)\n                {\n                    Assert.That(actualResult2[i].DateOfBirth, Is.LessThanOrEqualTo(actualResult2[i - 1].DateOfBirth));\n                }\n            });\n        }\n\n        [Test]\n        public virtual void OrderByThenOrderBy_FixedDateTimeAndDecimal_ReturnsItemsInAscendingOrder()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.OrderBy(x => x.CreatedAt).ThenBy(x => x.Weight).ToList();\n            var actualResult2 = Queryable.OrderBy(x => x.CreatedAt).ThenBy(x => x.Weight).ToList();\n\n            Assert.Multiple(() =>\n            {\n                for (var i = 1; i < actualResult1.Count; i++)\n                {\n                    Assert.That(actualResult1[i].Weight, Is.GreaterThanOrEqualTo(actualResult1[i - 1].Weight));\n                }\n\n                for (var i = 1; i < actualResult2.Count; i++)\n                {\n                    Assert.That(actualResult2[i].Weight, Is.GreaterThanOrEqualTo(actualResult2[i - 1].Weight));\n                }\n            });\n        }\n\n        [Test]\n        public virtual void Select_ReturnsSequence()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.Select(x => x).ToList();\n            var actualResult2 = Queryable.Select(x => x).ToList();\n\n            Assert.Multiple(() =>\n            {\n                for (var i = 0; i < ItemsAddedToQueryableSource.Count; i++)\n                {\n                    Assert.That(actualResult1[i], Is.EqualTo(ItemsAddedToQueryableSource[i]));\n                    Assert.That(actualResult2[i], Is.EqualTo(ItemsAddedToQueryableSource[i]));\n                }\n            });\n        }\n\n        [Test]\n        public virtual async Task SelectAnonymousObjectThenToListAsync_ReturnsList()\n        {\n            SeedQueryableSource();\n\n            var expectedResult = Queryable.Select(x => new { x.Id }).ToList();\n\n            var actualResult1 = await Queryable.Select(x => new { x.Id }).ToListAsync();\n            var actualResult2 = await Queryable.Select(x => new { x.Id }).ToListAsync();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EquivalentTo(expectedResult));\n                Assert.That(actualResult2, Is.EquivalentTo(expectedResult));\n            });\n        }\n\n        [Test]\n        public virtual void SelectWithIndex_ThrowsException()\n        {\n            SeedQueryableSource();\n\n            Assert.Multiple(() =>\n            {\n                var ex1 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var actualResult1 = Queryable.Select((x, i) => new { Index = i, Item = x }).ToList();\n                });\n\n                //Assert.That(ex1.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, typeof(T).Name)));\n\n                var ex2 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var actualResult2 = Queryable.Select((x, i) => new { Index = i, Item = x }).ToList();\n                });\n\n                //Assert.That(ex2.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, typeof(T).Name)));\n            });\n        }\n\n        [Test]\n        public virtual void SelectWithIndexThenWhereThenAny_TrueCondition_ThrowsException()\n        {\n            SeedQueryableSource();\n\n            Assert.Multiple(() =>\n            {\n                var ex = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var actualResult1 = Queryable.Select((x, i) => new { Index = i, Item = x }).Where(x => !x.Index.Equals(0)).Any();\n                });\n\n                //Assert.That(ex.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, typeof(T).Name)));\n            });\n        }\n\n        [Test]\n        public virtual void Skip_One_ReturnsSequenceThatDoesNotIncludeFirstItem()\n        {\n            SeedQueryableSource();\n\n            var firstItem = Queryable.First();\n\n            var actualResult1 = Queryable.Skip(1);\n            var actualResult2 = Queryable.Skip(1);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1.Contains(firstItem), Is.False);\n                Assert.That(actualResult1.Count(), Is.EqualTo(Queryable.Count() - 1));\n\n                Assert.That(actualResult2.Contains(firstItem), Is.False);\n                Assert.That(actualResult2.Count(), Is.EqualTo(Queryable.Count() - 1));\n            });\n        }\n\n        [Test]\n        public virtual void SkipWhile_SkipFirstItem_ThrowsException()\n        {\n            SeedQueryableSource();\n\n            var firstItem = Queryable.First();\n\n            Assert.Multiple(() =>\n            {\n                var ex1 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var actualResult1 = Queryable.SkipWhile(x => x.Equals(firstItem)).ToList();\n                });\n\n                //Assert.That(ex1.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, typeof(T).Name)));\n\n                var ex2 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var actualResult2 = Queryable.SkipWhile(x => x.Equals(firstItem)).ToList();\n                });\n\n                //Assert.That(ex2.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, typeof(T).Name)));\n            });\n        }\n\n        [Test]\n        public virtual void Take_One_ReturnsFirstItem()\n        {\n            SeedQueryableSource();\n\n            var firstItem = Queryable.First();\n\n            var actualResult1 = Queryable.Take(1);\n            var actualResult2 = Queryable.Take(1);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1.Count(), Is.EqualTo(1));\n                Assert.That(actualResult1.First(), Is.EqualTo(firstItem));\n\n                Assert.That(actualResult2.Count(), Is.EqualTo(1));\n                Assert.That(actualResult2.First(), Is.EqualTo(firstItem));\n            });\n        }\n\n        [Test]\n        public virtual void TakeWhile_TakeFirstItem_ThrowsException()\n        {\n            SeedQueryableSource();\n\n            var firstItem = Queryable.First();\n\n            Assert.Multiple(() =>\n            {\n                var ex1 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var actualResult1 = Queryable.TakeWhile(x => x.Equals(firstItem)).ToList();\n                });\n\n                //Assert.That(ex1.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, typeof(T).Name)));\n\n                var ex2 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var actualResult2 = Queryable.TakeWhile(x => x.Equals(firstItem)).ToList();\n                });\n\n                //Assert.That(ex2.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, typeof(T).Name)));\n            });\n        }\n\n        [Test]\n        public virtual void TakeWhile_TakeFirstItemUsingIndex_ThrowsException()\n        {\n            SeedQueryableSource();\n\n            Assert.Multiple(() =>\n            {\n                var ex1 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var actualResult1 = Queryable.TakeWhile((x, i) => i.Equals(0)).ToList();\n                });\n\n                //Assert.That(ex1.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, typeof(T).Name)));\n\n                var ex2 = Assert.Throws<InvalidOperationException>(() =>\n                {\n                    var actualResult2 = Queryable.TakeWhile((x, i) => i.Equals(0)).ToList();\n                });\n\n                //Assert.That(ex2.Message, Is.EqualTo(string.Format(ExceptionMessages.TranslationFailedExceptionMessage, typeof(T).Name)));\n            });\n        }\n\n        [Test]\n        public virtual async Task ToListAsync_ReturnsList()\n        {\n            SeedQueryableSource();\n\n            var expectedResult = Queryable.ToList();\n\n            var actualResult1 = await Queryable.ToListAsync();\n            var actualResult2 = await Queryable.ToListAsync();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EquivalentTo(expectedResult));\n                Assert.That(actualResult2, Is.EquivalentTo(expectedResult));\n            });\n        }\n\n        [Test]\n        public virtual void Where_Condition_ReturnsItemsThatSatisfyCondition()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.Where(x => !x.Id.Equals(default)).ToList();\n            var actualResult2 = Queryable.Where(x => !x.Id.Equals(default)).ToList();\n\n            Assert.Multiple(() =>\n            {\n                for (var i = 0; i < ItemsAddedToQueryableSource.Count; i++)\n                {\n                    var item = ItemsAddedToQueryableSource[i];\n                    Assert.That(item.Id, Is.Not.EqualTo(default(Guid)));\n\n                    Assert.That(actualResult1[i], Is.EqualTo(item));\n                    Assert.That(actualResult1[i].Id, Is.Not.EqualTo(default(Guid)));\n\n                    Assert.That(actualResult2[i], Is.EqualTo(item));\n                    Assert.That(actualResult2[i].Id, Is.Not.EqualTo(default(Guid)));\n                }\n            });\n        }\n\n        [Test]\n        public async Task ProjectToThenToListAsync_ReturnsExpectedResult()\n        {\n            SeedQueryableSource();\n\n            var expectedResult = new AsyncEnumerable<TestViewModel>(Queryable.Select(x => new TestViewModel { id = x.Id, fullName = x.FullName }));\n\n            var mapper = new Mapper(new MapperConfiguration(x => x.AddProfile(new MappingProfile())));\n\n            Console.WriteLine(\"ProjectTo about to be invoked\");\n\n            var actualResult = await mapper.ProjectTo<TestViewModel>(Queryable, null).ToListAsync();\n\n            var compareLogic = new CompareLogic { Config = { IgnoreObjectTypes = true, IgnoreCollectionOrder = true } };\n            var comparisonResult = compareLogic.Compare(expectedResult, actualResult);\n\n            Assert.That(comparisonResult.AreEqual, Is.True);\n        }\n\n        [Test]\n        public virtual void ToListThenElementAt_Zero_ReturnsFirstElement()\n        {\n            SeedQueryableSource();\n\n            var firstElement = Queryable.ToList().ElementAt(0);\n\n            Assert.That(firstElement, Is.EqualTo(ItemsAddedToQueryableSource.First()));\n        }\n\n        [Test]\n        public virtual void WhereWithSelect_Condition_ReturnsIdsThatSatisfyCondition()\n        {\n            SeedQueryableSource();\n\n            var actualResult1 = Queryable.Where(x => !x.Id.Equals(default)).Select(x => x.Id).ToList();\n            var actualResult2 = Queryable.Where(x => !x.Id.Equals(default)).Select(x => x.Id).ToList();\n\n            Assert.Multiple(() =>\n            {\n                for (var i = 0; i < ItemsAddedToQueryableSource.Count; i++)\n                {\n                    var item = ItemsAddedToQueryableSource[i];\n                    Assert.That(item.Id, Is.Not.EqualTo(default(Guid)));\n\n                    Assert.That(actualResult1[i], Is.EqualTo(item.Id));\n                    Assert.That(actualResult1[i], Is.Not.EqualTo(default(Guid)));\n\n                    Assert.That(actualResult2[i], Is.EqualTo(item.Id));\n                    Assert.That(actualResult2[i], Is.Not.EqualTo(default(Guid)));\n                }\n            });\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/BaseForReadOnlyDbSetTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing Microsoft.Data.SqlClient;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing AutoFixture;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public abstract class BaseForReadOnlyDbSetTests<TEntity> : BaseForMockedQueryableTests<TEntity> where TEntity : BaseTestEntity\n    {\n        protected override void SeedQueryableSource()\n        {\n            var itemsToAdd = Fixture.Build<TEntity>().With(p => p.CreatedAt, DateTime.Today).With(p => p.LastModifiedAt, DateTime.Today).CreateMany().ToList();\n            AddRangeToReadOnlySource(DbSet, itemsToAdd);\n            //MockedDbContext.SaveChanges();\n            ItemsAddedToQueryableSource = itemsToAdd;\n        }\n\n        protected abstract void AddToReadOnlySource(DbSet<TEntity> mockedDbQuery, TEntity item);\n\n        protected abstract void AddRangeToReadOnlySource(DbSet<TEntity> mockedDbQuery, IEnumerable<TEntity> items);\n\n        protected abstract void ClearReadOnlySource(DbSet<TEntity> mockedDbQuery);\n\n        [Test]\n        public virtual void AddRangeToReadOnlySource_Items_AddsItemsToReadOnlySource()\n        {\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n\n            AddRangeToReadOnlySource(DbSet, expectedResult);\n\n            Assert.That(DbSet, Is.EquivalentTo(expectedResult));\n        }\n\n        [Test]\n        public virtual void AddRangeToReadOnlySourceThenAddRangeToReadOnlySource_Items_AddsAllItemsToReadOnlySource()\n        {\n            var expectedResult = Fixture.CreateMany<TEntity>(4).ToList();\n\n            AddRangeToReadOnlySource(DbSet, expectedResult.Take(2));\n            AddRangeToReadOnlySource(DbSet, expectedResult.Skip(2));\n\n            Assert.That(DbSet, Is.EquivalentTo(expectedResult));\n        }\n\n        [Test]\n        public virtual void AddToReadOnlySource_Item_AddsItemToReadOnlySource()\n        {\n            var expectedResult = Fixture.Create<TEntity>();\n\n            AddToReadOnlySource(DbSet, expectedResult);\n            var numberOfItemsAdded = DbSet.ToList().Count;\n\n            Assert.That(numberOfItemsAdded, Is.EqualTo(1));\n        }\n\n        [Test]\n        public virtual void AddToReadOnlySourceThenAddToReadOnlySource_Items_AddsBothItemsToReadOnlySource()\n        {\n            var expectedResult = Fixture.CreateMany<TEntity>(2).ToList();\n\n            AddToReadOnlySource(DbSet, expectedResult.First());\n            AddToReadOnlySource(DbSet, expectedResult.Last());\n\n            Assert.That(DbSet, Is.EquivalentTo(expectedResult));\n        }\n\n        [Test]\n        public virtual void AnyThenAddToReadOnlySourceThenAny_ReturnsFalseThenTrue()\n        {\n            var actualResult1 = DbSet.Any();\n            AddToReadOnlySource(DbSet, Fixture.Create<TEntity>());\n            var actualResult2 = DbSet.Any();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.False);\n                Assert.That(actualResult2, Is.True);\n            });\n        }\n\n        [Test]\n        public virtual async Task AsAsyncEnumerable_ReturnsAsyncEnumerable()\n        {\n            var expectedResult = Fixture.Create<TEntity>();\n            AddToReadOnlySource(DbSet, expectedResult);\n\n            var asyncEnumerable = DbSet.AsAsyncEnumerable();\n\n            var actualResults = new List<TEntity>();\n            await foreach (var item in asyncEnumerable)\n            {\n                actualResults.Add(item);\n            }\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResults.Single(), Is.EqualTo(expectedResult));\n                Assert.That(actualResults.Single(), Is.EqualTo(expectedResult));\n            });\n        }\n\n        [Test]\n        public virtual void AsQueryable_ReturnsQueryable()\n        {\n            var expectedResult = Fixture.Create<TEntity>();\n            AddToReadOnlySource(DbSet, expectedResult);\n\n            var queryable = DbSet.AsQueryable();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(queryable.Single(), Is.EqualTo(expectedResult));\n                Assert.That(queryable.Single(), Is.EqualTo(expectedResult));\n            });\n        }\n\n        [Test]\n        public virtual void ClearReadOnlySource_WithNoItemsAddedToReadOnlySource_DoesNothing()\n        {\n            var preActNumberOfItems = DbSet.ToList().Count;\n\n            ClearReadOnlySource(DbSet);\n\n            var postActNumberOfItems = DbSet.ToList().Count;\n            Assert.Multiple(() =>\n            {\n                Assert.That(preActNumberOfItems, Is.EqualTo(0));\n                Assert.That(postActNumberOfItems, Is.EqualTo(preActNumberOfItems));\n            });\n        }\n\n        [Test]\n        public virtual void ClearReadOnlySourceWithExistingItems_RemovesAllItemsFromReadOnlySource()\n        {\n            var expectedResult = Fixture.CreateMany<TEntity>().ToList();\n            AddRangeToReadOnlySource(DbSet, expectedResult);\n            var numberOfItemsAdded = DbSet.ToList().Count;\n\n            ClearReadOnlySource(DbSet);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(numberOfItemsAdded, Is.EqualTo(expectedResult.Count));\n                Assert.That(DbSet.Any(), Is.False);\n            });\n        }\n\n        [Test]\n        public override void FromSqlRaw_QueryProviderWithManyFromSqlResults_ReturnsExpectedResults()\n        {\n            var sql1 = \"sp_NoParams\";\n            var expectedResult1 = Fixture.CreateMany<TEntity>().ToList();\n\n            var sql2 = \"sp_WithParams\";\n            var parameters2 = new List<SqlParameter> { new(\"@SomeParameter1\", \"Value1\"), new(\"@SomeParameter2\", \"Value2\") };\n            var expectedResult2 = Fixture.CreateMany<TEntity>().ToList();\n\n            AddFromSqlRawResult(DbSet, sql1, expectedResult1);\n\n            //Change the source, this will force the query provider mock to aggregate\n            AddRangeToReadOnlySource(DbSet, Fixture.CreateMany<TEntity>().ToList());\n\n            AddFromSqlRawResult(DbSet, sql2, parameters2, expectedResult2);\n\n            Console.WriteLine(\"actualResult1\");\n            var actualResult1 = DbSet.FromSqlRaw(\"[dbo].[sp_NoParams]\").ToList();\n\n            Console.WriteLine(\"actualResult2\");\n            var actualResult2 = DbSet.FromSqlRaw(\"[dbo].[sp_WithParams]\", parameters2.ToArray()).ToList();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(actualResult1, Is.EquivalentTo(expectedResult1));\n                Assert.That(actualResult2, Is.EquivalentTo(expectedResult2));\n            });\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/BaseForTests.cs",
    "content": "﻿using AutoFixture;\nusing Microsoft.Extensions.Logging;\nusing NUnit.Framework;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public abstract class BaseForTests\n    {\n        protected Fixture Fixture;\n\n        [SetUp]\n        public virtual void SetUp()\n        {\n            LoggingHelper.LoggerFactory = LoggerFactory.Create(builder => builder.AddConsole().SetMinimumLevel(LogLevel.Trace));\n\n            Fixture = new Fixture();\n        }\n\n        [TearDown]\n        public virtual void TearDown()\n        {\n            LoggingHelper.LoggerFactory.Dispose();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/BaseTestEntity.cs",
    "content": "﻿using System;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public abstract class BaseTestEntity\n    {\n        public Guid Id { get; set; }\n\n        public string FullName { get; set; }\n\n        public decimal Weight { get; set; }\n\n        public decimal Height { get; set; }\n\n        public DateTime DateOfBirth { get; set; }\n\n        public DateTime CreatedAt { get; set; }\n\n        public DateTime LastModifiedAt { get; set; }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/EntityFrameworkCore.Testing.Common.Tests.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Debug' \">\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Release' \">\n    <DebugSymbols>true</DebugSymbols>\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"AutoFixture\" Version=\"4.18.1\" />\n    <PackageReference Include=\"AutoMapper\" Version=\"14.0.0\" />\n    <PackageReference Include=\"CompareNETObjects\" Version=\"4.84.0\" />\n    <PackageReference Include=\"coverlet.msbuild\" Version=\"6.0.4\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"FluentAssertions\" Version=\"7.2.0\" />\n    <PackageReference Include=\"Microsoft.Data.SqlClient\" Version=\"6.1.3\" />\n    <PackageReference Include=\"Microsoft.Extensions.Logging.Console\" Version=\"10.0.0\" />\n    <PackageReference Include=\"NUnit\" Version=\"4.4.0\" />\n    <PackageReference Include=\"NUnit.Analyzers\" Version=\"4.11.2\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"NUnit3TestAdapter\" Version=\"5.2.0\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"18.0.1\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\EntityFrameworkCore.Testing.Common\\EntityFrameworkCore.Testing.Common.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/Issue114Tests.cs",
    "content": "﻿using System.Linq;\nusing FluentAssertions;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public abstract class Issue114Tests : BaseForTests\n    {\n        protected abstract TestDbContext MockedDbContextFactory();\n\n        [Test]\n        public void Any_ForReadOnlyEntityWithNoDbContextProperty_IsFalse()\n        {\n            var mockedContext = MockedDbContextFactory();\n\n            mockedContext.Set<Foo>().Any().Should().BeFalse();\n        }\n\n        public class TestDbContext : DbContext\n        {\n            public TestDbContext(DbContextOptions<TestDbContext> options) : base(options) { }\n\n            protected override void OnModelCreating(ModelBuilder modelBuilder)\n            {\n                modelBuilder.Entity<Foo>().HasNoKey();\n            }\n        }\n\n        public class Foo\n        {\n            public string Bar { get; set; }\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/Issue117Tests.cs",
    "content": "﻿using System.Linq;\nusing AutoFixture;\nusing FluentAssertions;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\nusing static FluentAssertions.FluentActions;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public abstract class Issue117Tests : BaseForTests\n    {\n        protected abstract TestDbContext MockedDbContextFactory();\n\n        [Test]\n        public void DbContextDispose_InvokedViaUsingBlock_DoesNotThrowException()\n        {\n            Invoking(() =>\n            {\n                using (MockedDbContextFactory()) { }\n            }).Should().NotThrow();\n        }\n\n        [Test]\n        public void DbContextDispose_DoesNotThrowException()\n        {\n            Invoking(() => MockedDbContextFactory().Dispose()).Should().NotThrow();\n        }\n\n        [Test]\n        public void DbContextAddRange_DoesNotThrowException()\n        {\n            Invoking(() => MockedDbContextFactory().AddRange(Fixture.CreateMany<Foo>())).Should().NotThrow();\n        }\n\n        [Test]\n        public void DbContextAddRangeThenSaveChanges_WithinUsingBlock_PersistsMutableEntities()\n        {\n            using (var dbContext = MockedDbContextFactory())\n            {\n                var entities = Fixture.CreateMany<Foo>();\n\n                dbContext.AddRange(entities);\n                dbContext.SaveChanges();\n\n                dbContext.Set<Foo>().ToList().Should().BeEquivalentTo(entities);\n            }\n        }\n\n        public class TestDbContext : DbContext\n        {\n            public TestDbContext(DbContextOptions<TestDbContext> options) : base(options) { }\n\n            public virtual DbSet<Foo> MutableEntities { get; set; }\n\n            protected override void OnModelCreating(ModelBuilder modelBuilder)\n            {\n                modelBuilder.Entity<Foo>().HasKey(c => c.Id);\n            }\n        }\n\n        public class Foo\n        {\n            public string Id { get; set; }\n\n            public string Bar { get; set; }\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/Issue126Tests.cs",
    "content": "﻿using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing FluentAssertions;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests;\n\npublic abstract class Issue126Tests<TDbContext> : BaseForTests where TDbContext : DbContext\n{\n    protected Func<TDbContext> DbContextFactory;\n\n    [Test]\n    public virtual void BeginTransaction_ReturnsMockTransaction()\n    {\n        using var transaction = DbContextFactory().Database.BeginTransaction();\n        transaction.Should().NotBeNull();\n    }\n\n    [TestCase(true)]\n    [TestCase(false)]\n    public virtual async Task BeginTransactionAsync_ReturnsMockTransaction(bool withCancellationTokenParameter)\n    {\n        await using var transaction = withCancellationTokenParameter\n            ? await DbContextFactory().Database.BeginTransactionAsync(CancellationToken.None)\n            : await DbContextFactory().Database.BeginTransactionAsync();\n        \n        transaction.Should().NotBeNull();\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/Issue49Tests.cs",
    "content": "﻿using AutoFixture;\nusing FluentAssertions;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public abstract class Issue49Tests<TDbContext, TEntity> : BaseForTests where TDbContext : DbContext\n        where TEntity : BaseTestEntity\n    {\n        protected TDbContext DbContext;\n\n        [Test]\n        public virtual void EntityEntryState_Entity_IsDetached()\n        {\n            var entity = Fixture.Create<TEntity>();\n\n            var actualResult = DbContext.Entry(entity).State;\n\n            actualResult.Should().Be(EntityState.Detached);\n        }\n\n        [Test]\n        public virtual void EntityEntryState_EntityAsObject_IsDetached()\n        {\n            var entity = Fixture.Create<TEntity>();\n\n            var actualResult = DbContext.Entry((object) entity).State;\n\n            actualResult.Should().Be(EntityState.Detached);\n        }\n\n        [Test]\n        public virtual void DbContextAdd_Entity_IsAdded()\n        {\n            var entity = Fixture.Create<TEntity>();\n\n            var actualResult = DbContext.Add(entity);\n\n            actualResult.State.Should().Be(EntityState.Added);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/Issue88Tests.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing AutoFixture;\nusing FluentAssertions;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public abstract class Issue88Tests<TDbContext, TEntity> : BaseForTests where TDbContext : DbContext\n        where TEntity : BaseTestEntity\n    {\n        protected Func<TDbContext> DbContextFactory;\n\n        [Test]\n        public virtual void AddThenSaveChanges_ChangesVisibleAnyDbContext()\n        {\n            var entity = Fixture.Create<TEntity>();\n\n            var dbContext = DbContextFactory();\n\n            dbContext.Set<TEntity>().Add(entity);\n            dbContext.SaveChanges();\n\n            dbContext.Find<TEntity>(entity.Id).Should().BeEquivalentTo(entity);\n            dbContext.Set<TEntity>().Single(x => x.Id.Equals(entity.Id)).Should().BeEquivalentTo(entity);\n\n            var anotherDbContext = DbContextFactory();\n            anotherDbContext.Find<TEntity>(entity.Id).Should().BeEquivalentTo(entity);\n            anotherDbContext.Set<TEntity>().Single(x => x.Id.Equals(entity.Id)).Should().BeEquivalentTo(entity);\n        }\n\n        [Test]\n        public virtual void BeginTransactionThenAddThenSaveChangesThenCommit_ChangesVisibleAnyDbContext()\n        {\n            var entity = Fixture.Create<TEntity>();\n\n            var dbContext = DbContextFactory();\n\n            using (var transaction = dbContext.Database.BeginTransaction())\n            {\n                dbContext.Set<TEntity>().Add(entity);\n                dbContext.SaveChanges();\n                transaction.Commit();\n            }\n\n            dbContext.Find<TEntity>(entity.Id).Should().BeEquivalentTo(entity);\n            dbContext.Set<TEntity>().Single(x => x.Id.Equals(entity.Id)).Should().BeEquivalentTo(entity);\n\n            var anotherDbContext = DbContextFactory();\n            anotherDbContext.Find<TEntity>(entity.Id).Should().BeEquivalentTo(entity);\n            anotherDbContext.Set<TEntity>().Single(x => x.Id.Equals(entity.Id)).Should().BeEquivalentTo(entity);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/MappingProfile.cs",
    "content": "﻿using AutoMapper;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public class MappingProfile : Profile\n    {\n        public MappingProfile()\n        {\n            CreateMap<TestEntity, TestViewModel>();\n\n            CreateMap<TestReadOnlyEntity, TestViewModel>();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/NotRegisteredEntity.cs",
    "content": "﻿namespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public class NotRegisteredEntity : BaseTestEntity { }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/ReadOnlyDbSetExceptionTests.cs",
    "content": "﻿using System;\nusing AutoFixture;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public abstract class ReadOnlyDbSetExceptionTests<TEntity> : BaseForTests where TEntity : BaseTestEntity\n    {\n        protected abstract DbSet<TEntity> DbSet { get; }\n\n        [Test]\n        public void Add_Item_ThrowsException()\n        {\n            var ex = Assert.Throws<InvalidOperationException>(() =>\n            {\n                DbSet.Add(Fixture.Create<TEntity>());\n            });\n            Assert.That(ex.Message,\n                Is.EqualTo(\n                    $\"Unable to track an instance of type '{typeof(TEntity).Name}' because it does not have a primary key. Only entity types with a primary key may be tracked.\"));\n        }\n\n        [Test]\n        public void AddAsync_Item_ThrowsException()\n        {\n            var ex = Assert.ThrowsAsync<InvalidOperationException>(async () =>\n            {\n                await DbSet.AddAsync(Fixture.Create<TEntity>());\n            });\n            Assert.That(ex.Message,\n                Is.EqualTo(\n                    $\"Unable to track an instance of type '{typeof(TEntity).Name}' because it does not have a primary key. Only entity types with a primary key may be tracked.\"));\n        }\n\n        [Test]\n        public void AddRange_Items_ThrowsException()\n        {\n            var ex = Assert.Throws<InvalidOperationException>(() =>\n            {\n                DbSet.AddRange(Fixture.CreateMany<TEntity>());\n            });\n            Assert.That(ex.Message,\n                Is.EqualTo(\n                    $\"Unable to track an instance of type '{typeof(TEntity).Name}' because it does not have a primary key. Only entity types with a primary key may be tracked.\"));\n        }\n\n        [Test]\n        public void AddRangeAsync_Items_ThrowsException()\n        {\n            var ex = Assert.ThrowsAsync<InvalidOperationException>(async () =>\n            {\n                await DbSet.AddRangeAsync(Fixture.CreateMany<TEntity>());\n            });\n            Assert.That(ex.Message,\n                Is.EqualTo(\n                    $\"Unable to track an instance of type '{typeof(TEntity).Name}' because it does not have a primary key. Only entity types with a primary key may be tracked.\"));\n        }\n\n        [Test]\n        public void Attach_Item_ThrowsException()\n        {\n            var ex = Assert.Throws<InvalidOperationException>(() =>\n            {\n                DbSet.Attach(Fixture.Create<TEntity>());\n            });\n            Assert.That(ex.Message,\n                Is.EqualTo(\n                    $\"Unable to track an instance of type '{typeof(TEntity).Name}' because it does not have a primary key. Only entity types with a primary key may be tracked.\"));\n        }\n\n        [Test]\n        public void AttachRange_Items_ThrowsException()\n        {\n            var ex = Assert.Throws<InvalidOperationException>(() =>\n            {\n                DbSet.AttachRange(Fixture.CreateMany<TEntity>());\n            });\n            Assert.That(ex.Message,\n                Is.EqualTo(\n                    $\"Unable to track an instance of type '{typeof(TEntity).Name}' because it does not have a primary key. Only entity types with a primary key may be tracked.\"));\n        }\n\n        [Test]\n        public void Find_Item_ThrowsException()\n        {\n            var itemToFind = Fixture.Create<TEntity>();\n            var ex = Assert.Throws<InvalidOperationException>(() =>\n            {\n                DbSet.Find(itemToFind.Id);\n            });\n            Assert.That(ex.Message, Is.EqualTo($\"The invoked method cannot be used for the entity type '{typeof(TEntity).Name}' because it does not have a primary key. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.\"));\n        }\n\n        [Test]\n        public void Find_Items_ThrowsException()\n        {\n            var itemsToFind = Fixture.CreateMany<TEntity>();\n            var ex = Assert.ThrowsAsync<InvalidOperationException>(async () =>\n            {\n                await DbSet.FindAsync(itemsToFind);\n            });\n            Assert.That(ex.Message, Is.EqualTo($\"The invoked method cannot be used for the entity type '{typeof(TEntity).Name}' because it does not have a primary key. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.\"));\n        }\n\n        [Test]\n        public void Local_ThrowsException()\n        {\n            var ex = Assert.Throws<InvalidOperationException>(() =>\n            {\n                var localView = DbSet.Local;\n            });\n            Assert.That(ex.Message, Is.EqualTo($\"The invoked method cannot be used for the entity type '{typeof(TEntity).Name}' because it does not have a primary key. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.\"));\n        }\n\n        [Test]\n        public void Remove_Item_ThrowsException()\n        {\n            var ex = Assert.Throws<InvalidOperationException>(() =>\n            {\n                DbSet.Remove(Fixture.Create<TEntity>());\n            });\n            Assert.That(ex.Message,\n                Is.EqualTo(\n                    $\"Unable to track an instance of type '{typeof(TEntity).Name}' because it does not have a primary key. Only entity types with a primary key may be tracked.\"));\n        }\n\n        [Test]\n        public void RemoveRange_Items_ThrowsException()\n        {\n            var ex = Assert.Throws<InvalidOperationException>(() =>\n            {\n                DbSet.RemoveRange(Fixture.CreateMany<TEntity>());\n            });\n            Assert.That(ex.Message,\n                Is.EqualTo(\n                    $\"Unable to track an instance of type '{typeof(TEntity).Name}' because it does not have a primary key. Only entity types with a primary key may be tracked.\"));\n        }\n\n        [Test]\n        public void Update_Item_ThrowsException()\n        {\n            var ex = Assert.Throws<InvalidOperationException>(() =>\n            {\n                DbSet.Update(Fixture.Create<TEntity>());\n            });\n            Assert.That(ex.Message,\n                Is.EqualTo(\n                    $\"Unable to track an instance of type '{typeof(TEntity).Name}' because it does not have a primary key. Only entity types with a primary key may be tracked.\"));\n        }\n\n        [Test]\n        public void UpdateRange_Items_ThrowsException()\n        {\n            var ex = Assert.Throws<InvalidOperationException>(() =>\n            {\n                DbSet.UpdateRange(Fixture.CreateMany<TEntity>());\n            });\n            Assert.That(ex.Message,\n                Is.EqualTo(\n                    $\"Unable to track an instance of type '{typeof(TEntity).Name}' because it does not have a primary key. Only entity types with a primary key may be tracked.\"));\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/TestDbContext.cs",
    "content": "﻿using Microsoft.EntityFrameworkCore;\nusing Microsoft.Extensions.Logging;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public class TestDbContext : DbContext\n    {\n        private static readonly ILogger Logger = LoggingHelper.CreateLogger<TestDbContext>();\n\n        public TestDbContext() { }\n\n        public TestDbContext(DbContextOptions<TestDbContext> options) : base(options) { }\n\n        public TestDbContext(ILogger<TestDbContext> logger, DbContextOptions<TestDbContext> options) : base(options) { }\n\n        public virtual DbSet<TestEntity> TestEntities { get; set; }\n        public virtual DbSet<TestReadOnlyEntity> TestReadOnlyEntities { get; set; }\n\n        protected override void OnModelCreating(ModelBuilder modelBuilder)\n        {\n            modelBuilder.Entity<TestEntity>().HasKey(c => c.Id);\n\n            modelBuilder.Entity<TestReadOnlyEntity>().HasNoKey().ToView(\"TestReadOnlyEntities\");\n        }\n\n        public override int SaveChanges()\n        {\n            Logger.LogDebug(\"SaveChanges invoked\");\n            return base.SaveChanges();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/TestEntity.cs",
    "content": "﻿namespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public class TestEntity : BaseTestEntity { }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/TestReadOnlyEntity.cs",
    "content": "﻿namespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public class TestReadOnlyEntity : BaseTestEntity { }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Common.Tests/TestViewModel.cs",
    "content": "﻿using System;\n\nnamespace EntityFrameworkCore.Testing.Common.Tests\n{\n    public class TestViewModel\n    {\n        public Guid id { get; set; }\n\n        public string fullName { get; set; }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq/Create.cs",
    "content": "using System.Linq;\nusing EntityFrameworkCore.Testing.Moq.Extensions;\nusing EntityFrameworkCore.Testing.Moq.Helpers;\nusing Microsoft.EntityFrameworkCore;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.Moq\n{\n    /// <summary>\n    ///     Factory for creating mocked instances.\n    /// </summary>\n    public static class Create\n    {\n        /// <summary>\n        ///     Creates a mocked db context.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"constructorParameters\">\n        ///     The parameters that will be used to create the mocked db context and, if one is not provided,\n        ///     the in-memory context that the mocked db context will use for in-memory provider supported operations.\n        /// </param>\n        /// <returns>A mocked db context.</returns>\n        /// <remarks>\n        ///     If you do not provide any constructor arguments this method attempt to create a TDbContext\n        ///     via a constructor with a single DbContextOptionsBuilder parameter or a parameterless constructor.\n        /// </remarks>\n        public static TDbContext MockedDbContextFor<TDbContext>(params object[] constructorParameters) where TDbContext : DbContext\n        {\n            return constructorParameters != null && constructorParameters.Any()\n                ? new MockedDbContextBuilder<TDbContext>().UseConstructorWithParameters(constructorParameters).MockedDbContext\n                : new MockedDbContextBuilder<TDbContext>().MockedDbContext;\n        }\n\n        /// <summary>\n        ///     Creates a mocked query provider.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable type.</typeparam>\n        /// <param name=\"queryable\">The query provider source.</param>\n        /// <returns>A mocked query provider.</returns>\n        public static IQueryProvider MockedQueryProviderFor<T>(IQueryable<T> queryable) where T : class\n        {\n            EnsureArgument.IsNotNull(queryable, nameof(queryable));\n\n            return queryable.Provider.CreateMockedQueryProvider(queryable);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq/EntityFrameworkCore.Testing.Moq.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n    <Authors>rgvlee</Authors>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <DocumentationFile>EntityFrameworkCore.Testing.Moq.xml</DocumentationFile>\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <DocumentationFile>EntityFrameworkCore.Testing.Moq.xml</DocumentationFile>\n    <DebugSymbols>true</DebugSymbols>\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Moq\" Version=\"4.9.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\EntityFrameworkCore.Testing.Common\\EntityFrameworkCore.Testing.Common.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq/EntityFrameworkCore.Testing.Moq.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>EntityFrameworkCore.Testing.Moq</name>\n    </assembly>\n    <members>\n        <member name=\"T:EntityFrameworkCore.Testing.Moq.Create\">\n            <summary>\n                Factory for creating mocked instances.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Create.MockedDbContextFor``1(System.Object[])\">\n            <summary>\n                Creates a mocked db context.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"constructorParameters\">\n                The parameters that will be used to create the mocked db context and, if one is not provided,\n                the in-memory context that the mocked db context will use for in-memory provider supported operations.\n            </param>\n            <returns>A mocked db context.</returns>\n            <remarks>\n                If you do not provide any constructor arguments this method attempt to create a TDbContext\n                via a constructor with a single DbContextOptionsBuilder parameter or a parameterless constructor.\n            </remarks>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Create.MockedQueryProviderFor``1(System.Linq.IQueryable{``0})\">\n            <summary>\n                Creates a mocked query provider.\n            </summary>\n            <typeparam name=\"T\">The queryable type.</typeparam>\n            <param name=\"queryable\">The query provider source.</param>\n            <returns>A mocked query provider.</returns>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.Moq.Extensions.DbContextExtensions\">\n            <summary>\n                Extensions for db contexts.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.DbContextExtensions.AddExecuteSqlInterpolatedResult``1(``0,System.Int32,System.Action{System.String,System.Collections.Generic.IEnumerable{System.Object}})\">\n            <summary>\n                Sets up ExecuteSqlInterpolated invocations to return a specified result.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"mockedDbContext\">The mocked db context.</param>\n            <param name=\"executeSqlInterpolatedResult\">The integer to return when ExecuteSqlInterpolated is invoked.</param>\n            <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n            <returns>The mocked db context.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.DbContextExtensions.AddExecuteSqlInterpolatedResult``1(``0,System.FormattableString,System.Int32,System.Action{System.String,System.Collections.Generic.IEnumerable{System.Object}})\">\n            <summary>\n                Sets up ExecuteSqlInterpolated invocations containing a specified sql string to return a specified result.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"mockedDbContext\">The mocked db context.</param>\n            <param name=\"sql\">The ExecuteSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"executeSqlInterpolatedResult\">The integer to return when ExecuteSqlInterpolated is invoked.</param>\n            <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n            <returns>The mocked db context.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.DbContextExtensions.AddExecuteSqlInterpolatedResult``1(``0,System.String,System.Collections.Generic.IEnumerable{System.Object},System.Int32,System.Action{System.String,System.Collections.Generic.IEnumerable{System.Object}})\">\n            <summary>\n                Sets up ExecuteSqlInterpolated invocations containing a specified sql string to return a specified result.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"mockedDbContext\">The mocked db context.</param>\n            <param name=\"sql\">The ExecuteSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"parameters\">The ExecuteSqlInterpolated parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n            <param name=\"executeSqlInterpolatedResult\">The integer to return when ExecuteSqlInterpolated is invoked.</param>\n            <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n            <returns>The mocked db context.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.DbContextExtensions.AddExecuteSqlRawResult``1(``0,System.Int32,System.Action{System.String,System.Collections.Generic.IEnumerable{System.Object}})\">\n            <summary>\n                Sets up ExecuteSqlRaw invocations to return a specified result.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"mockedDbContext\">The mocked db context.</param>\n            <param name=\"executeSqlRawResult\">The integer to return when ExecuteSqlRaw is invoked.</param>\n            <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n            <returns>The mocked db context.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.DbContextExtensions.AddExecuteSqlRawResult``1(``0,System.String,System.Int32,System.Action{System.String,System.Collections.Generic.IEnumerable{System.Object}})\">\n            <summary>\n                Sets up ExecuteSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"mockedDbContext\">The mocked db context.</param>\n            <param name=\"sql\">The ExecuteSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"executeSqlRawResult\">The integer to return when ExecuteSqlRaw is invoked.</param>\n            <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n            <returns>The mocked db context.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.DbContextExtensions.AddExecuteSqlRawResult``1(``0,System.String,System.Collections.Generic.IEnumerable{System.Object},System.Int32,System.Action{System.String,System.Collections.Generic.IEnumerable{System.Object}})\">\n            <summary>\n                Sets up ExecuteSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"mockedDbContext\">The mocked db context.</param>\n            <param name=\"sql\">The ExecuteSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"parameters\">The ExecuteSqlRaw parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n            <param name=\"executeSqlRawResult\">The integer to return when ExecuteSqlRaw is invoked.</param>\n            <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n            <returns>The mocked db context.</returns>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.Moq.Extensions.DbSetExtensions\">\n            <summary>\n                Extensions for db sets.\n            </summary>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.Moq.Extensions.QueryableExtensions\">\n            <summary>\n                Extensions for queryable collections.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.QueryableExtensions.AddFromSqlInterpolatedResult``1(System.Linq.IQueryable{``0},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlInterpolated invocations to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryable\">The mocked queryable.</param>\n            <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.QueryableExtensions.AddFromSqlInterpolatedResult``1(System.Linq.IQueryable{``0},System.FormattableString,System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlInterpolated invocations to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryable\">The mocked queryable.</param>\n            <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.QueryableExtensions.AddFromSqlInterpolatedResult``1(System.Linq.IQueryable{``0},System.String,System.Collections.Generic.IEnumerable{System.Object},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlInterpolated invocations to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryable\">The mocked queryable.</param>\n            <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"parameters\">The FromSqlInterpolated parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n            <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.QueryableExtensions.AddFromSqlRawResult``1(System.Linq.IQueryable{``0},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlRaw invocations to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryable\">The mocked queryable.</param>\n            <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.QueryableExtensions.AddFromSqlRawResult``1(System.Linq.IQueryable{``0},System.String,System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlRaw invocations containing a specified sql string to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryable\">The mocked queryable.</param>\n            <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.QueryableExtensions.AddFromSqlRawResult``1(System.Linq.IQueryable{``0},System.String,System.Collections.Generic.IEnumerable{System.Object},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryable\">The mocked queryable.</param>\n            <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"parameters\">The FromSqlRaw parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n            <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.Moq.Extensions.QueryProviderExtensions\">\n            <summary>\n                Extensions for collection query providers.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.QueryProviderExtensions.AddFromSqlInterpolatedResult``1(System.Linq.IQueryProvider,System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlInterpolated invocations to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n            <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.QueryProviderExtensions.AddFromSqlInterpolatedResult``1(System.Linq.IQueryProvider,System.FormattableString,System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlInterpolated invocations containing a specified sql string to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n            <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.QueryProviderExtensions.AddFromSqlInterpolatedResult``1(System.Linq.IQueryProvider,System.String,System.Collections.Generic.IEnumerable{System.Object},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlInterpolated invocations containing a specified sql string and parameters to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n            <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"parameters\">The FromSqlInterpolated parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n            <param name=\"fromSqlInterpolatedResult\">The sequence to return when FromSqlInterpolated is invoked.</param>\n            <returns>The mocked query provider.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.QueryProviderExtensions.AddFromSqlRawResult``1(System.Linq.IQueryProvider,System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlRaw invocations to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n            <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.QueryProviderExtensions.AddFromSqlRawResult``1(System.Linq.IQueryProvider,System.String,System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlRaw invocations containing a specified sql string to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n            <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.QueryProviderExtensions.AddFromSqlRawResult``1(System.Linq.IQueryProvider,System.String,System.Collections.Generic.IEnumerable{System.Object},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n            <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"parameters\">The FromSqlRaw parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n            <param name=\"fromSqlResult\">The sequence to return when FromSqlRaw is invoked.</param>\n            <returns>The mocked query provider.</returns>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.Moq.Extensions.ReadOnlyDbSetExtensions\">\n            <summary>\n                Extensions for read-only db sets.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.ReadOnlyDbSetExtensions.AddToReadOnlySource``1(Microsoft.EntityFrameworkCore.DbSet{``0},``0)\">\n            <summary>\n                Adds an item to the end of the mocked readonly db set source.\n            </summary>\n            <typeparam name=\"TEntity\">The entity type.</typeparam>\n            <param name=\"mockedReadOnlyDbSet\">The mocked readonly db set.</param>\n            <param name=\"item\">The item to be added to the end of the mocked readonly db set source.</param>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.ReadOnlyDbSetExtensions.AddRangeToReadOnlySource``1(Microsoft.EntityFrameworkCore.DbSet{``0},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Adds the items of the specified sequence to the end of the mocked readonly db set source.\n            </summary>\n            <typeparam name=\"TEntity\">The entity type.</typeparam>\n            <param name=\"mockedReadOnlyDbSet\">The mocked readonly db set.</param>\n            <param name=\"items\">The sequence whose items should be added to the end of the mocked readonly db set source.</param>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.Moq.Extensions.ReadOnlyDbSetExtensions.ClearReadOnlySource``1(Microsoft.EntityFrameworkCore.DbSet{``0})\">\n            <summary>\n                Removes all items from the mocked readonly db set source.\n            </summary>\n            <typeparam name=\"TEntity\">The entity type.</typeparam>\n            <param name=\"mockedReadOnlyDbSet\">The mocked readonly db set.</param>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.Moq.Helpers.MockedDbContextBuilder`1\">\n            <summary>\n                The mocked db context builder.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        </member>\n        <member name=\"P:EntityFrameworkCore.Testing.Moq.Helpers.MockedDbContextBuilder`1.MockedDbContext\">\n            <summary>\n                Creates the mocked db context.\n            </summary>\n            <returns>A mocked db context.</returns>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq/Extensions/DbContextExtensions.cs",
    "content": "﻿#pragma warning disable EF1001 // Internal EF Core API usage.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing EntityFrameworkCore.Testing.Common.Helpers;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.EntityFrameworkCore.Storage;\nusing Microsoft.Extensions.Logging;\nusing Moq;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.Moq.Extensions\n{\n    /// <summary>\n    ///     Extensions for db contexts.\n    /// </summary>\n    public static class DbContextExtensions\n    {\n        private static readonly ILogger Logger = LoggingHelper.CreateLogger(typeof(DbContextExtensions));\n\n        /// <summary>\n        ///     Sets up ExecuteSqlInterpolated invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"mockedDbContext\">The mocked db context.</param>\n        /// <param name=\"executeSqlInterpolatedResult\">The integer to return when ExecuteSqlInterpolated is invoked.</param>\n        /// <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n        /// <returns>The mocked db context.</returns>\n        public static TDbContext AddExecuteSqlInterpolatedResult<TDbContext>(\n            this TDbContext mockedDbContext, int executeSqlInterpolatedResult, Action<string, IEnumerable<object>> callback = null) where TDbContext : DbContext\n        {\n            EnsureArgument.IsNotNull(mockedDbContext, nameof(mockedDbContext));\n            return mockedDbContext.AddExecuteSqlRawResult(string.Empty, new List<object>(), executeSqlInterpolatedResult, callback);\n        }\n\n        /// <summary>\n        ///     Sets up ExecuteSqlInterpolated invocations containing a specified sql string to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"mockedDbContext\">The mocked db context.</param>\n        /// <param name=\"sql\">The ExecuteSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"executeSqlInterpolatedResult\">The integer to return when ExecuteSqlInterpolated is invoked.</param>\n        /// <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n        /// <returns>The mocked db context.</returns>\n        public static TDbContext AddExecuteSqlInterpolatedResult<TDbContext>(\n            this TDbContext mockedDbContext, FormattableString sql, int executeSqlInterpolatedResult, Action<string, IEnumerable<object>> callback = null)\n            where TDbContext : DbContext\n        {\n            EnsureArgument.IsNotNull(mockedDbContext, nameof(mockedDbContext));\n            return mockedDbContext.AddExecuteSqlRawResult(sql.Format, sql.GetArguments(), executeSqlInterpolatedResult, callback);\n        }\n\n        /// <summary>\n        ///     Sets up ExecuteSqlInterpolated invocations containing a specified sql string to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"mockedDbContext\">The mocked db context.</param>\n        /// <param name=\"sql\">The ExecuteSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"parameters\">The ExecuteSqlInterpolated parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n        /// <param name=\"executeSqlInterpolatedResult\">The integer to return when ExecuteSqlInterpolated is invoked.</param>\n        /// <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n        /// <returns>The mocked db context.</returns>\n        public static TDbContext AddExecuteSqlInterpolatedResult<TDbContext>(\n            this TDbContext mockedDbContext, string sql, IEnumerable<object> parameters, int executeSqlInterpolatedResult, Action<string, IEnumerable<object>> callback = null)\n            where TDbContext : DbContext\n        {\n            EnsureArgument.IsNotNull(mockedDbContext, nameof(mockedDbContext));\n            return mockedDbContext.AddExecuteSqlRawResult(sql, parameters, executeSqlInterpolatedResult, callback);\n        }\n\n        /// <summary>\n        ///     Sets up ExecuteSqlRaw invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"mockedDbContext\">The mocked db context.</param>\n        /// <param name=\"executeSqlRawResult\">The integer to return when ExecuteSqlRaw is invoked.</param>\n        /// <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n        /// <returns>The mocked db context.</returns>\n        public static TDbContext AddExecuteSqlRawResult<TDbContext>(this TDbContext mockedDbContext, int executeSqlRawResult, Action<string, IEnumerable<object>> callback = null)\n            where TDbContext : DbContext\n        {\n            EnsureArgument.IsNotNull(mockedDbContext, nameof(mockedDbContext));\n            return mockedDbContext.AddExecuteSqlRawResult(string.Empty, new List<object>(), executeSqlRawResult, callback);\n        }\n\n        /// <summary>\n        ///     Sets up ExecuteSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"mockedDbContext\">The mocked db context.</param>\n        /// <param name=\"sql\">The ExecuteSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"executeSqlRawResult\">The integer to return when ExecuteSqlRaw is invoked.</param>\n        /// <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n        /// <returns>The mocked db context.</returns>\n        public static TDbContext AddExecuteSqlRawResult<TDbContext>(\n            this TDbContext mockedDbContext, string sql, int executeSqlRawResult, Action<string, IEnumerable<object>> callback = null) where TDbContext : DbContext\n        {\n            EnsureArgument.IsNotNull(mockedDbContext, nameof(mockedDbContext));\n            return mockedDbContext.AddExecuteSqlRawResult(sql, new List<object>(), executeSqlRawResult, callback);\n        }\n\n        /// <summary>\n        ///     Sets up ExecuteSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"mockedDbContext\">The mocked db context.</param>\n        /// <param name=\"sql\">The ExecuteSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"parameters\">The ExecuteSqlRaw parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n        /// <param name=\"executeSqlRawResult\">The integer to return when ExecuteSqlRaw is invoked.</param>\n        /// <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n        /// <returns>The mocked db context.</returns>\n        public static TDbContext AddExecuteSqlRawResult<TDbContext>(\n            this TDbContext mockedDbContext, string sql, IEnumerable<object> parameters, int executeSqlRawResult, Action<string, IEnumerable<object>> callback = null)\n            where TDbContext : DbContext\n        {\n            EnsureArgument.IsNotNull(mockedDbContext, nameof(mockedDbContext));\n            EnsureArgument.IsNotNull(sql, nameof(sql));\n            EnsureArgument.IsNotNull(parameters, nameof(parameters));\n\n            var relationalCommandMock = new Mock<IRelationalCommand>();\n            relationalCommandMock.Setup(m => m.ExecuteNonQuery(It.IsAny<RelationalCommandParameterObject>()))\n                .Returns((RelationalCommandParameterObject providedRelationalCommandParameterObject) => executeSqlRawResult);\n\n            relationalCommandMock.Setup(m => m.ExecuteNonQueryAsync(It.IsAny<RelationalCommandParameterObject>(), It.IsAny<CancellationToken>()))\n                .Returns((RelationalCommandParameterObject providedRelationalCommandParameterObject, CancellationToken providedCancellationToken) =>\n                    Task.FromResult(executeSqlRawResult));\n            var relationalCommand = relationalCommandMock.Object;\n\n            var rawSqlCommandMock = new Mock<RawSqlCommand>(relationalCommand, new Dictionary<string, object>());\n            rawSqlCommandMock.Setup(m => m.RelationalCommand).Returns(() => relationalCommand);\n            rawSqlCommandMock.Setup(m => m.ParameterValues).Returns(() => new Dictionary<string, object>());\n            var rawSqlCommand = rawSqlCommandMock.Object;\n\n            var existingRawSqlCommandBuilder =\n                ((IRelationalDatabaseFacadeDependencies) ((IInfrastructure<IServiceProvider>) mockedDbContext).Instance.GetService(typeof(IDatabaseFacadeDependencies)))\n                .RawSqlCommandBuilder;\n\n            Mock.Get(existingRawSqlCommandBuilder)\n                .Setup(m => m.Build(\n                    It.Is<string>(s => s.Contains(sql, StringComparison.OrdinalIgnoreCase)),\n                    It.Is<IEnumerable<object>>(p => ParameterMatchingHelper.DoInvocationParametersMatchSetUpParameters(parameters, p)),\n                    It.IsAny<IModel>()))\n                .Returns((string _, IEnumerable<object> _, IModel _) => rawSqlCommand)\n                .Callback((string providedSql, IEnumerable<object> providedParameters, IModel _) =>\n                {\n                    callback?.Invoke(providedSql, providedParameters);\n\n                    var parts = new List<string>();\n                    parts.Add($\"Invocation sql: {providedSql}\");\n                    parts.Add(\"Invocation Parameters:\");\n                    parts.Add(ParameterMatchingHelper.StringifyParameters(providedParameters));\n                    Logger.LogDebug(string.Join(Environment.NewLine, parts));\n                });\n\n            return mockedDbContext;\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq/Extensions/DbSetExtensions.Internal.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Threading;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Moq;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.Moq.Extensions\n{\n    /// <summary>\n    ///     Extensions for db sets.\n    /// </summary>\n    public static class DbSetExtensions\n    {\n        internal static DbSet<TEntity> CreateMockedDbSet<TEntity>(this DbSet<TEntity> dbSet) where TEntity : class\n        {\n            EnsureArgument.IsNotNull(dbSet, nameof(dbSet));\n\n            var dbSetMock = new Mock<DbSet<TEntity>>();\n\n            var mockedQueryProvider = ((IQueryable<TEntity>) dbSet).Provider.CreateMockedQueryProvider(dbSet);\n\n            dbSetMock.Setup(m => m.Add(It.IsAny<TEntity>())).Returns((TEntity providedEntity) => dbSet.Add(providedEntity));\n            dbSetMock.Setup(m => m.AddAsync(It.IsAny<TEntity>(), It.IsAny<CancellationToken>()))\n                .Returns((TEntity providedEntity, CancellationToken providedCancellationToken) => dbSet.AddAsync(providedEntity, providedCancellationToken));\n            dbSetMock.Setup(m => m.AddRange(It.IsAny<IEnumerable<TEntity>>())).Callback((IEnumerable<TEntity> providedEntities) => dbSet.AddRange(providedEntities));\n            dbSetMock.Setup(m => m.AddRange(It.IsAny<TEntity[]>())).Callback((TEntity[] providedEntities) => dbSet.AddRange(providedEntities));\n            dbSetMock.Setup(m => m.AddRangeAsync(It.IsAny<IEnumerable<TEntity>>(), It.IsAny<CancellationToken>()))\n                .Returns((IEnumerable<TEntity> providedEntities, CancellationToken providedCancellationToken) => dbSet.AddRangeAsync(providedEntities, providedCancellationToken));\n            dbSetMock.Setup(m => m.AddRangeAsync(It.IsAny<TEntity[]>())).Returns((TEntity[] providedEntities) => dbSet.AddRangeAsync(providedEntities));\n\n            dbSetMock.Setup(m => m.Attach(It.IsAny<TEntity>())).Returns((TEntity providedEntity) => dbSet.Attach(providedEntity));\n            dbSetMock.Setup(m => m.AttachRange(It.IsAny<IEnumerable<TEntity>>())).Callback((IEnumerable<TEntity> providedEntities) => dbSet.AttachRange(providedEntities));\n            dbSetMock.Setup(m => m.AttachRange(It.IsAny<TEntity[]>())).Callback((TEntity[] providedEntities) => dbSet.AttachRange(providedEntities));\n\n            dbSetMock.As<IListSource>().Setup(m => m.ContainsListCollection).Returns(() => ((IListSource) dbSet).ContainsListCollection);\n\n            dbSetMock.As<IQueryable<TEntity>>().Setup(m => m.ElementType).Returns(() => ((IQueryable<TEntity>) dbSet).ElementType);\n            dbSetMock.Setup(m => m.EntityType).Returns(() => dbSet.EntityType);\n            dbSetMock.As<IQueryable<TEntity>>().Setup(m => m.Expression).Returns(() => ((IQueryable<TEntity>) dbSet).Expression);\n\n            dbSetMock.Setup(m => m.Find(It.IsAny<object[]>())).Returns((object[] providedKeyValues) => dbSet.Find(providedKeyValues));\n            dbSetMock.Setup(m => m.FindAsync(It.IsAny<object[]>())).Returns((object[] providedKeyValues) => dbSet.FindAsync(providedKeyValues));\n            dbSetMock.Setup(m => m.FindAsync(It.IsAny<object[]>(), It.IsAny<CancellationToken>()))\n                .Returns((object[] providedKeyValues, CancellationToken providedCancellationToken) => dbSet.FindAsync(providedKeyValues, providedCancellationToken));\n\n            dbSetMock.As<IAsyncEnumerable<TEntity>>()\n                .Setup(m => m.GetAsyncEnumerator(It.IsAny<CancellationToken>()))\n                .Returns((CancellationToken providedCancellationToken) => ((IAsyncEnumerable<TEntity>) dbSet).GetAsyncEnumerator(providedCancellationToken));\n\n            dbSetMock.As<IEnumerable>().Setup(m => m.GetEnumerator()).Returns(() => ((IEnumerable) dbSet).GetEnumerator());\n            dbSetMock.As<IEnumerable<TEntity>>().Setup(m => m.GetEnumerator()).Returns(() => ((IEnumerable<TEntity>) dbSet).GetEnumerator());\n\n            /*\n             * System.NotSupportedException : Data binding directly to a store query is not supported. Instead populate a DbSet with data,\n             * for example by calling Load on the DbSet, and then bind to local data to avoid sending a query to the database each time the\n             * databound control iterates the data. For WPF bind to 'DbSet.Local.ToObservableCollection()'. For WinForms bind to\n             * 'DbSet.Local.ToBindingList()'. For ASP.NET WebForms bind to 'DbSet.ToList()' or use Model Binding.\n             */\n            dbSetMock.As<IListSource>().Setup(m => m.GetList()).Returns(() => dbSet.ToList());\n\n            dbSetMock.As<IInfrastructure<IServiceProvider>>().Setup(m => m.Instance).Returns(() => ((IInfrastructure<IServiceProvider>) dbSet).Instance);\n\n            dbSetMock.Setup(m => m.Local).Returns(() => dbSet.Local);\n\n            dbSetMock.Setup(m => m.Remove(It.IsAny<TEntity>())).Returns((TEntity providedEntity) => dbSet.Remove(providedEntity));\n            dbSetMock.Setup(m => m.RemoveRange(It.IsAny<IEnumerable<TEntity>>())).Callback((IEnumerable<TEntity> providedEntities) => dbSet.RemoveRange(providedEntities));\n            dbSetMock.Setup(m => m.RemoveRange(It.IsAny<TEntity[]>())).Callback((TEntity[] providedEntities) => dbSet.RemoveRange(providedEntities));\n\n            dbSetMock.Setup(m => m.Update(It.IsAny<TEntity>())).Returns((TEntity providedEntity) => dbSet.Update(providedEntity));\n            dbSetMock.Setup(m => m.UpdateRange(It.IsAny<IEnumerable<TEntity>>())).Callback((IEnumerable<TEntity> providedEntities) => dbSet.UpdateRange(providedEntities));\n            dbSetMock.Setup(m => m.UpdateRange(It.IsAny<TEntity[]>())).Callback((TEntity[] providedEntities) => dbSet.UpdateRange(providedEntities));\n\n            dbSetMock.As<IQueryable<TEntity>>().Setup(m => m.Provider).Returns(() => mockedQueryProvider);\n\n            dbSetMock.Setup(m => m.AsAsyncEnumerable()).Returns(() => dbSet.AsAsyncEnumerable());\n            dbSetMock.Setup(m => m.AsQueryable()).Returns(() => dbSet);\n\n            return dbSetMock.Object;\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq/Extensions/QueryProviderExtensions.Internal.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EntityFrameworkCore.Testing.Common;\nusing Moq;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.Moq.Extensions\n{\n    public static partial class QueryProviderExtensions\n    {\n        internal static IQueryProvider CreateMockedQueryProvider<T>(this IQueryProvider queryProviderToMock, IEnumerable<T> collection) where T : class\n        {\n            EnsureArgument.IsNotNull(queryProviderToMock, nameof(queryProviderToMock));\n            EnsureArgument.IsNotNull(collection, nameof(collection));\n\n            var queryProviderMock = new Mock<AsyncQueryProvider<T>>(collection);\n            queryProviderMock.CallBase = true;\n            return queryProviderMock.Object;\n        }\n\n        internal static void SetSource<T>(this AsyncQueryProvider<T> mockedQueryProvider, IEnumerable<T> source) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            EnsureArgument.IsNotNull(source, nameof(source));\n\n            mockedQueryProvider.Source = source.AsQueryable();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq/Extensions/QueryProviderExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing EntityFrameworkCore.Testing.Common;\nusing Microsoft.EntityFrameworkCore.Query.Internal;\nusing Microsoft.Extensions.Logging;\nusing Moq;\nusing rgvlee.Core.Common.Helpers;\nusing ProjectExpressionHelper = EntityFrameworkCore.Testing.Common.Helpers.ExpressionHelper;\n\nnamespace EntityFrameworkCore.Testing.Moq.Extensions\n{\n    /// <summary>\n    ///     Extensions for collection query providers.\n    /// </summary>\n    public static partial class QueryProviderExtensions\n    {\n        private static readonly ILogger Logger = LoggingHelper.CreateLogger(typeof(QueryProviderExtensions));\n\n        /// <summary>\n        ///     Sets up FromSqlInterpolated invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n        /// <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryProvider AddFromSqlInterpolatedResult<T>(this IQueryProvider mockedQueryProvider, IEnumerable<T> fromSqlInterpolatedResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            mockedQueryProvider.AddFromSqlRawResult(string.Empty, new List<object>(), fromSqlInterpolatedResult);\n            return mockedQueryProvider;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlInterpolated invocations containing a specified sql string to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n        /// <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryProvider AddFromSqlInterpolatedResult<T>(this IQueryProvider mockedQueryProvider, FormattableString sql, IEnumerable<T> fromSqlInterpolatedResult)\n            where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            mockedQueryProvider.AddFromSqlRawResult(sql.Format, sql.GetArguments(), fromSqlInterpolatedResult);\n            return mockedQueryProvider;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlInterpolated invocations containing a specified sql string and parameters to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n        /// <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"parameters\">The FromSqlInterpolated parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n        /// <param name=\"fromSqlInterpolatedResult\">The sequence to return when FromSqlInterpolated is invoked.</param>\n        /// <returns>The mocked query provider.</returns>\n        public static IQueryProvider AddFromSqlInterpolatedResult<T>(\n            this IQueryProvider mockedQueryProvider, string sql, IEnumerable<object> parameters, IEnumerable<T> fromSqlInterpolatedResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            mockedQueryProvider.AddFromSqlRawResult(sql, parameters, fromSqlInterpolatedResult);\n            return mockedQueryProvider;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlRaw invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n        /// <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryProvider AddFromSqlRawResult<T>(this IQueryProvider mockedQueryProvider, IEnumerable<T> fromSqlRawResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            mockedQueryProvider.AddFromSqlRawResult(string.Empty, new List<object>(), fromSqlRawResult);\n            return mockedQueryProvider;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlRaw invocations containing a specified sql string to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n        /// <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryProvider AddFromSqlRawResult<T>(this IQueryProvider mockedQueryProvider, string sql, IEnumerable<T> fromSqlRawResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            mockedQueryProvider.AddFromSqlRawResult(sql, new List<object>(), fromSqlRawResult);\n            return mockedQueryProvider;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n        /// <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"parameters\">The FromSqlRaw parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n        /// <param name=\"fromSqlResult\">The sequence to return when FromSqlRaw is invoked.</param>\n        /// <returns>The mocked query provider.</returns>\n        public static IQueryProvider AddFromSqlRawResult<T>(this IQueryProvider mockedQueryProvider, string sql, IEnumerable<object> parameters, IEnumerable<T> fromSqlResult)\n            where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            EnsureArgument.IsNotNull(sql, nameof(sql));\n            EnsureArgument.IsNotNull(parameters, nameof(parameters));\n            EnsureArgument.IsNotNull(fromSqlResult, nameof(fromSqlResult));\n\n            Logger.LogDebug(\"Setting up '{sql}'\", sql);\n\n            var createQueryResult = new AsyncEnumerable<T>(fromSqlResult);\n\n            Mock.Get(mockedQueryProvider)\n                .Setup(m => m.CreateQuery<T>(It.Is<FromSqlQueryRootExpression>(fsqre => ProjectExpressionHelper.SqlAndParametersMatchFromSqlExpression(sql, parameters, fsqre))))\n                .Returns((Expression providedExpression) =>\n                {\n                    ProjectExpressionHelper.ThrowIfExpressionIsNotSupported(providedExpression);\n                    return createQueryResult;\n                })\n                .Callback((Expression providedExpression) =>\n                {\n                    var fsqre = (FromSqlQueryRootExpression) providedExpression;\n                    var parts = new List<string>();\n                    parts.Add(\"FromSql inputs:\");\n                    parts.Add(ProjectExpressionHelper.StringifyFromSqlExpression(fsqre));\n                    Logger.LogDebug(string.Join(Environment.NewLine, parts));\n                });\n\n            return mockedQueryProvider;\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq/Extensions/QueryableExtensions.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.Moq.Extensions\n{\n    /// <summary>\n    ///     Extensions for queryable collections.\n    /// </summary>\n    public static class QueryableExtensions\n    {\n        /// <summary>\n        ///     Sets up FromSqlInterpolated invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryable\">The mocked queryable.</param>\n        /// <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryable<T> AddFromSqlInterpolatedResult<T>(this IQueryable<T> mockedQueryable, IEnumerable<T> fromSqlInterpolatedResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryable, nameof(mockedQueryable));\n            mockedQueryable.Provider.AddFromSqlRawResult(string.Empty, new List<object>(), fromSqlInterpolatedResult);\n            return mockedQueryable;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlInterpolated invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryable\">The mocked queryable.</param>\n        /// <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryable<T> AddFromSqlInterpolatedResult<T>(this IQueryable<T> mockedQueryable, FormattableString sql, IEnumerable<T> fromSqlInterpolatedResult)\n            where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryable, nameof(mockedQueryable));\n            mockedQueryable.Provider.AddFromSqlRawResult(sql.Format, sql.GetArguments(), fromSqlInterpolatedResult);\n            return mockedQueryable;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlInterpolated invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryable\">The mocked queryable.</param>\n        /// <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"parameters\">The FromSqlInterpolated parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n        /// <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryable<T> AddFromSqlInterpolatedResult<T>(\n            this IQueryable<T> mockedQueryable, string sql, IEnumerable<object> parameters, IEnumerable<T> fromSqlInterpolatedResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryable, nameof(mockedQueryable));\n            mockedQueryable.Provider.AddFromSqlRawResult(sql, parameters, fromSqlInterpolatedResult);\n            return mockedQueryable;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlRaw invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryable\">The mocked queryable.</param>\n        /// <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryable<T> AddFromSqlRawResult<T>(this IQueryable<T> mockedQueryable, IEnumerable<T> fromSqlRawResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryable, nameof(mockedQueryable));\n            mockedQueryable.Provider.AddFromSqlRawResult(string.Empty, new List<object>(), fromSqlRawResult);\n            return mockedQueryable;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlRaw invocations containing a specified sql string to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryable\">The mocked queryable.</param>\n        /// <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryable<T> AddFromSqlRawResult<T>(this IQueryable<T> mockedQueryable, string sql, IEnumerable<T> fromSqlRawResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryable, nameof(mockedQueryable));\n            mockedQueryable.Provider.AddFromSqlRawResult(sql, new List<object>(), fromSqlRawResult);\n            return mockedQueryable;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryable\">The mocked queryable.</param>\n        /// <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"parameters\">The FromSqlRaw parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n        /// <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryable<T> AddFromSqlRawResult<T>(this IQueryable<T> mockedQueryable, string sql, IEnumerable<object> parameters, IEnumerable<T> fromSqlRawResult)\n            where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryable, nameof(mockedQueryable));\n            mockedQueryable.Provider.AddFromSqlRawResult(sql, parameters, fromSqlRawResult);\n            return mockedQueryable;\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq/Extensions/ReadOnlyDbSetExtensions.Internal.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Threading;\nusing EntityFrameworkCore.Testing.Common;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Query;\nusing Moq;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.Moq.Extensions\n{\n    public static partial class ReadOnlyDbSetExtensions\n    {\n        internal static DbSet<TEntity> CreateMockedReadOnlyDbSet<TEntity>(this DbSet<TEntity> readOnlyDbSet) where TEntity : class\n        {\n            EnsureArgument.IsNotNull(readOnlyDbSet, nameof(readOnlyDbSet));\n\n            var readOnlyDbSetMock = new Mock<DbSet<TEntity>>();\n\n            var asyncEnumerable = new AsyncEnumerable<TEntity>(new List<TEntity>(), new FakeQueryRootExpression(Mock.Of<IAsyncQueryProvider>(), readOnlyDbSet.EntityType));\n            var mockedQueryProvider = ((IQueryable<TEntity>) readOnlyDbSet).Provider.CreateMockedQueryProvider(asyncEnumerable);\n\n            var invalidOperationException = new InvalidOperationException(\n                $\"Unable to track an instance of type '{typeof(TEntity).Name}' because it does not have a primary key. Only entity types with a primary key may be tracked.\");\n\n            readOnlyDbSetMock.Setup(m => m.Add(It.IsAny<TEntity>())).Throws(invalidOperationException);\n            readOnlyDbSetMock.Setup(m => m.AddAsync(It.IsAny<TEntity>(), It.IsAny<CancellationToken>())).Throws(invalidOperationException);\n            readOnlyDbSetMock.Setup(m => m.AddRange(It.IsAny<IEnumerable<TEntity>>())).Throws(invalidOperationException);\n            readOnlyDbSetMock.Setup(m => m.AddRange(It.IsAny<TEntity[]>())).Throws(invalidOperationException);\n            readOnlyDbSetMock.Setup(m => m.AddRangeAsync(It.IsAny<IEnumerable<TEntity>>(), It.IsAny<CancellationToken>())).Throws(invalidOperationException);\n            readOnlyDbSetMock.Setup(m => m.AddRangeAsync(It.IsAny<TEntity[]>())).Throws(invalidOperationException);\n\n            readOnlyDbSetMock.Setup(m => m.Attach(It.IsAny<TEntity>())).Throws(invalidOperationException);\n            readOnlyDbSetMock.Setup(m => m.AttachRange(It.IsAny<IEnumerable<TEntity>>())).Throws(invalidOperationException);\n            readOnlyDbSetMock.Setup(m => m.AttachRange(It.IsAny<TEntity[]>())).Throws(invalidOperationException);\n\n            readOnlyDbSetMock.As<IListSource>().Setup(m => m.ContainsListCollection).Returns(() => false);\n\n            readOnlyDbSetMock.As<IQueryable<TEntity>>().Setup(m => m.ElementType).Returns(() => asyncEnumerable.ElementType);\n            readOnlyDbSetMock.Setup(m => m.EntityType).Returns(() => readOnlyDbSet.EntityType);\n            readOnlyDbSetMock.As<IQueryable<TEntity>>().Setup(m => m.Expression).Returns(() => asyncEnumerable.Expression);\n\n            readOnlyDbSetMock.Setup(m => m.Find(It.IsAny<object[]>())).Throws(new InvalidOperationException($\"The invoked method cannot be used for the entity type '{typeof(TEntity).Name}' because it does not have a primary key. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.\"));\n            readOnlyDbSetMock.Setup(m => m.FindAsync(It.IsAny<object[]>())).Throws(new InvalidOperationException($\"The invoked method cannot be used for the entity type '{typeof(TEntity).Name}' because it does not have a primary key. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.\"));\n            readOnlyDbSetMock.Setup(m => m.FindAsync(It.IsAny<object[]>(), It.IsAny<CancellationToken>())).Throws(new InvalidOperationException($\"The invoked method cannot be used for the entity type '{typeof(TEntity).Name}' because it does not have a primary key. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.\"));\n\n            readOnlyDbSetMock.As<IAsyncEnumerable<TEntity>>()\n                .Setup(m => m.GetAsyncEnumerator(It.IsAny<CancellationToken>()))\n                .Returns((CancellationToken providedCancellationToken) => asyncEnumerable.GetAsyncEnumerator(providedCancellationToken));\n\n            readOnlyDbSetMock.As<IEnumerable>().Setup(m => m.GetEnumerator()).Returns(() => ((IEnumerable) asyncEnumerable).GetEnumerator());\n            readOnlyDbSetMock.As<IEnumerable<TEntity>>().Setup(m => m.GetEnumerator()).Returns(() => ((IEnumerable<TEntity>) asyncEnumerable).GetEnumerator());\n\n            readOnlyDbSetMock.As<IListSource>().Setup(m => m.GetList()).Returns(() => asyncEnumerable.ToList());\n\n            readOnlyDbSetMock.As<IInfrastructure<IServiceProvider>>().Setup(m => m.Instance).Returns(() => ((IInfrastructure<IServiceProvider>) readOnlyDbSet).Instance);\n\n            readOnlyDbSetMock.Setup(m => m.Local)\n                .Throws(new InvalidOperationException($\"The invoked method cannot be used for the entity type '{typeof(TEntity).Name}' because it does not have a primary key. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.\"));\n\n            readOnlyDbSetMock.Setup(m => m.Remove(It.IsAny<TEntity>())).Throws(invalidOperationException);\n            readOnlyDbSetMock.Setup(m => m.RemoveRange(It.IsAny<IEnumerable<TEntity>>())).Throws(invalidOperationException);\n            readOnlyDbSetMock.Setup(m => m.RemoveRange(It.IsAny<TEntity[]>())).Throws(invalidOperationException);\n\n            readOnlyDbSetMock.Setup(m => m.Update(It.IsAny<TEntity>())).Throws(invalidOperationException);\n            readOnlyDbSetMock.Setup(m => m.UpdateRange(It.IsAny<IEnumerable<TEntity>>())).Throws(invalidOperationException);\n            readOnlyDbSetMock.Setup(m => m.UpdateRange(It.IsAny<TEntity[]>())).Throws(invalidOperationException);\n\n            readOnlyDbSetMock.As<IQueryable<TEntity>>().Setup(m => m.Provider).Returns(() => mockedQueryProvider);\n\n            readOnlyDbSetMock.Setup(m => m.AsAsyncEnumerable()).Returns(() => asyncEnumerable);\n            readOnlyDbSetMock.Setup(m => m.AsQueryable()).Returns(() => asyncEnumerable);\n\n            return readOnlyDbSetMock.Object;\n        }\n\n        internal static void SetSource<TEntity>(this DbSet<TEntity> mockedReadOnlyDbSet, IEnumerable<TEntity> source) where TEntity : class\n        {\n            EnsureArgument.IsNotNull(mockedReadOnlyDbSet, nameof(mockedReadOnlyDbSet));\n            EnsureArgument.IsNotNull(source, nameof(source));\n\n            var readOnlyDbSetMock = Mock.Get(mockedReadOnlyDbSet);\n\n            var asyncEnumerable = new AsyncEnumerable<TEntity>(source, new FakeQueryRootExpression(Mock.Of<IAsyncQueryProvider>(), mockedReadOnlyDbSet.EntityType));\n            var mockedQueryProvider = ((IQueryable<TEntity>) mockedReadOnlyDbSet).Provider;\n\n            readOnlyDbSetMock.As<IQueryable<TEntity>>().Setup(m => m.Expression).Returns(() => asyncEnumerable.Expression);\n\n            readOnlyDbSetMock.As<IAsyncEnumerable<TEntity>>()\n                .Setup(m => m.GetAsyncEnumerator(It.IsAny<CancellationToken>()))\n                .Returns((CancellationToken providedCancellationToken) => asyncEnumerable.GetAsyncEnumerator(providedCancellationToken));\n\n            readOnlyDbSetMock.As<IEnumerable>().Setup(m => m.GetEnumerator()).Returns(() => ((IEnumerable) asyncEnumerable).GetEnumerator());\n            readOnlyDbSetMock.As<IEnumerable<TEntity>>().Setup(m => m.GetEnumerator()).Returns(() => ((IEnumerable<TEntity>) asyncEnumerable).GetEnumerator());\n\n            readOnlyDbSetMock.As<IListSource>().Setup(m => m.GetList()).Returns(() => asyncEnumerable.ToList());\n\n            readOnlyDbSetMock.Setup(m => m.AsAsyncEnumerable()).Returns(() => asyncEnumerable);\n            readOnlyDbSetMock.Setup(m => m.AsQueryable()).Returns(() => asyncEnumerable);\n\n            ((AsyncQueryProvider<TEntity>) mockedQueryProvider).SetSource(asyncEnumerable);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq/Extensions/ReadOnlyDbSetExtensions.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing Microsoft.EntityFrameworkCore;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.Moq.Extensions\n{\n    /// <summary>\n    ///     Extensions for read-only db sets.\n    /// </summary>\n    public static partial class ReadOnlyDbSetExtensions\n    {\n        /// <summary>\n        ///     Adds an item to the end of the mocked readonly db set source.\n        /// </summary>\n        /// <typeparam name=\"TEntity\">The entity type.</typeparam>\n        /// <param name=\"mockedReadOnlyDbSet\">The mocked readonly db set.</param>\n        /// <param name=\"item\">The item to be added to the end of the mocked readonly db set source.</param>\n        public static void AddToReadOnlySource<TEntity>(this DbSet<TEntity> mockedReadOnlyDbSet, TEntity item) where TEntity : class\n        {\n            EnsureArgument.IsNotNull(mockedReadOnlyDbSet, nameof(mockedReadOnlyDbSet));\n            EnsureArgument.IsNotNull(item, nameof(item));\n\n            var list = mockedReadOnlyDbSet.ToList();\n            list.Add(item);\n\n            mockedReadOnlyDbSet.SetSource(list);\n        }\n\n        /// <summary>\n        ///     Adds the items of the specified sequence to the end of the mocked readonly db set source.\n        /// </summary>\n        /// <typeparam name=\"TEntity\">The entity type.</typeparam>\n        /// <param name=\"mockedReadOnlyDbSet\">The mocked readonly db set.</param>\n        /// <param name=\"items\">The sequence whose items should be added to the end of the mocked readonly db set source.</param>\n        public static void AddRangeToReadOnlySource<TEntity>(this DbSet<TEntity> mockedReadOnlyDbSet, IEnumerable<TEntity> items) where TEntity : class\n        {\n            EnsureArgument.IsNotNull(mockedReadOnlyDbSet, nameof(mockedReadOnlyDbSet));\n            EnsureArgument.IsNotEmpty(items, nameof(items));\n\n            var list = mockedReadOnlyDbSet.ToList();\n            list.AddRange(items);\n\n            mockedReadOnlyDbSet.SetSource(list);\n        }\n\n        /// <summary>\n        ///     Removes all items from the mocked readonly db set source.\n        /// </summary>\n        /// <typeparam name=\"TEntity\">The entity type.</typeparam>\n        /// <param name=\"mockedReadOnlyDbSet\">The mocked readonly db set.</param>\n        public static void ClearReadOnlySource<TEntity>(this DbSet<TEntity> mockedReadOnlyDbSet) where TEntity : class\n        {\n            EnsureArgument.IsNotNull(mockedReadOnlyDbSet, nameof(mockedReadOnlyDbSet));\n            mockedReadOnlyDbSet.SetSource(new List<TEntity>());\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq/Helpers/MockedDbContextBuilder.cs",
    "content": "﻿using EntityFrameworkCore.Testing.Common.Helpers;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace EntityFrameworkCore.Testing.Moq.Helpers\n{\n    /// <summary>\n    ///     The mocked db context builder.\n    /// </summary>\n    /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n    public class MockedDbContextBuilder<TDbContext> : BaseMockedDbContextBuilder<TDbContext> where TDbContext : DbContext\n    {\n        /// <summary>\n        ///     Creates the mocked db context.\n        /// </summary>\n        /// <returns>A mocked db context.</returns>\n        public override TDbContext MockedDbContext => new MockedDbContextFactory<TDbContext>(Options).Create();\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq/Helpers/MockedDbContextFactory.Internal.cs",
    "content": "﻿#pragma warning disable EF1001 // Internal EF Core API usage.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing EntityFrameworkCore.Testing.Common.Helpers;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Diagnostics;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Internal;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.EntityFrameworkCore.Storage;\nusing Microsoft.Extensions.Logging;\nusing Moq;\n\nnamespace EntityFrameworkCore.Testing.Moq.Helpers\n{\n    internal class MockedDbContextFactory<TDbContext> : BaseMockedDbContextFactory<TDbContext> where TDbContext : DbContext\n    {\n        public MockedDbContextFactory(MockedDbContextFactoryOptions<TDbContext> options) : base(options) { }\n\n        public override TDbContext Create()\n        {\n            var dbContextMock = new Mock<TDbContext>(ConstructorParameters.ToArray());\n\n            dbContextMock.DefaultValueProvider = new NoSetUpDefaultValueProvider<TDbContext>(DbContext);\n\n            dbContextMock.Setup(m => m.Add(It.IsAny<object>())).Returns((object providedEntity) => DbContext.Add(providedEntity));\n            dbContextMock.Setup(m => m.AddAsync(It.IsAny<object>(), It.IsAny<CancellationToken>()))\n                .Returns((object providedEntity, CancellationToken providedCancellationToken) => DbContext.AddAsync(providedEntity, providedCancellationToken));\n            dbContextMock.Setup(m => m.AddRange(It.IsAny<object[]>())).Callback((object[] providedEntities) => DbContext.AddRange(providedEntities));\n            dbContextMock.Setup(m => m.AddRange(It.IsAny<IEnumerable<object>>())).Callback((IEnumerable<object> providedEntities) => DbContext.AddRange(providedEntities));\n            dbContextMock.Setup(m => m.AddRangeAsync(It.IsAny<object[]>(), It.IsAny<CancellationToken>()))\n                .Returns((object[] providedEntities, CancellationToken providedCancellationToken) => DbContext.AddRangeAsync(providedEntities, providedCancellationToken));\n            dbContextMock.Setup(m => m.AddRangeAsync(It.IsAny<IEnumerable<object>>(), It.IsAny<CancellationToken>()))\n                .Returns((IEnumerable<object> providedEntities, CancellationToken providedCancellationToken) =>\n                    DbContext.AddRangeAsync(providedEntities, providedCancellationToken));\n\n            dbContextMock.Setup(m => m.Attach(It.IsAny<object>())).Returns((object providedEntity) => DbContext.Attach(providedEntity));\n            dbContextMock.Setup(m => m.AttachRange(It.IsAny<object[]>())).Callback((object[] providedEntities) => DbContext.AttachRange(providedEntities));\n            dbContextMock.Setup(m => m.AttachRange(It.IsAny<IEnumerable<object>>())).Callback((IEnumerable<object> providedEntities) => DbContext.AttachRange(providedEntities));\n\n            dbContextMock.As<IDbContextDependencies>().Setup(m => m.ChangeDetector).Returns(((IDbContextDependencies) DbContext).ChangeDetector);\n            dbContextMock.Setup(m => m.ChangeTracker).Returns(() => DbContext.ChangeTracker);\n            dbContextMock.Setup(m => m.ContextId).Returns(() => DbContext.ContextId);\n            dbContextMock.Setup(m => m.Database).Returns(() => DbContext.Database);\n            dbContextMock.Setup(m => m.Dispose()).Callback(() => DbContext.Dispose());\n            dbContextMock.Setup(m => m.DisposeAsync()).Callback(() => DbContext.DisposeAsync());\n            dbContextMock.As<IDbContextDependencies>().Setup(m => m.EntityFinderFactory).Returns(((IDbContextDependencies) DbContext).EntityFinderFactory);\n            dbContextMock.As<IDbContextDependencies>().Setup(m => m.EntityGraphAttacher).Returns(((IDbContextDependencies) DbContext).EntityGraphAttacher);\n            dbContextMock.Setup(m => m.Entry(It.IsAny<object>())).Returns((object providedEntity) => DbContext.Entry(providedEntity));\n\n            dbContextMock.Setup(m => m.Find(It.IsAny<Type>(), It.IsAny<object[]>()))\n                .Returns((Type providedEntityType, object[] providedKeyValues) => DbContext.Find(providedEntityType, providedKeyValues));\n            dbContextMock.Setup(m => m.FindAsync(It.IsAny<Type>(), It.IsAny<object[]>()))\n                .Returns((Type providedEntityType, object[] providedKeyValues) => DbContext.FindAsync(providedEntityType, providedKeyValues));\n            dbContextMock.Setup(m => m.FindAsync(It.IsAny<Type>(), It.IsAny<object[]>(), It.IsAny<CancellationToken>()))\n                .Returns((Type providedEntityType, object[] providedKeyValues, CancellationToken providedCancellationToken) =>\n                    DbContext.FindAsync(providedEntityType, providedKeyValues, providedCancellationToken));\n\n            dbContextMock.As<IDbSetCache>()\n                .Setup(m => m.GetOrAddSet(It.IsAny<IDbSetSource>(), It.IsAny<Type>()))\n                .Returns((IDbSetSource providedSource, Type providedType) => ((IDbSetCache) DbContext).GetOrAddSet(providedSource, providedType));\n            dbContextMock.As<IDbContextDependencies>().Setup(m => m.InfrastructureLogger).Returns(((IDbContextDependencies) DbContext).InfrastructureLogger);\n            dbContextMock.As<IInfrastructure<IServiceProvider>>().Setup(m => m.Instance).Returns(((IInfrastructure<IServiceProvider>) DbContext).Instance);\n            //dbContextMock.As<IDbContextDependencies>().Setup(m => m.Model).Returns(((IDbContextDependencies) DbContext).Model);\n            dbContextMock.As<IDbContextDependencies>().Setup(m => m.QueryProvider).Returns(((IDbContextDependencies) DbContext).QueryProvider);\n\n            dbContextMock.Setup(m => m.Remove(It.IsAny<object>())).Returns((object providedEntity) => DbContext.Remove(providedEntity));\n            dbContextMock.Setup(m => m.RemoveRange(It.IsAny<IEnumerable<object>>())).Callback((IEnumerable<object> providedEntities) => DbContext.RemoveRange(providedEntities));\n            dbContextMock.Setup(m => m.RemoveRange(It.IsAny<object[]>())).Callback((object[] providedEntities) => DbContext.RemoveRange(providedEntities));\n\n            dbContextMock.As<IDbContextPoolable>().Setup(m => m.ResetState()).Callback(((IDbContextPoolable) DbContext).ResetState);\n            dbContextMock.As<IDbContextPoolable>()\n                .Setup(m => m.ResetStateAsync(It.IsAny<CancellationToken>()))\n                .Callback((CancellationToken providedCancellationToken) => ((IDbContextPoolable) DbContext).ResetStateAsync(providedCancellationToken));\n            // dbContextMock.As<IDbContextPoolable>()\n            //     .Setup(m => m.Resurrect(It.IsAny<DbContextPoolConfigurationSnapshot>()))\n            //     .Callback((DbContextPoolConfigurationSnapshot providedConfigurationSnapshot) => ((IDbContextPoolable) DbContext).Resurrect(providedConfigurationSnapshot));\n\n            dbContextMock.Setup(m => m.SaveChanges()).Returns(() => DbContext.SaveChanges());\n            dbContextMock.Setup(m => m.SaveChanges(It.IsAny<bool>())).Returns((bool providedAcceptAllChangesOnSuccess) => DbContext.SaveChanges(providedAcceptAllChangesOnSuccess));\n            dbContextMock.Setup(m => m.SaveChangesAsync(It.IsAny<CancellationToken>()))\n                .Returns((CancellationToken providedCancellationToken) => DbContext.SaveChangesAsync(providedCancellationToken));\n            dbContextMock.Setup(m => m.SaveChangesAsync(It.IsAny<bool>(), It.IsAny<CancellationToken>()))\n                .Returns((bool providedAcceptAllChangesOnSuccess, CancellationToken providedCancellationToken) =>\n                    DbContext.SaveChangesAsync(providedAcceptAllChangesOnSuccess, providedCancellationToken));\n\n            // dbContextMock.As<IDbContextPoolable>()\n            //     .Setup(m => m.SetPool(It.IsAny<IDbContextPool>()))\n            //     .Callback((IDbContextPool providedContextPool) => ((IDbContextPoolable) DbContext).SetPool(providedContextPool));\n            dbContextMock.As<IDbContextDependencies>().Setup(m => m.SetSource).Returns(((IDbContextDependencies) DbContext).SetSource);\n            // dbContextMock.As<IDbContextPoolable>().Setup(m => m.SnapshotConfiguration()).Returns(((IDbContextPoolable) DbContext).SnapshotConfiguration());\n            dbContextMock.As<IDbContextDependencies>().Setup(m => m.StateManager).Returns(((IDbContextDependencies) DbContext).StateManager);\n\n            dbContextMock.Setup(m => m.Update(It.IsAny<object>())).Returns((object providedEntity) => DbContext.Update(providedEntity));\n\n            dbContextMock.As<IDbContextDependencies>().Setup(m => m.UpdateLogger).Returns(((IDbContextDependencies) DbContext).UpdateLogger);\n\n            dbContextMock.Setup(m => m.UpdateRange(It.IsAny<IEnumerable<object>>())).Callback((IEnumerable<object> providedEntities) => DbContext.UpdateRange(providedEntities));\n            dbContextMock.Setup(m => m.UpdateRange(It.IsAny<object[]>())).Callback((object[] providedEntities) => DbContext.UpdateRange(providedEntities));\n\n            //Relational set up\n            var rawSqlCommandBuilderMock = new Mock<IRawSqlCommandBuilder>();\n            rawSqlCommandBuilderMock.Setup(m => m.Build(It.IsAny<string>(), It.IsAny<IEnumerable<object>>(), It.IsAny<IModel>()))\n                .Callback((string _, IEnumerable<object> _, IModel _) => Logger.LogDebug(\"Catch all exception invoked\"))\n                .Throws<InvalidOperationException>();\n            var rawSqlCommandBuilder = rawSqlCommandBuilderMock.Object;\n\n            // var concurrencyDetectorMock = new Mock<IConcurrencyDetector>();\n            // concurrencyDetectorMock.Setup(x => x.EnterCriticalSection()).Returns(() => new ConcurrencyDetectorCriticalSectionDisposer(Mock.Of<IConcurrencyDetector>()));\n            // var concurrencyDetector = concurrencyDetectorMock.Object;\n\n            var relationalConnectionMock = new Mock<IRelationalConnection>();\n            relationalConnectionMock.Setup(x => x.CommandTimeout).Returns(() => 0);\n            var relationalConnection = relationalConnectionMock.Object;\n\n            var dependenciesMock = new Mock<IRelationalDatabaseFacadeDependencies>();\n            //dependenciesMock.Setup(m => m.ConcurrencyDetector).Returns(() => concurrencyDetector);\n            dependenciesMock.Setup(m => m.CommandLogger).Returns(() => Mock.Of<IRelationalCommandDiagnosticsLogger>());\n            dependenciesMock.Setup(m => m.RawSqlCommandBuilder).Returns(() => rawSqlCommandBuilder);\n            dependenciesMock.Setup(m => m.RelationalConnection).Returns(() => relationalConnection);\n            //dependenciesMock.Setup(m => m.CoreOptions.IsConcurrencyDetectionEnabled).Returns(() => true);\n            dependenciesMock.Setup(m => m.CoreOptions.AreThreadSafetyChecksEnabled).Returns(() => false);\n            var dependencies = dependenciesMock.Object;\n\n            var serviceProviderMock = new Mock<IServiceProvider>();\n            serviceProviderMock.Setup(m => m.GetService(It.Is<Type>(t => t == typeof(IDatabaseFacadeDependencies)))).Returns((Type providedType) => dependencies);\n            serviceProviderMock.Setup(m => m.GetService(It.Is<Type>(t => t == typeof(IModel)))).Returns((Type _) => new Mock<IModel>().Object);\n            var serviceProvider = serviceProviderMock.Object;\n\n            dbContextMock.As<IInfrastructure<IServiceProvider>>().Setup(m => m.Instance).Returns(() => serviceProvider);\n\n            var mockedDbContext = dbContextMock.Object;\n\n            var databaseFacadeMock = new Mock<DatabaseFacade>(mockedDbContext);\n            databaseFacadeMock.As<IDatabaseFacadeDependenciesAccessor>().Setup(x => x.Dependencies).Returns(() => dependencies);\n            databaseFacadeMock.Setup(x => x.BeginTransaction()).Returns(() => Mock.Of<IDbContextTransaction>());\n            databaseFacadeMock.Setup(x => x.BeginTransactionAsync(It.IsAny<CancellationToken>())).ReturnsAsync(() => Mock.Of<IDbContextTransaction>());\n            var databaseFacade = databaseFacadeMock.Object;\n\n            dbContextMock.Setup(m => m.Database).Returns(() => databaseFacade);\n\n            return mockedDbContext;\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq/Helpers/NoSetUpDefaultValueProvider.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading;\nusing EntityFrameworkCore.Testing.Common;\nusing EntityFrameworkCore.Testing.Moq.Extensions;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.Extensions.Logging;\nusing Moq;\nusing rgvlee.Core.Common.Extensions;\nusing rgvlee.Core.Common.Helpers;\nusing ProjectExpressionHelper = EntityFrameworkCore.Testing.Common.Helpers.ExpressionHelper;\n\nnamespace EntityFrameworkCore.Testing.Moq.Helpers\n{\n    internal class NoSetUpDefaultValueProvider<TDbContext> : DefaultValueProvider where TDbContext : DbContext\n    {\n        private static readonly ILogger<NoSetUpDefaultValueProvider<TDbContext>> Logger = LoggingHelper.CreateLogger<NoSetUpDefaultValueProvider<TDbContext>>();\n\n        private readonly List<IEntityType> _allModelEntityTypes;\n\n        private readonly TDbContext _dbContext;\n\n        private readonly List<PropertyInfo> _dbContextModelProperties;\n\n        public NoSetUpDefaultValueProvider(TDbContext dbContext)\n        {\n            _dbContext = dbContext;\n            _allModelEntityTypes = _dbContext.Model.GetEntityTypes().ToList();\n            _dbContextModelProperties = _dbContext.GetType()\n                .GetProperties()\n                .Where(x => x.PropertyType.IsGenericType && x.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>))\n                .ToList();\n        }\n\n        protected override object GetDefaultValue(Type type, Mock mock)\n        {\n            var dbContextMock = mock;\n            var lastInvocation = mock.Invocations.Last();\n            var invokedMethod = lastInvocation.Method;\n            var arguments = lastInvocation.Arguments;\n\n            var modelType = GetModelType(invokedMethod);\n            if (modelType == null)\n            {\n                return invokedMethod.ReturnType.GetDefaultValue();\n            }\n\n            Logger.LogDebug(\"Setting up model '{type}'\", modelType);\n\n            var modelEntityType = _allModelEntityTypes.SingleOrDefault(x => x.ClrType.Equals(modelType));\n            if (modelEntityType == null)\n            {\n                throw new InvalidOperationException(string.Format(ExceptionMessages.CannotCreateDbSetTypeNotIncludedInModel,\n                    invokedMethod.GetGenericArguments().Single().Name));\n            }\n\n            var setUpModelMethod = typeof(NoSetUpDefaultValueProvider<TDbContext>).GetMethods(BindingFlags.Instance | BindingFlags.NonPublic)\n                .Single(x => x.Name.Equals(modelEntityType.FindPrimaryKey() != null ? \"SetUpModel\" : \"SetUpReadOnlyModel\"));\n\n            setUpModelMethod.MakeGenericMethod(modelType).Invoke(this, new[] { dbContextMock });\n\n            return invokedMethod.Invoke(dbContextMock.Object, arguments?.ToArray());\n        }\n\n        private Type GetModelType(MethodInfo invokedMethod)\n        {\n            var dbContextModelProperty = _dbContextModelProperties.SingleOrDefault(x => x.GetMethod.Name.Equals(invokedMethod.Name));\n            if (dbContextModelProperty != null)\n            {\n                return dbContextModelProperty.PropertyType.GetGenericArguments().Single();\n            }\n\n            if (!invokedMethod.IsGenericMethod)\n            {\n                return null;\n            }\n\n            var dbContextMethod = typeof(DbContext).GetMethods(BindingFlags.Instance | BindingFlags.Public)\n                .SingleOrDefault(x => x.IsGenericMethod && x.GetGenericMethodDefinition().Equals(invokedMethod.GetGenericMethodDefinition()));\n\n            if (dbContextMethod != null)\n            {\n                return invokedMethod.GetGenericArguments().Single();\n            }\n\n            return null;\n        }\n\n        private void SetUpModel<TEntity>(Mock<TDbContext> dbContextMock) where TEntity : class\n        {\n            var mockedDbSet = _dbContext.Set<TEntity>().CreateMockedDbSet();\n\n            var property = typeof(TDbContext).GetProperties().SingleOrDefault(p => p.PropertyType == typeof(DbSet<TEntity>));\n\n            if (property != null)\n            {\n                var propertyExpression = ProjectExpressionHelper.CreatePropertyExpression<TDbContext, DbSet<TEntity>>(property);\n                dbContextMock.Setup(propertyExpression).Returns(() => mockedDbSet);\n            }\n            else\n            {\n                Logger.LogDebug(\"Could not find a DbContext property for type '{type}'\", typeof(TEntity));\n            }\n\n            dbContextMock.Setup(m => m.Set<TEntity>()).Returns(() => mockedDbSet);\n\n            dbContextMock.Setup(m => m.Add(It.IsAny<TEntity>())).Returns((TEntity providedEntity) => _dbContext.Add(providedEntity));\n            dbContextMock.Setup(m => m.AddAsync(It.IsAny<TEntity>(), It.IsAny<CancellationToken>()))\n                .Returns((TEntity providedEntity, CancellationToken providedCancellationToken) => _dbContext.AddAsync(providedEntity, providedCancellationToken));\n\n            dbContextMock.Setup(m => m.Attach(It.IsAny<TEntity>())).Returns((TEntity providedEntity) => _dbContext.Attach(providedEntity));\n\n            dbContextMock.Setup(m => m.Entry(It.IsAny<TEntity>())).Returns((TEntity providedEntity) => _dbContext.Entry(providedEntity));\n\n            dbContextMock.Setup(m => m.Find<TEntity>(It.IsAny<object[]>())).Returns((object[] providedKeyValues) => _dbContext.Find<TEntity>(providedKeyValues));\n\n            dbContextMock.Setup(m => m.FindAsync<TEntity>(It.IsAny<object[]>())).Returns((object[] providedKeyValues) => _dbContext.FindAsync<TEntity>(providedKeyValues));\n            dbContextMock.Setup(m => m.FindAsync<TEntity>(It.IsAny<object[]>(), It.IsAny<CancellationToken>()))\n                .Returns((object[] providedKeyValues, CancellationToken providedCancellationToken) => _dbContext.FindAsync<TEntity>(providedKeyValues, providedCancellationToken));\n\n            dbContextMock.Setup(m => m.Remove(It.IsAny<TEntity>())).Returns((TEntity providedEntity) => _dbContext.Remove(providedEntity));\n\n            dbContextMock.Setup(m => m.Update(It.IsAny<TEntity>())).Returns((TEntity providedEntity) => _dbContext.Update(providedEntity));\n        }\n\n        private void SetUpReadOnlyModel<TEntity>(Mock<TDbContext> dbContextMock) where TEntity : class\n        {\n            var mockedReadOnlyDbSet = _dbContext.Set<TEntity>().CreateMockedReadOnlyDbSet();\n\n            var property = typeof(TDbContext).GetProperties().SingleOrDefault(p => p.PropertyType == typeof(DbSet<TEntity>));\n            if (property != null)\n            {\n                var propertyExpression = ProjectExpressionHelper.CreatePropertyExpression<TDbContext, DbSet<TEntity>>(property);\n                dbContextMock.Setup(propertyExpression).Returns(() => mockedReadOnlyDbSet);\n            }\n            else\n            {\n                Logger.LogDebug(\"Could not find a DbContext property for type '{type}'\", typeof(TEntity));\n            }\n\n            dbContextMock.Setup(m => m.Set<TEntity>()).Returns(() => mockedReadOnlyDbSet);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/BaseForDbContextTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EntityFrameworkCore.Testing.Moq.Extensions;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public abstract class BaseForDbContextTests<T> : Common.Tests.BaseForDbContextTests<T> where T : DbContext\n    {\n        public override void AddExecuteSqlInterpolatedResult(T mockedDbContext, int expectedResult)\n        {\n            mockedDbContext.AddExecuteSqlInterpolatedResult(expectedResult);\n        }\n\n        public override void AddExecuteSqlInterpolatedResult(T mockedDbContext, FormattableString sql, int expectedResult)\n        {\n            mockedDbContext.AddExecuteSqlInterpolatedResult(sql, expectedResult);\n        }\n\n        public override void AddExecuteSqlInterpolatedResult(T mockedDbContext, string sql, IEnumerable<object> parameters, int expectedResult)\n        {\n            mockedDbContext.AddExecuteSqlInterpolatedResult(sql, parameters, expectedResult);\n        }\n\n        public override void AddExecuteSqlRawResult(T mockedDbContext, int expectedResult)\n        {\n            mockedDbContext.AddExecuteSqlRawResult(expectedResult);\n        }\n\n        public override void AddExecuteSqlRawResult(T mockedDbContext, string sql, int expectedResult)\n        {\n            mockedDbContext.AddExecuteSqlRawResult(sql, expectedResult);\n        }\n\n        public override void AddExecuteSqlRawResult(T mockedDbContext, string sql, IEnumerable<object> parameters, int expectedResult)\n        {\n            mockedDbContext.AddExecuteSqlRawResult(sql, parameters, expectedResult);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/BaseForDbQueryTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing EntityFrameworkCore.Testing.Moq.Extensions;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public abstract class BaseForDbQueryTests<T> : BaseForReadOnlyDbSetTests<T> where T : BaseTestEntity\n    {\n        protected TestDbContext MockedDbContext;\n\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            MockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n        }\n\n        protected override void AddFromSqlRawResult(DbSet<T> mockedDbSet, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlRawResult(expectedResult);\n        }\n\n        protected override void AddFromSqlRawResult(DbSet<T> mockedDbSet, string sql, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlRawResult(sql, expectedResult);\n        }\n\n        protected override void AddFromSqlRawResult(DbSet<T> mockedDbSet, string sql, IEnumerable<object> parameters, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlRawResult(sql, parameters, expectedResult);\n        }\n\n        protected override void AddFromSqlInterpolatedResult(DbSet<T> mockedDbSet, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlInterpolatedResult(expectedResult);\n        }\n\n        protected override void AddFromSqlInterpolatedResult(DbSet<T> mockedDbSet, FormattableString sql, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlInterpolatedResult(sql, expectedResult);\n        }\n\n        protected override void AddFromSqlInterpolatedResult(DbSet<T> mockedDbSet, string sql, IEnumerable<object> parameters, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlInterpolatedResult(sql, parameters, expectedResult);\n        }\n\n        protected override void AddToReadOnlySource(DbSet<T> mockedDbQuery, T item)\n        {\n            mockedDbQuery.AddToReadOnlySource(item);\n        }\n\n        protected override void AddRangeToReadOnlySource(DbSet<T> mockedDbQuery, IEnumerable<T> items)\n        {\n            mockedDbQuery.AddRangeToReadOnlySource(items);\n        }\n\n        protected override void ClearReadOnlySource(DbSet<T> mockedDbQuery)\n        {\n            mockedDbQuery.ClearReadOnlySource();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/BaseForDbSetTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing EntityFrameworkCore.Testing.Moq.Extensions;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public abstract class BaseForDbSetTests<T> : BaseForDbSetTests<TestDbContext, T> where T : BaseTestEntity\n    {\n        protected override TestDbContext CreateMockedDbContext()\n        {\n            return Create.MockedDbContextFor<TestDbContext>();\n        }\n\n        protected override void AddFromSqlRawResult(DbSet<T> mockedDbSet, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlRawResult(expectedResult);\n        }\n\n        protected override void AddFromSqlRawResult(DbSet<T> mockedDbSet, string sql, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlRawResult(sql, expectedResult);\n        }\n\n        protected override void AddFromSqlRawResult(DbSet<T> mockedDbSet, string sql, IEnumerable<object> parameters, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlRawResult(sql, parameters, expectedResult);\n        }\n\n        protected override void AddFromSqlInterpolatedResult(DbSet<T> mockedDbSet, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlInterpolatedResult(expectedResult);\n        }\n\n        protected override void AddFromSqlInterpolatedResult(DbSet<T> mockedDbSet, FormattableString sql, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlInterpolatedResult(sql, expectedResult);\n        }\n\n        protected override void AddFromSqlInterpolatedResult(DbSet<T> mockedDbSet, string sql, IEnumerable<object> parameters, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlInterpolatedResult(sql, parameters, expectedResult);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/ByPropertyDbSetTests.cs",
    "content": "﻿using System.Linq;\nusing EntityFrameworkCore.Testing.Common.Tests;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class ByPropertyDbSetTests : BaseForDbSetTests<TestEntity>\n    {\n        protected override IQueryable<TestEntity> Queryable => MockedDbContext.TestEntities;\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/ByPropertyReadOnlyDbSetExceptionTests.cs",
    "content": "﻿using EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class ByPropertyReadOnlyDbSetExceptionTests : ReadOnlyDbSetExceptionTests<TestReadOnlyEntity>\n    {\n        protected TestDbContext MockedDbContext;\n\n        protected override DbSet<TestReadOnlyEntity> DbSet => MockedDbContext.TestReadOnlyEntities;\n\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            MockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/ByPropertyReadOnlyDbSetTests.cs",
    "content": "﻿using System.Linq;\nusing EntityFrameworkCore.Testing.Common.Tests;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class ByPropertyReadOnlyDbSetTests : BaseForDbQueryTests<TestReadOnlyEntity>\n    {\n        protected override IQueryable<TestReadOnlyEntity> Queryable => MockedDbContext.Set<TestReadOnlyEntity>();\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/ByTypeDbSetTests.cs",
    "content": "﻿using System.Linq;\nusing System.Linq.Expressions;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Moq;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class ByTypeDbSetTests : BaseForDbSetTests<TestEntity>\n    {\n        protected override IQueryable<TestEntity> Queryable => MockedDbContext.Set<TestEntity>();\n\n        [Test(Description = \"This test ensures that method invoked via CallBase = true are verifiable\")]\n        public override void Select_ReturnsSequence()\n        {\n            base.Select_ReturnsSequence();\n\n            var queryProviderMock = Mock.Get(Queryable.Provider);\n\n            queryProviderMock.Verify(m => m.CreateQuery<TestEntity>(It.IsAny<Expression>()), Times.Exactly(2));\n\n            queryProviderMock.Verify(m => m.CreateQuery<TestEntity>(It.Is<MethodCallExpression>(mce => mce.Method.Name.Equals(nameof(System.Linq.Queryable.Select)))),\n                Times.Exactly(2));\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/ByTypeReadOnlyDbSetExceptionTests.cs",
    "content": "﻿using EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class ByTypeReadOnlyDbSetExceptionTests : ReadOnlyDbSetExceptionTests<TestReadOnlyEntity>\n    {\n        protected TestDbContext MockedDbContext;\n\n        protected override DbSet<TestReadOnlyEntity> DbSet => MockedDbContext.Set<TestReadOnlyEntity>();\n\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            MockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/ByTypeReadOnlyDbSetTests.cs",
    "content": "﻿using System.Linq;\nusing EntityFrameworkCore.Testing.Common.Tests;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class ByTypeReadOnlyDbSetTests : BaseForDbQueryTests<TestReadOnlyEntity>\n    {\n        protected override IQueryable<TestReadOnlyEntity> Queryable => MockedDbContext.Set<TestReadOnlyEntity>();\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/CreateFactoryTests.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing Castle.DynamicProxy;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class CreateFactoryTests : BaseForTests\n    {\n        [Test]\n        public void CreateMockedDbContextFor_Type_CreatesMockedDbContext()\n        {\n            var mocked = Create.MockedDbContextFor<TestDbContext>();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(mocked, Is.Not.Null);\n                Assert.That(ProxyUtil.IsProxy(mocked), Is.True);\n            });\n        }\n\n        [Test]\n        public void CreateMockedQueryProviderFor_Queryable_CreatesMockedQueryProvider()\n        {\n            var dbContextToMock = new TestDbContext(new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options);\n\n            var mocked = Create.MockedQueryProviderFor(dbContextToMock.TestEntities);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(mocked, Is.Not.Null);\n                Assert.That(ProxyUtil.IsProxy(mocked), Is.True);\n            });\n        }\n\n        [Test]\n        public void CreateMockedQueryProviderFor_NullQueryable_ThrowsException()\n        {\n            Assert.Throws<ArgumentNullException>(() =>\n            {\n                var mocked = Create.MockedQueryProviderFor((IQueryable<TestEntity>) null);\n            });\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/DbContextTestsUsingConstructorParameters.cs",
    "content": "﻿using System;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class DbContextTestsUsingConstructorParameters : BaseForDbContextTests<TestDbContext>\n    {\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            MockedDbContext = Create.MockedDbContextFor<TestDbContext>(new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/DbContextTestsUsingType.cs",
    "content": "﻿using EntityFrameworkCore.Testing.Common.Tests;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class DbContextTestsUsingType : BaseForDbContextTests<TestDbContext>\n    {\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            MockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/EntityFrameworkCore.Testing.Moq.Tests.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Debug' \">\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Release' \">\n    <DebugSymbols>true</DebugSymbols>\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"coverlet.msbuild\" Version=\"6.0.4\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"18.0.1\" />\n    <PackageReference Include=\"NUnit\" Version=\"4.4.0\" />\n    <PackageReference Include=\"NUnit3TestAdapter\" Version=\"5.2.0\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\EntityFrameworkCore.Testing.Common.Tests\\EntityFrameworkCore.Testing.Common.Tests.csproj\" />\n    <ProjectReference Include=\"..\\EntityFrameworkCore.Testing.Moq\\EntityFrameworkCore.Testing.Moq.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/Issue114Tests.cs",
    "content": "﻿namespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class Issue114Tests : Common.Tests.Issue114Tests\n    {\n        protected override TestDbContext MockedDbContextFactory()\n        {\n            return Create.MockedDbContextFor<TestDbContext>();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/Issue117Tests.cs",
    "content": "﻿namespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class Issue117Tests : Common.Tests.Issue117Tests\n    {\n        protected override TestDbContext MockedDbContextFactory()\n        {\n            return Create.MockedDbContextFor<TestDbContext>();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/Issue126Tests.cs",
    "content": "﻿using System;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class Issue126Tests : Issue126Tests<TestDbContext>\n    {\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            var options = new DbContextOptionsBuilder<TestDbContext>()\n                .UseInMemoryDatabase(Guid.NewGuid().ToString())\n                .Options;\n\n            DbContextFactory = () => Create.MockedDbContextFor<TestDbContext>(options);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/Issue1Tests.cs",
    "content": "﻿using System;\nusing System.Data;\nusing Microsoft.Data.SqlClient;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing AutoFixture;\nusing Castle.DynamicProxy;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing EntityFrameworkCore.Testing.Moq.Extensions;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class Issue1Tests : BaseForTests\n    {\n        [Test]\n        public void CreateMockedDbContextFor_ParametersForSpecificConstructor_CreatesSubstitute()\n        {\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>(new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString())\n                .EnableSensitiveDataLogging()\n                .Options);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(mockedDbContext, Is.Not.Null);\n                Assert.That(ProxyUtil.IsProxy(mockedDbContext), Is.True);\n            });\n        }\n\n        [Test]\n        public async Task ExecuteSqlRawAsync_SpecifiedSqlAndSqlParameter_ReturnsExpectedResultAndSetsOutputParameterValue()\n        {\n            var expectedResult = Fixture.Create<string>();\n\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n            mockedDbContext.AddExecuteSqlRawResult(-1,\n                (sql, parameters) =>\n                {\n                    ((SqlParameter) parameters.ElementAt(0)).Value = expectedResult;\n                });\n\n            var outputParameter = new SqlParameter(\"OutputParameter\", SqlDbType.NVarChar, 255) { Direction = ParameterDirection.Output };\n            var result = await mockedDbContext.Database.ExecuteSqlRawAsync(@\"EXEC [StoredProcedureWithOutputParameter] @OutputParameter = @Result OUTPUT\", outputParameter);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(result, Is.EqualTo(-1));\n                Assert.That(outputParameter.Value.ToString(), Is.EqualTo(expectedResult));\n            });\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/Issue49Tests.cs",
    "content": "﻿using EntityFrameworkCore.Testing.Common.Tests;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class Issue49Tests : Issue49Tests<TestDbContext, TestEntity>\n    {\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            DbContext = Create.MockedDbContextFor<TestDbContext>();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/Issue4Tests.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing AutoFixture;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Query;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class Issue4Tests : BaseForTests\n    {\n        [Test]\n        public void AsQueryable_Set_ReturnsIQueryableOfTWithMockedQueryProvider()\n        {\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n\n            var mockedSetAsQueryable = mockedDbContext.TestEntities.AsQueryable();\n\n            var asyncProvider = mockedSetAsQueryable.Provider as IAsyncQueryProvider;\n            Assert.That(asyncProvider, Is.Not.Null);\n        }\n\n        [Test]\n        public async Task AsQueryableThenWhereThenSingleOrDefaultAsync_WhereOperationReturnsFalse_ReturnsDefault()\n        {\n            var entities = Fixture.CreateMany<TestEntity>().ToList();\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n            var mockedSet = mockedDbContext.TestEntities;\n            mockedSet.AddRange(entities);\n            mockedDbContext.SaveChanges();\n\n            var result = await mockedSet.AsQueryable().Where(x => x.Id.Equals(Guid.NewGuid())).SingleOrDefaultAsync();\n\n            Assert.That(result, Is.Null);\n        }\n\n        [Test]\n        public async Task AsQueryableThenWhereThenSingleOrDefaultAsync_WhereOperationReturnsTrue_ReturnsSingleEntity()\n        {\n            var entities = Fixture.CreateMany<TestEntity>().ToList();\n            var entityToFind = entities.ElementAt(1);\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n            var mockedSet = mockedDbContext.TestEntities;\n            mockedSet.AddRange(entities);\n            mockedDbContext.SaveChanges();\n\n            var result = await mockedSet.AsQueryable().Where(x => x.Id.Equals(entityToFind.Id)).SingleOrDefaultAsync();\n\n            Assert.That(result, Is.EqualTo(entityToFind));\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/Issue6Tests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing AutoFixture;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing EntityFrameworkCore.Testing.Moq.Extensions;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class Issue6Tests : BaseForTests\n    {\n        private static IEnumerable<TestCaseData> FromSqlInterpolated_SpecifiedSqlWithNullParameters_TestCases {\n            get\n            {\n                yield return new TestCaseData(null, null);\n                yield return new TestCaseData(null, 1);\n                yield return new TestCaseData(DateTime.Parse(\"21 May 2020 9:05 PM\"), null);\n            }\n        }\n\n        [TestCaseSource(nameof(FromSqlInterpolated_SpecifiedSqlWithNullParameters_TestCases))]\n        public void FromSqlInterpolated_SpecifiedSqlWithNullParameters_ReturnsExpectedResult(DateTime? dateTimeValue, int? intValue)\n        {\n            var expectedResult = new List<TestEntity> { Fixture.Create<TestEntity>() };\n\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n            mockedDbContext.Set<TestEntity>().AddFromSqlInterpolatedResult($\"SELECT * FROM [SqlFunctionWithNullableParameters]({dateTimeValue}, {intValue})\", expectedResult);\n\n            var actualResult = mockedDbContext.Set<TestEntity>().FromSqlInterpolated($\"SELECT * FROM [SqlFunctionWithNullableParameters]({dateTimeValue}, {intValue})\");\n\n            Assert.That(actualResult, Is.EqualTo(expectedResult));\n        }\n\n        [Test]\n        public void FromSqlInterpolated_SpecifiedSqlWithDbNullParameters_ReturnsExpectedResult()\n        {\n            var expectedResult = new List<TestEntity> { Fixture.Create<TestEntity>() };\n\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n            mockedDbContext.Set<TestEntity>().AddFromSqlInterpolatedResult($\"SELECT * FROM [SqlFunctionWithNullableParameters]({DBNull.Value}, {DBNull.Value})\", expectedResult);\n\n            var actualResult = mockedDbContext.Set<TestEntity>().FromSqlInterpolated($\"SELECT * FROM [SqlFunctionWithNullableParameters]({DBNull.Value}, {DBNull.Value})\");\n\n            Assert.That(actualResult, Is.EqualTo(expectedResult));\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.Moq.Tests/Issue88Tests.cs",
    "content": "﻿using System;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.Moq.Tests\n{\n    public class Issue88Tests : Issue88Tests<TestDbContext, TestEntity>\n    {\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            var options = new DbContextOptionsBuilder<TestDbContext>()\n                .UseInMemoryDatabase(Guid.NewGuid().ToString())\n                .Options;\n\n            DbContextFactory = () => Create.MockedDbContextFor<TestDbContext>(options);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute/Create.cs",
    "content": "using System.Linq;\nusing EntityFrameworkCore.Testing.NSubstitute.Extensions;\nusing EntityFrameworkCore.Testing.NSubstitute.Helpers;\nusing Microsoft.EntityFrameworkCore;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute\n{\n    /// <summary>\n    ///     Factory for creating mocked instances.\n    /// </summary>\n    public static class Create\n    {\n        /// <summary>\n        ///     Creates a mocked db context.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"constructorParameters\">\n        ///     The parameters that will be used to create the mocked db context and, if one is not provided,\n        ///     the in-memory context that the mocked db context will use for in-memory provider supported operations.\n        /// </param>\n        /// <returns>A mocked db context.</returns>\n        /// <remarks>\n        ///     If you do not provide any constructor arguments this method attempt to create a TDbContext\n        ///     via a constructor with a single DbContextOptionsBuilder parameter or a parameterless constructor.\n        /// </remarks>\n        public static TDbContext MockedDbContextFor<TDbContext>(params object[] constructorParameters) where TDbContext : DbContext\n        {\n            return constructorParameters != null && constructorParameters.Any()\n                ? new MockedDbContextBuilder<TDbContext>().UseConstructorWithParameters(constructorParameters).MockedDbContext\n                : new MockedDbContextBuilder<TDbContext>().MockedDbContext;\n        }\n\n        /// <summary>\n        ///     Creates a mocked query provider.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable type.</typeparam>\n        /// <param name=\"queryable\">The query provider source.</param>\n        /// <returns>A mocked query provider.</returns>\n        public static IQueryProvider MockedQueryProviderFor<T>(IQueryable<T> queryable) where T : class\n        {\n            EnsureArgument.IsNotNull(queryable, nameof(queryable));\n\n            return queryable.Provider.CreateMockedQueryProvider(queryable);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute/EntityFrameworkCore.Testing.NSubstitute.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n    <Authors>rgvlee</Authors>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <DocumentationFile>EntityFrameworkCore.Testing.NSubstitute.xml</DocumentationFile>\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <DocumentationFile>EntityFrameworkCore.Testing.NSubstitute.xml</DocumentationFile>\n    <DebugSymbols>true</DebugSymbols>\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"NSubstitute\" Version=\"4.1.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\EntityFrameworkCore.Testing.Common\\EntityFrameworkCore.Testing.Common.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute/EntityFrameworkCore.Testing.NSubstitute.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>EntityFrameworkCore.Testing.NSubstitute</name>\n    </assembly>\n    <members>\n        <member name=\"T:EntityFrameworkCore.Testing.NSubstitute.Create\">\n            <summary>\n                Factory for creating mocked instances.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Create.MockedDbContextFor``1(System.Object[])\">\n            <summary>\n                Creates a mocked db context.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"constructorParameters\">\n                The parameters that will be used to create the mocked db context and, if one is not provided,\n                the in-memory context that the mocked db context will use for in-memory provider supported operations.\n            </param>\n            <returns>A mocked db context.</returns>\n            <remarks>\n                If you do not provide any constructor arguments this method attempt to create a TDbContext\n                via a constructor with a single DbContextOptionsBuilder parameter or a parameterless constructor.\n            </remarks>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Create.MockedQueryProviderFor``1(System.Linq.IQueryable{``0})\">\n            <summary>\n                Creates a mocked query provider.\n            </summary>\n            <typeparam name=\"T\">The queryable type.</typeparam>\n            <param name=\"queryable\">The query provider source.</param>\n            <returns>A mocked query provider.</returns>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.NSubstitute.Extensions.DbContextExtensions\">\n            <summary>\n                Extensions for db contexts.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.DbContextExtensions.AddExecuteSqlInterpolatedResult``1(``0,System.Int32,System.Action{System.String,System.Collections.Generic.IEnumerable{System.Object}})\">\n            <summary>\n                Sets up ExecuteSqlInterpolated invocations to return a specified result.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"mockedDbContext\">The mocked db context.</param>\n            <param name=\"executeSqlInterpolatedResult\">The integer to return when ExecuteSqlInterpolated is invoked.</param>\n            <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n            <returns>The mocked db context.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.DbContextExtensions.AddExecuteSqlInterpolatedResult``1(``0,System.FormattableString,System.Int32,System.Action{System.String,System.Collections.Generic.IEnumerable{System.Object}})\">\n            <summary>\n                Sets up ExecuteSqlInterpolated invocations containing a specified sql string to return a specified result.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"mockedDbContext\">The mocked db context.</param>\n            <param name=\"sql\">The ExecuteSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"executeSqlInterpolatedResult\">The integer to return when ExecuteSqlInterpolated is invoked.</param>\n            <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n            <returns>The mocked db context.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.DbContextExtensions.AddExecuteSqlInterpolatedResult``1(``0,System.String,System.Collections.Generic.IEnumerable{System.Object},System.Int32,System.Action{System.String,System.Collections.Generic.IEnumerable{System.Object}})\">\n            <summary>\n                Sets up ExecuteSqlInterpolated invocations containing a specified sql string to return a specified result.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"mockedDbContext\">The mocked db context.</param>\n            <param name=\"sql\">The ExecuteSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"parameters\">The ExecuteSqlInterpolated parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n            <param name=\"executeSqlInterpolatedResult\">The integer to return when ExecuteSqlInterpolated is invoked.</param>\n            <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n            <returns>The mocked db context.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.DbContextExtensions.AddExecuteSqlRawResult``1(``0,System.Int32,System.Action{System.String,System.Collections.Generic.IEnumerable{System.Object}})\">\n            <summary>\n                Sets up ExecuteSqlRaw invocations to return a specified result.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"mockedDbContext\">The mocked db context.</param>\n            <param name=\"executeSqlRawResult\">The integer to return when ExecuteSqlRaw is invoked.</param>\n            <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n            <returns>The mocked db context.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.DbContextExtensions.AddExecuteSqlRawResult``1(``0,System.String,System.Int32,System.Action{System.String,System.Collections.Generic.IEnumerable{System.Object}})\">\n            <summary>\n                Sets up ExecuteSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"mockedDbContext\">The mocked db context.</param>\n            <param name=\"sql\">The ExecuteSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"executeSqlRawResult\">The integer to return when ExecuteSqlRaw is invoked.</param>\n            <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n            <returns>The mocked db context.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.DbContextExtensions.AddExecuteSqlRawResult``1(``0,System.String,System.Collections.Generic.IEnumerable{System.Object},System.Int32,System.Action{System.String,System.Collections.Generic.IEnumerable{System.Object}})\">\n            <summary>\n                Sets up ExecuteSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n            <param name=\"mockedDbContext\">The mocked db context.</param>\n            <param name=\"sql\">The ExecuteSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"parameters\">The ExecuteSqlRaw parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n            <param name=\"executeSqlRawResult\">The integer to return when ExecuteSqlRaw is invoked.</param>\n            <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n            <returns>The mocked db context.</returns>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.NSubstitute.Extensions.DbSetExtensions\">\n            <summary>\n                Extensions for db sets.\n            </summary>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryableExtensions\">\n            <summary>\n                Extensions for queryable collections.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryableExtensions.AddFromSqlInterpolatedResult``1(System.Linq.IQueryable{``0},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlInterpolated invocations to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryable\">The mocked queryable.</param>\n            <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryableExtensions.AddFromSqlInterpolatedResult``1(System.Linq.IQueryable{``0},System.FormattableString,System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlInterpolated invocations to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryable\">The mocked queryable.</param>\n            <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryableExtensions.AddFromSqlInterpolatedResult``1(System.Linq.IQueryable{``0},System.String,System.Collections.Generic.IEnumerable{System.Object},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlInterpolated invocations to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryable\">The mocked queryable.</param>\n            <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"parameters\">The FromSqlInterpolated parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n            <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryableExtensions.AddFromSqlRawResult``1(System.Linq.IQueryable{``0},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlRaw invocations to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryable\">The mocked queryable.</param>\n            <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryableExtensions.AddFromSqlRawResult``1(System.Linq.IQueryable{``0},System.String,System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlRaw invocations containing a specified sql string to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryable\">The mocked queryable.</param>\n            <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryableExtensions.AddFromSqlRawResult``1(System.Linq.IQueryable{``0},System.String,System.Collections.Generic.IEnumerable{System.Object},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryable\">The mocked queryable.</param>\n            <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"parameters\">The FromSqlRaw parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n            <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryProviderExtensions\">\n            <summary>\n                Extensions for collection query providers.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryProviderExtensions.AddFromSqlInterpolatedResult``1(System.Linq.IQueryProvider,System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlInterpolated invocations to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n            <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryProviderExtensions.AddFromSqlInterpolatedResult``1(System.Linq.IQueryProvider,System.FormattableString,System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlInterpolated invocations containing a specified sql string to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n            <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryProviderExtensions.AddFromSqlInterpolatedResult``1(System.Linq.IQueryProvider,System.String,System.Collections.Generic.IEnumerable{System.Object},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlInterpolated invocations containing a specified sql string and parameters to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n            <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"parameters\">The FromSqlInterpolated parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n            <param name=\"fromSqlInterpolatedResult\">The sequence to return when FromSqlInterpolated is invoked.</param>\n            <returns>The mocked query provider.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryProviderExtensions.AddFromSqlRawResult``1(System.Linq.IQueryProvider,System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlRaw invocations to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n            <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryProviderExtensions.AddFromSqlRawResult``1(System.Linq.IQueryProvider,System.String,System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlRaw invocations containing a specified sql string to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n            <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n            <returns>The mocked queryable.</returns>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.QueryProviderExtensions.AddFromSqlRawResult``1(System.Linq.IQueryProvider,System.String,System.Collections.Generic.IEnumerable{System.Object},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Sets up FromSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n            </summary>\n            <typeparam name=\"T\">The queryable source type.</typeparam>\n            <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n            <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n            <param name=\"parameters\">The FromSqlRaw parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n            <param name=\"fromSqlResult\">The sequence to return when FromSqlRaw is invoked.</param>\n            <returns>The mocked query provider.</returns>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.NSubstitute.Extensions.ReadOnlyDbSetExtensions\">\n            <summary>\n                Extensions for read-only db sets.\n            </summary>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.ReadOnlyDbSetExtensions.AddToReadOnlySource``1(Microsoft.EntityFrameworkCore.DbSet{``0},``0)\">\n            <summary>\n                Adds an item to the end of the mocked readonly db set source.\n            </summary>\n            <typeparam name=\"TEntity\">The entity type.</typeparam>\n            <param name=\"mockedReadOnlyDbSet\">The mocked readonly db set.</param>\n            <param name=\"item\">The item to be added to the end of the mocked readonly db set source.</param>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.ReadOnlyDbSetExtensions.AddRangeToReadOnlySource``1(Microsoft.EntityFrameworkCore.DbSet{``0},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n                Adds the items of the specified sequence to the end of the mocked readonly db set source.\n            </summary>\n            <typeparam name=\"TEntity\">The entity type.</typeparam>\n            <param name=\"mockedReadOnlyDbSet\">The mocked readonly db set.</param>\n            <param name=\"items\">The sequence whose items should be added to the end of the mocked readonly db set source.</param>\n        </member>\n        <member name=\"M:EntityFrameworkCore.Testing.NSubstitute.Extensions.ReadOnlyDbSetExtensions.ClearReadOnlySource``1(Microsoft.EntityFrameworkCore.DbSet{``0})\">\n            <summary>\n                Removes all items from the mocked readonly db set source.\n            </summary>\n            <typeparam name=\"TEntity\">The entity type.</typeparam>\n            <param name=\"mockedReadOnlyDbSet\">The mocked readonly db set.</param>\n        </member>\n        <member name=\"T:EntityFrameworkCore.Testing.NSubstitute.Helpers.MockedDbContextBuilder`1\">\n            <summary>\n                The mocked db context builder.\n            </summary>\n            <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        </member>\n        <member name=\"P:EntityFrameworkCore.Testing.NSubstitute.Helpers.MockedDbContextBuilder`1.MockedDbContext\">\n            <summary>\n                Creates the mocked db context.\n            </summary>\n            <returns>A mocked db context.</returns>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute/Extensions/DbContextExtensions.cs",
    "content": "﻿#pragma warning disable EF1001 // Internal EF Core API usage.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing EntityFrameworkCore.Testing.Common.Helpers;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.EntityFrameworkCore.Storage;\nusing Microsoft.Extensions.Logging;\nusing NSubstitute;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Extensions\n{\n    /// <summary>\n    ///     Extensions for db contexts.\n    /// </summary>\n    public static class DbContextExtensions\n    {\n        private static readonly ILogger Logger = LoggingHelper.CreateLogger(typeof(DbContextExtensions));\n\n        /// <summary>\n        ///     Sets up ExecuteSqlInterpolated invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"mockedDbContext\">The mocked db context.</param>\n        /// <param name=\"executeSqlInterpolatedResult\">The integer to return when ExecuteSqlInterpolated is invoked.</param>\n        /// <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n        /// <returns>The mocked db context.</returns>\n        public static TDbContext AddExecuteSqlInterpolatedResult<TDbContext>(\n            this TDbContext mockedDbContext, int executeSqlInterpolatedResult, Action<string, IEnumerable<object>> callback = null) where TDbContext : DbContext\n        {\n            EnsureArgument.IsNotNull(mockedDbContext, nameof(mockedDbContext));\n            return mockedDbContext.AddExecuteSqlRawResult(string.Empty, new List<object>(), executeSqlInterpolatedResult, callback);\n        }\n\n        /// <summary>\n        ///     Sets up ExecuteSqlInterpolated invocations containing a specified sql string to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"mockedDbContext\">The mocked db context.</param>\n        /// <param name=\"sql\">The ExecuteSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"executeSqlInterpolatedResult\">The integer to return when ExecuteSqlInterpolated is invoked.</param>\n        /// <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n        /// <returns>The mocked db context.</returns>\n        public static TDbContext AddExecuteSqlInterpolatedResult<TDbContext>(\n            this TDbContext mockedDbContext, FormattableString sql, int executeSqlInterpolatedResult, Action<string, IEnumerable<object>> callback = null)\n            where TDbContext : DbContext\n        {\n            EnsureArgument.IsNotNull(mockedDbContext, nameof(mockedDbContext));\n            return mockedDbContext.AddExecuteSqlRawResult(sql.Format, sql.GetArguments(), executeSqlInterpolatedResult, callback);\n        }\n\n        /// <summary>\n        ///     Sets up ExecuteSqlInterpolated invocations containing a specified sql string to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"mockedDbContext\">The mocked db context.</param>\n        /// <param name=\"sql\">The ExecuteSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"parameters\">The ExecuteSqlInterpolated parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n        /// <param name=\"executeSqlInterpolatedResult\">The integer to return when ExecuteSqlInterpolated is invoked.</param>\n        /// <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n        /// <returns>The mocked db context.</returns>\n        public static TDbContext AddExecuteSqlInterpolatedResult<TDbContext>(\n            this TDbContext mockedDbContext, string sql, IEnumerable<object> parameters, int executeSqlInterpolatedResult, Action<string, IEnumerable<object>> callback = null)\n            where TDbContext : DbContext\n        {\n            EnsureArgument.IsNotNull(mockedDbContext, nameof(mockedDbContext));\n            return mockedDbContext.AddExecuteSqlRawResult(sql, parameters, executeSqlInterpolatedResult, callback);\n        }\n\n        /// <summary>\n        ///     Sets up ExecuteSqlRaw invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"mockedDbContext\">The mocked db context.</param>\n        /// <param name=\"executeSqlRawResult\">The integer to return when ExecuteSqlRaw is invoked.</param>\n        /// <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n        /// <returns>The mocked db context.</returns>\n        public static TDbContext AddExecuteSqlRawResult<TDbContext>(this TDbContext mockedDbContext, int executeSqlRawResult, Action<string, IEnumerable<object>> callback = null)\n            where TDbContext : DbContext\n        {\n            EnsureArgument.IsNotNull(mockedDbContext, nameof(mockedDbContext));\n            return mockedDbContext.AddExecuteSqlRawResult(string.Empty, new List<object>(), executeSqlRawResult, callback);\n        }\n\n        /// <summary>\n        ///     Sets up ExecuteSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"mockedDbContext\">The mocked db context.</param>\n        /// <param name=\"sql\">The ExecuteSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"executeSqlRawResult\">The integer to return when ExecuteSqlRaw is invoked.</param>\n        /// <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n        /// <returns>The mocked db context.</returns>\n        public static TDbContext AddExecuteSqlRawResult<TDbContext>(\n            this TDbContext mockedDbContext, string sql, int executeSqlRawResult, Action<string, IEnumerable<object>> callback = null) where TDbContext : DbContext\n        {\n            EnsureArgument.IsNotNull(mockedDbContext, nameof(mockedDbContext));\n            return mockedDbContext.AddExecuteSqlRawResult(sql, new List<object>(), executeSqlRawResult, callback);\n        }\n\n        /// <summary>\n        ///     Sets up ExecuteSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n        /// <param name=\"mockedDbContext\">The mocked db context.</param>\n        /// <param name=\"sql\">The ExecuteSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"parameters\">The ExecuteSqlRaw parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n        /// <param name=\"executeSqlRawResult\">The integer to return when ExecuteSqlRaw is invoked.</param>\n        /// <param name=\"callback\">Operations to perform after ExecuteSqlCommand is invoked.</param>\n        /// <returns>The mocked db context.</returns>\n        public static TDbContext AddExecuteSqlRawResult<TDbContext>(\n            this TDbContext mockedDbContext, string sql, IEnumerable<object> parameters, int executeSqlRawResult, Action<string, IEnumerable<object>> callback = null)\n            where TDbContext : DbContext\n        {\n            EnsureArgument.IsNotNull(mockedDbContext, nameof(mockedDbContext));\n            EnsureArgument.IsNotNull(sql, nameof(sql));\n            EnsureArgument.IsNotNull(parameters, nameof(parameters));\n\n            var relationalCommand = Substitute.For<IRelationalCommand>();\n            relationalCommand.ExecuteNonQuery(Arg.Any<RelationalCommandParameterObject>()).Returns(callInfo => executeSqlRawResult);\n\n            relationalCommand.ExecuteNonQueryAsync(Arg.Any<RelationalCommandParameterObject>(), Arg.Any<CancellationToken>())\n                .Returns(callInfo => Task.FromResult(executeSqlRawResult));\n\n            var rawSqlCommand = Substitute.For<RawSqlCommand>(relationalCommand, new Dictionary<string, object>());\n            rawSqlCommand.RelationalCommand.Returns(callInfo => relationalCommand);\n            rawSqlCommand.ParameterValues.Returns(callInfo => new Dictionary<string, object>());\n\n            var existingRawSqlCommandBuilder =\n                ((IRelationalDatabaseFacadeDependencies) ((IInfrastructure<IServiceProvider>) mockedDbContext).Instance.GetService(typeof(IDatabaseFacadeDependencies)))\n                .RawSqlCommandBuilder;\n\n            existingRawSqlCommandBuilder.Build(\n                    Arg.Is<string>(s => s.Contains(sql, StringComparison.OrdinalIgnoreCase)),\n                    Arg.Is<IEnumerable<object>>(p => ParameterMatchingHelper.DoInvocationParametersMatchSetUpParameters(parameters, p)),\n                    Arg.Any<IModel>())\n                .Returns(callInfo => rawSqlCommand)\n                .AndDoes(callInfo =>\n                {\n                    var providedSql = callInfo.Arg<string>();\n                    var providedParameters = callInfo.Arg<IEnumerable<object>>();\n\n                    callback?.Invoke(providedSql, providedParameters);\n\n                    var parts = new List<string>();\n                    parts.Add($\"Invocation sql: {providedSql}\");\n                    parts.Add(\"Invocation Parameters:\");\n                    parts.Add(ParameterMatchingHelper.StringifyParameters(providedParameters));\n                    Logger.LogDebug(string.Join(Environment.NewLine, parts));\n                });\n\n            return mockedDbContext;\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute/Extensions/DbSetExtensions.Internal.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Threading;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing NSubstitute;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Extensions\n{\n    /// <summary>\n    ///     Extensions for db sets.\n    /// </summary>\n    public static class DbSetExtensions\n    {\n        internal static DbSet<TEntity> CreateMockedDbSet<TEntity>(this DbSet<TEntity> dbSet) where TEntity : class\n        {\n            EnsureArgument.IsNotNull(dbSet, nameof(dbSet));\n\n            var mockedDbSet = (DbSet<TEntity>) Substitute.For(new[] {\n                    typeof(DbSet<TEntity>),\n                    typeof(IAsyncEnumerable<TEntity>),\n                    typeof(IEnumerable),\n                    typeof(IEnumerable<TEntity>),\n                    typeof(IInfrastructure<IServiceProvider>),\n                    typeof(IListSource),\n                    typeof(IQueryable<TEntity>)\n                },\n                new object[] { });\n\n            var mockedQueryProvider = ((IQueryable<TEntity>) dbSet).Provider.CreateMockedQueryProvider(dbSet);\n\n            mockedDbSet.Add(Arg.Any<TEntity>()).Returns(callInfo => dbSet.Add(callInfo.Arg<TEntity>()));\n            mockedDbSet.AddAsync(Arg.Any<TEntity>(), Arg.Any<CancellationToken>()).Returns(callInfo => dbSet.AddAsync(callInfo.Arg<TEntity>(), callInfo.Arg<CancellationToken>()));\n            mockedDbSet.When(x => x.AddRange(Arg.Any<IEnumerable<TEntity>>())).Do(callInfo => dbSet.AddRange(callInfo.Arg<IEnumerable<TEntity>>()));\n            mockedDbSet.When(x => x.AddRange(Arg.Any<TEntity[]>())).Do(callInfo => dbSet.AddRange(callInfo.Arg<TEntity[]>()));\n            mockedDbSet.AddRangeAsync(Arg.Any<IEnumerable<TEntity>>(), Arg.Any<CancellationToken>())\n                .Returns(callInfo => dbSet.AddRangeAsync(callInfo.Arg<IEnumerable<TEntity>>(), callInfo.Arg<CancellationToken>()));\n            mockedDbSet.AddRangeAsync(Arg.Any<TEntity[]>()).Returns(callInfo => dbSet.AddRangeAsync(callInfo.Arg<TEntity[]>()));\n\n            mockedDbSet.Attach(Arg.Any<TEntity>()).Returns(callInfo => dbSet.Attach(callInfo.Arg<TEntity>()));\n            mockedDbSet.When(x => x.AttachRange(Arg.Any<IEnumerable<TEntity>>())).Do(callInfo => dbSet.AttachRange(callInfo.Arg<IEnumerable<TEntity>>()));\n            mockedDbSet.When(x => x.AttachRange(Arg.Any<TEntity[]>())).Do(callInfo => dbSet.AttachRange(callInfo.Arg<TEntity[]>()));\n\n            ((IListSource) mockedDbSet).ContainsListCollection.Returns(callInfo => ((IListSource) dbSet).ContainsListCollection);\n\n            ((IQueryable<TEntity>) mockedDbSet).ElementType.Returns(callInfo => ((IQueryable<TEntity>) dbSet).ElementType);\n            mockedDbSet.EntityType.Returns(callInfo => dbSet.EntityType);\n            ((IQueryable<TEntity>) mockedDbSet).Expression.Returns(callInfo => ((IQueryable<TEntity>) dbSet).Expression);\n\n            mockedDbSet.Find(Arg.Any<object[]>()).Returns(callInfo => dbSet.Find(callInfo.Arg<object[]>()));\n            mockedDbSet.FindAsync(Arg.Any<object[]>()).Returns(callInfo => dbSet.FindAsync(callInfo.Arg<object[]>()));\n            mockedDbSet.FindAsync(Arg.Any<object[]>(), Arg.Any<CancellationToken>())\n                .Returns(callInfo => dbSet.FindAsync(callInfo.Arg<object[]>(), callInfo.Arg<CancellationToken>()));\n\n            ((IAsyncEnumerable<TEntity>) mockedDbSet).GetAsyncEnumerator(Arg.Any<CancellationToken>())\n                .Returns(callInfo => ((IAsyncEnumerable<TEntity>) dbSet).GetAsyncEnumerator(callInfo.Arg<CancellationToken>()));\n\n            ((IEnumerable) mockedDbSet).GetEnumerator().Returns(callInfo => ((IEnumerable) dbSet).GetEnumerator());\n            ((IEnumerable<TEntity>) mockedDbSet).GetEnumerator().Returns(callInfo => ((IEnumerable<TEntity>) dbSet).GetEnumerator());\n\n            /*\n             * System.NotSupportedException : Data binding directly to a store query is not supported. Instead populate a DbSet with data,\n             * for example by calling Load on the DbSet, and then bind to local data to avoid sending a query to the database each time the\n             * databound control iterates the data. For WPF bind to 'DbSet.Local.ToObservableCollection()'. For WinForms bind to\n             * 'DbSet.Local.ToBindingList()'. For ASP.NET WebForms bind to 'DbSet.ToList()' or use Model Binding.\n             */\n            ((IListSource) mockedDbSet).GetList().Returns(callInfo => dbSet.ToList());\n\n            ((IInfrastructure<IServiceProvider>) mockedDbSet).Instance.Returns(callInfo => ((IInfrastructure<IServiceProvider>) dbSet).Instance);\n\n            mockedDbSet.Local.Returns(callInfo => dbSet.Local);\n\n            mockedDbSet.Remove(Arg.Any<TEntity>()).Returns(callInfo => dbSet.Remove(callInfo.Arg<TEntity>()));\n            mockedDbSet.When(x => x.RemoveRange(Arg.Any<IEnumerable<TEntity>>())).Do(callInfo => dbSet.RemoveRange(callInfo.Arg<IEnumerable<TEntity>>()));\n            mockedDbSet.When(x => x.RemoveRange(Arg.Any<TEntity[]>())).Do(callInfo => dbSet.RemoveRange(callInfo.Arg<TEntity[]>()));\n\n            mockedDbSet.Update(Arg.Any<TEntity>()).Returns(callInfo => dbSet.Update(callInfo.Arg<TEntity>()));\n            mockedDbSet.When(x => x.UpdateRange(Arg.Any<IEnumerable<TEntity>>())).Do(callInfo => dbSet.UpdateRange(callInfo.Arg<IEnumerable<TEntity>>()));\n            mockedDbSet.When(x => x.UpdateRange(Arg.Any<TEntity[]>())).Do(callInfo => dbSet.UpdateRange(callInfo.Arg<TEntity[]>()));\n\n            ((IQueryable<TEntity>) mockedDbSet).Provider.Returns(callInfo => mockedQueryProvider);\n\n            mockedDbSet.AsAsyncEnumerable().Returns(callInfo => dbSet.AsAsyncEnumerable());\n            mockedDbSet.AsQueryable().Returns(callInfo => dbSet);\n\n            return mockedDbSet;\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute/Extensions/QueryProviderExtensions.Internal.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EntityFrameworkCore.Testing.Common;\nusing NSubstitute;\nusing NSubstitute.Extensions;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Extensions\n{\n    public static partial class QueryProviderExtensions\n    {\n        internal static IQueryProvider CreateMockedQueryProvider<T>(this IQueryProvider queryProviderToMock, IEnumerable<T> collection) where T : class\n        {\n            EnsureArgument.IsNotNull(queryProviderToMock, nameof(queryProviderToMock));\n            EnsureArgument.IsNotNull(collection, nameof(collection));\n\n            var mockedQueryProvider = Substitute.ForPartsOf<AsyncQueryProvider<T>>(collection);\n            return mockedQueryProvider;\n        }\n\n        internal static void SetSource<T>(this AsyncQueryProvider<T> mockedQueryProvider, IEnumerable<T> source) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            EnsureArgument.IsNotNull(source, nameof(source));\n\n            mockedQueryProvider.Source = source.AsQueryable();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute/Extensions/QueryProviderExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing EntityFrameworkCore.Testing.Common;\nusing Microsoft.EntityFrameworkCore.Query.Internal;\nusing Microsoft.Extensions.Logging;\nusing NSubstitute;\nusing NSubstitute.Extensions;\nusing rgvlee.Core.Common.Helpers;\nusing ProjectExpressionHelper = EntityFrameworkCore.Testing.Common.Helpers.ExpressionHelper;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Extensions\n{\n    /// <summary>\n    ///     Extensions for collection query providers.\n    /// </summary>\n    public static partial class QueryProviderExtensions\n    {\n        private static readonly ILogger Logger = LoggingHelper.CreateLogger(typeof(QueryProviderExtensions));\n\n        /// <summary>\n        ///     Sets up FromSqlInterpolated invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n        /// <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryProvider AddFromSqlInterpolatedResult<T>(this IQueryProvider mockedQueryProvider, IEnumerable<T> fromSqlInterpolatedResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            mockedQueryProvider.AddFromSqlRawResult(string.Empty, new List<object>(), fromSqlInterpolatedResult);\n            return mockedQueryProvider;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlInterpolated invocations containing a specified sql string to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n        /// <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryProvider AddFromSqlInterpolatedResult<T>(this IQueryProvider mockedQueryProvider, FormattableString sql, IEnumerable<T> fromSqlInterpolatedResult)\n            where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            mockedQueryProvider.AddFromSqlRawResult(sql.Format, sql.GetArguments(), fromSqlInterpolatedResult);\n            return mockedQueryProvider;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlInterpolated invocations containing a specified sql string and parameters to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n        /// <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"parameters\">The FromSqlInterpolated parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n        /// <param name=\"fromSqlInterpolatedResult\">The sequence to return when FromSqlInterpolated is invoked.</param>\n        /// <returns>The mocked query provider.</returns>\n        public static IQueryProvider AddFromSqlInterpolatedResult<T>(\n            this IQueryProvider mockedQueryProvider, string sql, IEnumerable<object> parameters, IEnumerable<T> fromSqlInterpolatedResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            mockedQueryProvider.AddFromSqlRawResult(sql, parameters, fromSqlInterpolatedResult);\n            return mockedQueryProvider;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlRaw invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n        /// <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryProvider AddFromSqlRawResult<T>(this IQueryProvider mockedQueryProvider, IEnumerable<T> fromSqlRawResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            mockedQueryProvider.AddFromSqlRawResult(string.Empty, new List<object>(), fromSqlRawResult);\n            return mockedQueryProvider;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlRaw invocations containing a specified sql string to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n        /// <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryProvider AddFromSqlRawResult<T>(this IQueryProvider mockedQueryProvider, string sql, IEnumerable<T> fromSqlRawResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            mockedQueryProvider.AddFromSqlRawResult(sql, new List<object>(), fromSqlRawResult);\n            return mockedQueryProvider;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryProvider\">The mocked query provider.</param>\n        /// <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"parameters\">The FromSqlRaw parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n        /// <param name=\"fromSqlResult\">The sequence to return when FromSqlRaw is invoked.</param>\n        /// <returns>The mocked query provider.</returns>\n        public static IQueryProvider AddFromSqlRawResult<T>(this IQueryProvider mockedQueryProvider, string sql, IEnumerable<object> parameters, IEnumerable<T> fromSqlResult)\n            where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryProvider, nameof(mockedQueryProvider));\n            EnsureArgument.IsNotNull(sql, nameof(sql));\n            EnsureArgument.IsNotNull(parameters, nameof(parameters));\n            EnsureArgument.IsNotNull(fromSqlResult, nameof(fromSqlResult));\n\n            Logger.LogDebug(\"Setting up '{sql}'\", sql);\n\n            var createQueryResult = new AsyncEnumerable<T>(fromSqlResult);\n\n            mockedQueryProvider.Configure()\n                .CreateQuery<T>(Arg.Is<FromSqlQueryRootExpression>(fsqre => ProjectExpressionHelper.SqlAndParametersMatchFromSqlExpression(sql, parameters, fsqre)))\n                .Returns(callInfo =>\n                {\n                    ProjectExpressionHelper.ThrowIfExpressionIsNotSupported(callInfo.Arg<Expression>());\n\n                    var fsqre = (FromSqlQueryRootExpression) callInfo.Arg<Expression>();\n                    var parts = new List<string>();\n                    parts.Add(\"FromSql inputs:\");\n                    parts.Add(ProjectExpressionHelper.StringifyFromSqlExpression(fsqre));\n                    Logger.LogDebug(string.Join(Environment.NewLine, parts));\n\n                    return createQueryResult;\n                });\n\n            return mockedQueryProvider;\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute/Extensions/QueryableExtensions.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Extensions\n{\n    /// <summary>\n    ///     Extensions for queryable collections.\n    /// </summary>\n    public static class QueryableExtensions\n    {\n        /// <summary>\n        ///     Sets up FromSqlInterpolated invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryable\">The mocked queryable.</param>\n        /// <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryable<T> AddFromSqlInterpolatedResult<T>(this IQueryable<T> mockedQueryable, IEnumerable<T> fromSqlInterpolatedResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryable, nameof(mockedQueryable));\n            mockedQueryable.Provider.AddFromSqlRawResult(string.Empty, new List<object>(), fromSqlInterpolatedResult);\n            return mockedQueryable;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlInterpolated invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryable\">The mocked queryable.</param>\n        /// <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryable<T> AddFromSqlInterpolatedResult<T>(this IQueryable<T> mockedQueryable, FormattableString sql, IEnumerable<T> fromSqlInterpolatedResult)\n            where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryable, nameof(mockedQueryable));\n            mockedQueryable.Provider.AddFromSqlRawResult(sql.Format, sql.GetArguments(), fromSqlInterpolatedResult);\n            return mockedQueryable;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlInterpolated invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryable\">The mocked queryable.</param>\n        /// <param name=\"sql\">The FromSqlInterpolated sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"parameters\">The FromSqlInterpolated parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n        /// <param name=\"fromSqlInterpolatedResult\">The FromSqlInterpolated result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryable<T> AddFromSqlInterpolatedResult<T>(\n            this IQueryable<T> mockedQueryable, string sql, IEnumerable<object> parameters, IEnumerable<T> fromSqlInterpolatedResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryable, nameof(mockedQueryable));\n            mockedQueryable.Provider.AddFromSqlRawResult(sql, parameters, fromSqlInterpolatedResult);\n            return mockedQueryable;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlRaw invocations to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryable\">The mocked queryable.</param>\n        /// <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryable<T> AddFromSqlRawResult<T>(this IQueryable<T> mockedQueryable, IEnumerable<T> fromSqlRawResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryable, nameof(mockedQueryable));\n            mockedQueryable.Provider.AddFromSqlRawResult(string.Empty, new List<object>(), fromSqlRawResult);\n            return mockedQueryable;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlRaw invocations containing a specified sql string to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryable\">The mocked queryable.</param>\n        /// <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryable<T> AddFromSqlRawResult<T>(this IQueryable<T> mockedQueryable, string sql, IEnumerable<T> fromSqlRawResult) where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryable, nameof(mockedQueryable));\n            mockedQueryable.Provider.AddFromSqlRawResult(sql, new List<object>(), fromSqlRawResult);\n            return mockedQueryable;\n        }\n\n        /// <summary>\n        ///     Sets up FromSqlRaw invocations containing a specified sql string and parameters to return a specified result.\n        /// </summary>\n        /// <typeparam name=\"T\">The queryable source type.</typeparam>\n        /// <param name=\"mockedQueryable\">The mocked queryable.</param>\n        /// <param name=\"sql\">The FromSqlRaw sql string. Set up supports case insensitive partial matches.</param>\n        /// <param name=\"parameters\">The FromSqlRaw parameters. Set up supports case insensitive partial parameter sequence matching.</param>\n        /// <param name=\"fromSqlRawResult\">The FromSqlRaw result.</param>\n        /// <returns>The mocked queryable.</returns>\n        public static IQueryable<T> AddFromSqlRawResult<T>(this IQueryable<T> mockedQueryable, string sql, IEnumerable<object> parameters, IEnumerable<T> fromSqlRawResult)\n            where T : class\n        {\n            EnsureArgument.IsNotNull(mockedQueryable, nameof(mockedQueryable));\n            mockedQueryable.Provider.AddFromSqlRawResult(sql, parameters, fromSqlRawResult);\n            return mockedQueryable;\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute/Extensions/ReadOnlyDbSetExtensions.Internal.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Threading;\nusing EntityFrameworkCore.Testing.Common;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Query;\nusing NSubstitute;\nusing NSubstitute.ExceptionExtensions;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Extensions\n{\n    public static partial class ReadOnlyDbSetExtensions\n    {\n        internal static DbSet<TEntity> CreateMockedReadOnlyDbSet<TEntity>(this DbSet<TEntity> readOnlyDbSet) where TEntity : class\n        {\n            EnsureArgument.IsNotNull(readOnlyDbSet, nameof(readOnlyDbSet));\n\n            var mockedReadOnlyDbSet = (DbSet<TEntity>) Substitute.For(new[] {\n                    typeof(DbSet<TEntity>),\n                    typeof(IAsyncEnumerable<TEntity>),\n                    typeof(IEnumerable),\n                    typeof(IEnumerable<TEntity>),\n                    typeof(IInfrastructure<IServiceProvider>),\n                    typeof(IListSource),\n                    typeof(IQueryable<TEntity>)\n                },\n                new object[] { });\n\n            var asyncEnumerable = new AsyncEnumerable<TEntity>(new List<TEntity>(), new FakeQueryRootExpression(Substitute.For<IAsyncQueryProvider>(), readOnlyDbSet.EntityType));\n            var mockedQueryProvider = ((IQueryable<TEntity>) readOnlyDbSet).Provider.CreateMockedQueryProvider(asyncEnumerable);\n\n            var invalidOperationException = new InvalidOperationException(\n                $\"Unable to track an instance of type '{typeof(TEntity).Name}' because it does not have a primary key. Only entity types with a primary key may be tracked.\");\n\n            mockedReadOnlyDbSet.Add(Arg.Any<TEntity>()).Throws(callInfo => invalidOperationException);\n            mockedReadOnlyDbSet.AddAsync(Arg.Any<TEntity>(), Arg.Any<CancellationToken>()).Throws(callInfo => invalidOperationException);\n            mockedReadOnlyDbSet.When(x => x.AddRange(Arg.Any<IEnumerable<TEntity>>())).Do(callInfo => throw invalidOperationException);\n            mockedReadOnlyDbSet.When(x => x.AddRange(Arg.Any<TEntity[]>())).Do(callInfo => throw invalidOperationException);\n            mockedReadOnlyDbSet.AddRangeAsync(Arg.Any<IEnumerable<TEntity>>(), Arg.Any<CancellationToken>()).Throws(callInfo => invalidOperationException);\n            mockedReadOnlyDbSet.AddRangeAsync(Arg.Any<TEntity[]>()).Throws(callInfo => invalidOperationException);\n\n            mockedReadOnlyDbSet.Attach(Arg.Any<TEntity>()).Throws(callInfo => invalidOperationException);\n            mockedReadOnlyDbSet.When(x => x.AttachRange(Arg.Any<IEnumerable<TEntity>>())).Do(callInfo => throw invalidOperationException);\n            mockedReadOnlyDbSet.When(x => x.AttachRange(Arg.Any<TEntity[]>())).Do(callInfo => throw invalidOperationException);\n\n            ((IListSource) mockedReadOnlyDbSet).ContainsListCollection.Returns(callInfo => false);\n\n            ((IQueryable<TEntity>) mockedReadOnlyDbSet).ElementType.Returns(callInfo => asyncEnumerable.ElementType);\n            mockedReadOnlyDbSet.EntityType.Returns(callInfo => readOnlyDbSet.EntityType);\n            ((IQueryable<TEntity>) mockedReadOnlyDbSet).Expression.Returns(callInfo => asyncEnumerable.Expression);\n\n            mockedReadOnlyDbSet.Find(Arg.Any<object[]>()).Throws(callInfo => new InvalidOperationException($\"The invoked method cannot be used for the entity type '{typeof(TEntity).Name}' because it does not have a primary key. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.\"));\n            mockedReadOnlyDbSet.FindAsync(Arg.Any<object[]>()).Throws(callInfo => new InvalidOperationException($\"The invoked method cannot be used for the entity type '{typeof(TEntity).Name}' because it does not have a primary key. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.\"));\n            mockedReadOnlyDbSet.FindAsync(Arg.Any<object[]>(), Arg.Any<CancellationToken>()).Throws(callInfo => new InvalidOperationException($\"The invoked method cannot be used for the entity type '{typeof(TEntity).Name}' because it does not have a primary key. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.\"));\n\n            ((IAsyncEnumerable<TEntity>) mockedReadOnlyDbSet).GetAsyncEnumerator(Arg.Any<CancellationToken>())\n                .Returns(callInfo => asyncEnumerable.GetAsyncEnumerator(callInfo.Arg<CancellationToken>()));\n\n            ((IEnumerable) mockedReadOnlyDbSet).GetEnumerator().Returns(callInfo => ((IEnumerable) asyncEnumerable).GetEnumerator());\n            ((IEnumerable<TEntity>) mockedReadOnlyDbSet).GetEnumerator().Returns(callInfo => ((IEnumerable<TEntity>) asyncEnumerable).GetEnumerator());\n\n            ((IListSource) mockedReadOnlyDbSet).GetList().Returns(callInfo => asyncEnumerable.ToList());\n\n            ((IInfrastructure<IServiceProvider>) mockedReadOnlyDbSet).Instance.Returns(callInfo => ((IInfrastructure<IServiceProvider>) readOnlyDbSet).Instance);\n\n            mockedReadOnlyDbSet.Local.Throws(callInfo => new InvalidOperationException($\"The invoked method cannot be used for the entity type '{typeof(TEntity).Name}' because it does not have a primary key. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.\"));\n\n            mockedReadOnlyDbSet.Remove(Arg.Any<TEntity>()).Throws(callInfo => invalidOperationException);\n            mockedReadOnlyDbSet.When(x => x.RemoveRange(Arg.Any<IEnumerable<TEntity>>())).Do(callInfo => throw invalidOperationException);\n            mockedReadOnlyDbSet.When(x => x.RemoveRange(Arg.Any<TEntity[]>())).Do(callInfo => throw invalidOperationException);\n\n            mockedReadOnlyDbSet.Update(Arg.Any<TEntity>()).Throws(callInfo => invalidOperationException);\n            mockedReadOnlyDbSet.When(x => x.UpdateRange(Arg.Any<IEnumerable<TEntity>>())).Do(callInfo => throw invalidOperationException);\n            mockedReadOnlyDbSet.When(x => x.UpdateRange(Arg.Any<TEntity[]>())).Do(callInfo => throw invalidOperationException);\n\n            ((IQueryable<TEntity>) mockedReadOnlyDbSet).Provider.Returns(callInfo => mockedQueryProvider);\n\n            mockedReadOnlyDbSet.AsAsyncEnumerable().Returns(callInfo => asyncEnumerable);\n            mockedReadOnlyDbSet.AsQueryable().Returns(callInfo => asyncEnumerable);\n\n            return mockedReadOnlyDbSet;\n        }\n\n        internal static void SetSource<TEntity>(this DbSet<TEntity> mockedReadOnlyDbSet, IEnumerable<TEntity> source) where TEntity : class\n        {\n            EnsureArgument.IsNotNull(mockedReadOnlyDbSet, nameof(mockedReadOnlyDbSet));\n            EnsureArgument.IsNotNull(source, nameof(source));\n\n            var asyncEnumerable = new AsyncEnumerable<TEntity>(source, new FakeQueryRootExpression(Substitute.For<IAsyncQueryProvider>(), mockedReadOnlyDbSet.EntityType));\n            var mockedQueryProvider = ((IQueryable<TEntity>) mockedReadOnlyDbSet).Provider;\n\n            ((IQueryable<TEntity>) mockedReadOnlyDbSet).Expression.Returns(callInfo => asyncEnumerable.Expression);\n\n            ((IAsyncEnumerable<TEntity>) mockedReadOnlyDbSet).GetAsyncEnumerator(Arg.Any<CancellationToken>())\n                .Returns(callInfo => asyncEnumerable.GetAsyncEnumerator(callInfo.Arg<CancellationToken>()));\n\n            ((IEnumerable) mockedReadOnlyDbSet).GetEnumerator().Returns(callInfo => ((IEnumerable) asyncEnumerable).GetEnumerator());\n            ((IEnumerable<TEntity>) mockedReadOnlyDbSet).GetEnumerator().Returns(callInfo => ((IEnumerable<TEntity>) asyncEnumerable).GetEnumerator());\n\n            ((IListSource) mockedReadOnlyDbSet).GetList().Returns(callInfo => asyncEnumerable.ToList());\n\n            mockedReadOnlyDbSet.AsAsyncEnumerable().Returns(callInfo => asyncEnumerable);\n            mockedReadOnlyDbSet.AsQueryable().Returns(callInfo => asyncEnumerable);\n\n            ((AsyncQueryProvider<TEntity>) mockedQueryProvider).SetSource(asyncEnumerable);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute/Extensions/ReadOnlyDbSetExtensions.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing Microsoft.EntityFrameworkCore;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Extensions\n{\n    /// <summary>\n    ///     Extensions for read-only db sets.\n    /// </summary>\n    public static partial class ReadOnlyDbSetExtensions\n    {\n        /// <summary>\n        ///     Adds an item to the end of the mocked readonly db set source.\n        /// </summary>\n        /// <typeparam name=\"TEntity\">The entity type.</typeparam>\n        /// <param name=\"mockedReadOnlyDbSet\">The mocked readonly db set.</param>\n        /// <param name=\"item\">The item to be added to the end of the mocked readonly db set source.</param>\n        public static void AddToReadOnlySource<TEntity>(this DbSet<TEntity> mockedReadOnlyDbSet, TEntity item) where TEntity : class\n        {\n            EnsureArgument.IsNotNull(mockedReadOnlyDbSet, nameof(mockedReadOnlyDbSet));\n            EnsureArgument.IsNotNull(item, nameof(item));\n\n            var list = mockedReadOnlyDbSet.ToList();\n            list.Add(item);\n\n            mockedReadOnlyDbSet.SetSource(list);\n        }\n\n        /// <summary>\n        ///     Adds the items of the specified sequence to the end of the mocked readonly db set source.\n        /// </summary>\n        /// <typeparam name=\"TEntity\">The entity type.</typeparam>\n        /// <param name=\"mockedReadOnlyDbSet\">The mocked readonly db set.</param>\n        /// <param name=\"items\">The sequence whose items should be added to the end of the mocked readonly db set source.</param>\n        public static void AddRangeToReadOnlySource<TEntity>(this DbSet<TEntity> mockedReadOnlyDbSet, IEnumerable<TEntity> items) where TEntity : class\n        {\n            EnsureArgument.IsNotNull(mockedReadOnlyDbSet, nameof(mockedReadOnlyDbSet));\n            EnsureArgument.IsNotEmpty(items, nameof(items));\n\n            var list = mockedReadOnlyDbSet.ToList();\n            list.AddRange(items);\n\n            mockedReadOnlyDbSet.SetSource(list);\n        }\n\n        /// <summary>\n        ///     Removes all items from the mocked readonly db set source.\n        /// </summary>\n        /// <typeparam name=\"TEntity\">The entity type.</typeparam>\n        /// <param name=\"mockedReadOnlyDbSet\">The mocked readonly db set.</param>\n        public static void ClearReadOnlySource<TEntity>(this DbSet<TEntity> mockedReadOnlyDbSet) where TEntity : class\n        {\n            EnsureArgument.IsNotNull(mockedReadOnlyDbSet, nameof(mockedReadOnlyDbSet));\n            mockedReadOnlyDbSet.SetSource(new List<TEntity>());\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute/Helpers/MockedDbContextBuilder.cs",
    "content": "﻿using EntityFrameworkCore.Testing.Common.Helpers;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Helpers\n{\n    /// <summary>\n    ///     The mocked db context builder.\n    /// </summary>\n    /// <typeparam name=\"TDbContext\">The db context type.</typeparam>\n    public class MockedDbContextBuilder<TDbContext> : BaseMockedDbContextBuilder<TDbContext> where TDbContext : DbContext\n    {\n        /// <summary>\n        ///     Creates the mocked db context.\n        /// </summary>\n        /// <returns>A mocked db context.</returns>\n        public override TDbContext MockedDbContext => new MockedDbContextFactory<TDbContext>(Options).Create();\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute/Helpers/MockedDbContextFactory.Internal.cs",
    "content": "﻿#pragma warning disable EF1001 // Internal EF Core API usage.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing EntityFrameworkCore.Testing.Common.Helpers;\nusing EntityFrameworkCore.Testing.NSubstitute.Extensions;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Diagnostics;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Internal;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.EntityFrameworkCore.Storage;\nusing Microsoft.Extensions.Logging;\nusing NSubstitute;\nusing NSubstitute.Core;\nusing NSubstitute.ExceptionExtensions;\nusing NSubstitute.Extensions;\nusing NSubstitute.ReturnsExtensions;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Helpers\n{\n    internal class MockedDbContextFactory<TDbContext> : BaseMockedDbContextFactory<TDbContext> where TDbContext : DbContext\n    {\n        public MockedDbContextFactory(MockedDbContextFactoryOptions<TDbContext> options) : base(options) { }\n\n        public override TDbContext Create()\n        {\n            var mockedDbContext = (TDbContext) Substitute.For(new[] {\n                    typeof(TDbContext), typeof(IDbContextDependencies), typeof(IDbSetCache), typeof(IInfrastructure<IServiceProvider>), typeof(IDbContextPoolable)\n                },\n                ConstructorParameters.ToArray());\n\n            var router = SubstitutionContext.Current.GetCallRouterFor(mockedDbContext);\n            router.RegisterCustomCallHandlerFactory(state => new NoSetUpHandler<TDbContext>(DbContext));\n\n            mockedDbContext.Add(Arg.Any<object>()).Returns(callInfo => DbContext.Add(callInfo.Arg<object>()));\n            mockedDbContext.AddAsync(Arg.Any<object>(), Arg.Any<CancellationToken>())\n                .Returns(callInfo => DbContext.AddAsync(callInfo.Arg<object>(), callInfo.Arg<CancellationToken>()));\n            mockedDbContext.When(x => x.AddRange(Arg.Any<object[]>())).Do(callInfo => DbContext.AddRange(callInfo.Arg<object[]>()));\n            mockedDbContext.When(x => x.AddRange(Arg.Any<IEnumerable<object>>())).Do(callInfo => DbContext.AddRange(callInfo.Arg<IEnumerable<object>>()));\n            mockedDbContext.AddRangeAsync(Arg.Any<object[]>(), Arg.Any<CancellationToken>())\n                .Returns(callInfo => DbContext.AddRangeAsync(callInfo.Arg<object[]>(), callInfo.Arg<CancellationToken>()));\n            mockedDbContext.AddRangeAsync(Arg.Any<IEnumerable<object>>(), Arg.Any<CancellationToken>())\n                .Returns(callInfo => DbContext.AddRangeAsync(callInfo.Arg<object>(), callInfo.Arg<CancellationToken>()));\n\n            mockedDbContext.Attach(Arg.Any<object>()).Returns(callInfo => DbContext.Attach(callInfo.Arg<object>()));\n            mockedDbContext.When(x => x.AttachRange(Arg.Any<object[]>())).Do(callInfo => DbContext.AttachRange(callInfo.Arg<object[]>()));\n            mockedDbContext.When(x => x.AttachRange(Arg.Any<IEnumerable<object>>())).Do(callInfo => DbContext.AttachRange(callInfo.Arg<IEnumerable<object>>()));\n\n            ((IDbContextDependencies) mockedDbContext).ChangeDetector.Returns(callInfo => ((IDbContextDependencies) DbContext).ChangeDetector);\n            mockedDbContext.ChangeTracker.Returns(callInfo => DbContext.ChangeTracker);\n            mockedDbContext.ContextId.Returns(callInfo => DbContext.ContextId);\n            mockedDbContext.Database.Returns(callInfo => DbContext.Database);\n            mockedDbContext.When(x => x.Dispose()).Do(callInfo => DbContext.Dispose());\n            mockedDbContext.DisposeAsync().Returns(callInfo => DbContext.DisposeAsync());\n            ((IDbContextDependencies) mockedDbContext).EntityFinderFactory.Returns(callInfo => ((IDbContextDependencies) DbContext).EntityFinderFactory);\n            ((IDbContextDependencies) mockedDbContext).EntityGraphAttacher.Returns(callInfo => ((IDbContextDependencies) DbContext).EntityGraphAttacher);\n            mockedDbContext.Entry(Arg.Any<object>()).Returns(callInfo => DbContext.Entry(callInfo.Arg<object>()));\n\n            mockedDbContext.Find(Arg.Any<Type>(), Arg.Any<object[]>()).Returns(callInfo => DbContext.Find(callInfo.Arg<Type>(), callInfo.Arg<object[]>()));\n            mockedDbContext.FindAsync(Arg.Any<Type>(), Arg.Any<object[]>()).Returns(callInfo => DbContext.FindAsync(callInfo.Arg<Type>(), callInfo.Arg<object[]>()));\n            mockedDbContext.FindAsync(Arg.Any<Type>(), Arg.Any<object[]>(), Arg.Any<CancellationToken>())\n                .Returns(callInfo => DbContext.FindAsync(callInfo.Arg<Type>(), callInfo.Arg<object[]>(), callInfo.Arg<CancellationToken>()));\n\n            ((IDbSetCache) mockedDbContext).GetOrAddSet(Arg.Any<IDbSetSource>(), Arg.Any<Type>())\n                .Returns(callInfo => ((IDbSetCache) DbContext).GetOrAddSet(callInfo.Arg<IDbSetSource>(), callInfo.Arg<Type>()));\n            ((IDbContextDependencies) mockedDbContext).InfrastructureLogger.Returns(callInfo => ((IDbContextDependencies) DbContext).InfrastructureLogger);\n            ((IInfrastructure<IServiceProvider>) mockedDbContext).Instance.Returns(callInfo => ((IInfrastructure<IServiceProvider>) DbContext).Instance);\n            //((IDbContextDependencies) mockedDbContext).Model.Returns(callInfo => ((IDbContextDependencies) DbContext).Model);\n            ((IDbContextDependencies) mockedDbContext).QueryProvider.Returns(callInfo => ((IDbContextDependencies) DbContext).QueryProvider);\n\n            mockedDbContext.Remove(Arg.Any<object>()).Returns(callInfo => DbContext.Remove(callInfo.Arg<object>()));\n            mockedDbContext.When(x => x.RemoveRange(Arg.Any<object[]>())).Do(callInfo => DbContext.RemoveRange(callInfo.Arg<object[]>()));\n            mockedDbContext.When(x => x.RemoveRange(Arg.Any<IEnumerable<object>>())).Do(callInfo => DbContext.RemoveRange(callInfo.Arg<IEnumerable<object>>()));\n\n            ((IDbContextPoolable) mockedDbContext).When(x => x.ResetState()).Do(callInfo => ((IDbContextPoolable) DbContext).ResetState());\n            ((IDbContextPoolable) mockedDbContext).When(x => x.ResetStateAsync(Arg.Any<CancellationToken>()))\n                .Do(callInfo => ((IDbContextPoolable) DbContext).ResetStateAsync(callInfo.Arg<CancellationToken>()));\n            // ((IDbContextPoolable) mockedDbContext).When(x => x.Resurrect(Arg.Any<DbContextPoolConfigurationSnapshot>()))\n            //     .Do(callInfo => ((IDbContextPoolable) DbContext).Resurrect(callInfo.Arg<DbContextPoolConfigurationSnapshot>()));\n\n            mockedDbContext.SaveChanges().Returns(callInfo => DbContext.SaveChanges());\n            mockedDbContext.SaveChanges(Arg.Any<bool>()).Returns(callInfo => DbContext.SaveChanges(callInfo.Arg<bool>()));\n            mockedDbContext.SaveChangesAsync(Arg.Any<CancellationToken>()).Returns(callInfo => DbContext.SaveChangesAsync(callInfo.Arg<CancellationToken>()));\n            mockedDbContext.SaveChangesAsync(Arg.Any<bool>(), Arg.Any<CancellationToken>())\n                .Returns(callInfo => DbContext.SaveChangesAsync(callInfo.Arg<bool>(), callInfo.Arg<CancellationToken>()));\n\n            // ((IDbContextPoolable) mockedDbContext).When(x => x.SetPool(Arg.Any<IDbContextPool>()))\n            //     .Do(callInfo => ((IDbContextPoolable) DbContext).SetPool(callInfo.Arg<IDbContextPool>()));\n            ((IDbContextDependencies) mockedDbContext).SetSource.Returns(callInfo => ((IDbContextDependencies) DbContext).SetSource);\n            // ((IDbContextPoolable) mockedDbContext).SnapshotConfiguration().Returns(callInfo => ((IDbContextPoolable) DbContext).SnapshotConfiguration());\n            ((IDbContextDependencies) mockedDbContext).StateManager.Returns(callInfo => ((IDbContextDependencies) DbContext).StateManager);\n\n            mockedDbContext.Update(Arg.Any<object>()).Returns(callInfo => DbContext.Update(callInfo.Arg<object>()));\n\n            ((IDbContextDependencies) mockedDbContext).UpdateLogger.Returns(callInfo => ((IDbContextDependencies) DbContext).UpdateLogger);\n\n            mockedDbContext.When(x => x.UpdateRange(Arg.Any<object[]>())).Do(callInfo => DbContext.UpdateRange(callInfo.Arg<object[]>()));\n            mockedDbContext.When(x => x.UpdateRange(Arg.Any<IEnumerable<object>>())).Do(callInfo => DbContext.UpdateRange(callInfo.Arg<IEnumerable<object>>()));\n\n            //Relational set up\n            var rawSqlCommandBuilder = Substitute.For<IRawSqlCommandBuilder>();\n            rawSqlCommandBuilder.Build(Arg.Any<string>(), Arg.Any<IEnumerable<object>>(), Arg.Any<IModel>())\n                .Throws(callInfo =>\n                {\n                    Logger.LogDebug(\"Catch all exception invoked\");\n                    return new InvalidOperationException();\n                });\n\n            // var concurrencyDetector = Substitute.For<IConcurrencyDetector>();\n            // concurrencyDetector.EnterCriticalSection().Returns(callInfo => new ConcurrencyDetectorCriticalSectionDisposer(Substitute.For<IConcurrencyDetector>()));\n\n            var relationalConnection = Substitute.For<IRelationalConnection>();\n            relationalConnection.CommandTimeout.Returns(callInfo => 0);\n\n            var dependencies = Substitute.For<IRelationalDatabaseFacadeDependencies>();\n            // dependencies.ConcurrencyDetector.Returns(callInfo => concurrencyDetector);\n            dependencies.CommandLogger.Returns(callInfo => Substitute.For<IRelationalCommandDiagnosticsLogger>());\n            dependencies.RawSqlCommandBuilder.Returns(callInfo => rawSqlCommandBuilder);\n            dependencies.RelationalConnection.Returns(callInfo => relationalConnection);\n\n            var serviceProvider = Substitute.For<IServiceProvider>();\n            serviceProvider.GetService(Arg.Is<Type>(t => t == typeof(IDatabaseFacadeDependencies))).Returns(callInfo => dependencies);\n            serviceProvider.GetService(Arg.Is<Type>(t => t == typeof(IModel))).Returns(callInfo => Substitute.For<IModel>());\n\n            ((IInfrastructure<IServiceProvider>) mockedDbContext).Instance.Returns(callInfo => serviceProvider);\n\n            var databaseFacade = Substitute.For(new[] { typeof(DatabaseFacade), typeof(IDatabaseFacadeDependenciesAccessor) }, new[] { mockedDbContext });\n            ((IDatabaseFacadeDependenciesAccessor) databaseFacade).Dependencies.Returns(callInfo => dependencies);\n            ((DatabaseFacade)databaseFacade).BeginTransaction().Returns(callInfo => Substitute.For<IDbContextTransaction>());\n            ((DatabaseFacade)databaseFacade).BeginTransactionAsync(Arg.Any<CancellationToken>()).Returns(callInfo => Task.FromResult(Substitute.For<IDbContextTransaction>()));\n\n            mockedDbContext.Database.Returns(callInfo => databaseFacade);\n\n            return mockedDbContext;\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute/Helpers/NoSetUpHandler.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading;\nusing EntityFrameworkCore.Testing.Common;\nusing EntityFrameworkCore.Testing.NSubstitute.Extensions;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.Extensions.Logging;\nusing NSubstitute;\nusing NSubstitute.Core;\nusing NSubstitute.Extensions;\nusing rgvlee.Core.Common.Extensions;\nusing rgvlee.Core.Common.Helpers;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Helpers\n{\n    internal class NoSetUpHandler<TDbContext> : ICallHandler where TDbContext : DbContext\n    {\n        private static readonly ILogger<NoSetUpHandler<TDbContext>> Logger = LoggingHelper.CreateLogger<NoSetUpHandler<TDbContext>>();\n\n        private readonly List<IEntityType> _allModelEntityTypes;\n\n        private readonly TDbContext _dbContext;\n\n        private readonly List<PropertyInfo> _dbContextModelProperties;\n\n        public NoSetUpHandler(TDbContext dbContext)\n        {\n            _dbContext = dbContext;\n            _allModelEntityTypes = _dbContext.Model.GetEntityTypes().ToList();\n            _dbContextModelProperties = _dbContext.GetType()\n                .GetProperties()\n                .Where(x => x.PropertyType.IsGenericType && x.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>))\n                .ToList();\n        }\n\n        public RouteAction Handle(ICall call)\n        {\n            var mockedDbContext = call.Target();\n            var invokedMethod = call.GetMethodInfo();\n            var arguments = call.GetArguments();\n\n            var modelType = GetModelType(invokedMethod);\n            if (modelType == null)\n            {\n                return invokedMethod.ReturnType != typeof(void) ? RouteAction.Return(invokedMethod.ReturnType.GetDefaultValue()) : RouteAction.Continue();\n            }\n\n            Logger.LogDebug(\"Setting up model '{type}'\", modelType);\n\n            var modelEntityType = _allModelEntityTypes.SingleOrDefault(x => x.ClrType.Equals(modelType));\n            if (modelEntityType == null)\n            {\n                throw new InvalidOperationException(string.Format(ExceptionMessages.CannotCreateDbSetTypeNotIncludedInModel,\n                    invokedMethod.GetGenericArguments().Single().Name));\n            }\n\n            var setUpModelMethod = typeof(NoSetUpHandler<TDbContext>).GetMethods(BindingFlags.Instance | BindingFlags.NonPublic)\n                .Single(x => x.Name.Equals(modelEntityType.FindPrimaryKey() != null ? \"SetUpModel\" : \"SetUpReadOnlyModel\"));\n\n            setUpModelMethod.MakeGenericMethod(modelType).Invoke(this, new[] { mockedDbContext });\n\n            return RouteAction.Return(invokedMethod.Invoke(mockedDbContext, arguments?.ToArray()));\n        }\n\n        private Type GetModelType(MethodInfo invokedMethod)\n        {\n            var dbContextModelProperty = _dbContextModelProperties.SingleOrDefault(x => x.GetMethod.Name.Equals(invokedMethod.Name));\n            if (dbContextModelProperty != null)\n            {\n                return dbContextModelProperty.PropertyType.GetGenericArguments().Single();\n            }\n\n            if (!invokedMethod.IsGenericMethod)\n            {\n                return null;\n            }\n\n            var dbContextMethod = typeof(DbContext).GetMethods(BindingFlags.Instance | BindingFlags.Public)\n                .SingleOrDefault(x => x.IsGenericMethod && x.GetGenericMethodDefinition().Equals(invokedMethod.GetGenericMethodDefinition()));\n\n            if (dbContextMethod != null)\n            {\n                return invokedMethod.GetGenericArguments().Single();\n            }\n\n            return null;\n        }\n\n        private void SetUpModel<TEntity>(TDbContext mockedDbContext) where TEntity : class\n        {\n            var mockedDbSet = _dbContext.Set<TEntity>().CreateMockedDbSet();\n\n            var property = typeof(TDbContext).GetProperties().SingleOrDefault(p => p.PropertyType == typeof(DbSet<TEntity>));\n\n            if (property != null)\n            {\n                property.GetValue(mockedDbContext.Configure()).Returns(callInfo => mockedDbSet);\n            }\n            else\n            {\n                Logger.LogDebug(\"Could not find a DbContext property for type '{type}'\", typeof(TEntity));\n            }\n\n            mockedDbContext.Configure().Set<TEntity>().Returns(callInfo => mockedDbSet);\n\n            mockedDbContext.Add(Arg.Any<TEntity>()).Returns(callInfo => _dbContext.Add(callInfo.Arg<TEntity>()));\n            mockedDbContext.AddAsync(Arg.Any<TEntity>(), Arg.Any<CancellationToken>())\n                .Returns(callInfo => _dbContext.AddAsync(callInfo.Arg<TEntity>(), callInfo.Arg<CancellationToken>()));\n\n            mockedDbContext.Attach(Arg.Any<TEntity>()).Returns(callInfo => _dbContext.Attach(callInfo.Arg<TEntity>()));\n\n            mockedDbContext.Entry(Arg.Any<TEntity>()).Returns(callInfo => _dbContext.Entry(callInfo.Arg<TEntity>()));\n\n            mockedDbContext.Find<TEntity>(Arg.Any<object[]>()).Returns(callInfo => _dbContext.Find<TEntity>(callInfo.Arg<object[]>()));\n\n            mockedDbContext.FindAsync<TEntity>(Arg.Any<object[]>()).Returns(callInfo => _dbContext.FindAsync<TEntity>(callInfo.Arg<object[]>()));\n            mockedDbContext.FindAsync<TEntity>(Arg.Any<object[]>(), Arg.Any<CancellationToken>())\n                .Returns(callInfo => _dbContext.FindAsync<TEntity>(callInfo.Arg<object[]>(), callInfo.Arg<CancellationToken>()));\n\n            mockedDbContext.Remove(Arg.Any<TEntity>()).Returns(callInfo => _dbContext.Remove(callInfo.Arg<TEntity>()));\n\n            mockedDbContext.Update(Arg.Any<TEntity>()).Returns(callInfo => _dbContext.Update(callInfo.Arg<TEntity>()));\n        }\n\n        private void SetUpReadOnlyModel<TEntity>(TDbContext mockedDbContext) where TEntity : class\n        {\n            var mockedReadOnlyDbSet = _dbContext.Set<TEntity>().CreateMockedReadOnlyDbSet();\n\n            var property = typeof(TDbContext).GetProperties().SingleOrDefault(p => p.PropertyType == typeof(DbSet<TEntity>));\n            if (property != null)\n            {\n                property.GetValue(mockedDbContext.Configure()).Returns(callInfo => mockedReadOnlyDbSet);\n            }\n            else\n            {\n                Logger.LogDebug(\"Could not find a DbContext property for type '{type}'\", typeof(TEntity));\n            }\n\n            mockedDbContext.Configure().Set<TEntity>().Returns(callInfo => mockedReadOnlyDbSet);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/BaseForDbContextTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EntityFrameworkCore.Testing.NSubstitute.Extensions;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public abstract class BaseForDbContextTests<T> : Common.Tests.BaseForDbContextTests<T> where T : DbContext\n    {\n        public override void AddExecuteSqlInterpolatedResult(T mockedDbContext, int expectedResult)\n        {\n            mockedDbContext.AddExecuteSqlInterpolatedResult(expectedResult);\n        }\n\n        public override void AddExecuteSqlInterpolatedResult(T mockedDbContext, FormattableString sql, int expectedResult)\n        {\n            mockedDbContext.AddExecuteSqlInterpolatedResult(sql, expectedResult);\n        }\n\n        public override void AddExecuteSqlInterpolatedResult(T mockedDbContext, string sql, IEnumerable<object> parameters, int expectedResult)\n        {\n            mockedDbContext.AddExecuteSqlInterpolatedResult(sql, parameters, expectedResult);\n        }\n\n        public override void AddExecuteSqlRawResult(T mockedDbContext, int expectedResult)\n        {\n            mockedDbContext.AddExecuteSqlRawResult(expectedResult);\n        }\n\n        public override void AddExecuteSqlRawResult(T mockedDbContext, string sql, int expectedResult)\n        {\n            mockedDbContext.AddExecuteSqlRawResult(sql, expectedResult);\n        }\n\n        public override void AddExecuteSqlRawResult(T mockedDbContext, string sql, IEnumerable<object> parameters, int expectedResult)\n        {\n            mockedDbContext.AddExecuteSqlRawResult(sql, parameters, expectedResult);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/BaseForDbQueryTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing EntityFrameworkCore.Testing.NSubstitute.Extensions;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public abstract class BaseForDbQueryTests<T> : BaseForReadOnlyDbSetTests<T> where T : BaseTestEntity\n    {\n        protected TestDbContext MockedDbContext;\n\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            MockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n        }\n\n        protected override void AddFromSqlRawResult(DbSet<T> mockedDbSet, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlRawResult(expectedResult);\n        }\n\n        protected override void AddFromSqlRawResult(DbSet<T> mockedDbSet, string sql, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlRawResult(sql, expectedResult);\n        }\n\n        protected override void AddFromSqlRawResult(DbSet<T> mockedDbSet, string sql, IEnumerable<object> parameters, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlRawResult(sql, parameters, expectedResult);\n        }\n\n        protected override void AddFromSqlInterpolatedResult(DbSet<T> mockedDbSet, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlInterpolatedResult(expectedResult);\n        }\n\n        protected override void AddFromSqlInterpolatedResult(DbSet<T> mockedDbSet, FormattableString sql, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlInterpolatedResult(sql, expectedResult);\n        }\n\n        protected override void AddFromSqlInterpolatedResult(DbSet<T> mockedDbSet, string sql, IEnumerable<object> parameters, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlInterpolatedResult(sql, parameters, expectedResult);\n        }\n\n        protected override void AddToReadOnlySource(DbSet<T> mockedDbQuery, T item)\n        {\n            mockedDbQuery.AddToReadOnlySource(item);\n        }\n\n        protected override void AddRangeToReadOnlySource(DbSet<T> mockedDbQuery, IEnumerable<T> items)\n        {\n            mockedDbQuery.AddRangeToReadOnlySource(items);\n        }\n\n        protected override void ClearReadOnlySource(DbSet<T> mockedDbQuery)\n        {\n            mockedDbQuery.ClearReadOnlySource();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/BaseForDbSetTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing EntityFrameworkCore.Testing.NSubstitute.Extensions;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public abstract class BaseForDbSetTests<T> : BaseForDbSetTests<TestDbContext, T> where T : BaseTestEntity\n    {\n        protected override TestDbContext CreateMockedDbContext()\n        {\n            return Create.MockedDbContextFor<TestDbContext>();\n        }\n\n        protected override void AddFromSqlRawResult(DbSet<T> mockedDbSet, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlRawResult(expectedResult);\n        }\n\n        protected override void AddFromSqlRawResult(DbSet<T> mockedDbSet, string sql, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlRawResult(sql, expectedResult);\n        }\n\n        protected override void AddFromSqlRawResult(DbSet<T> mockedDbSet, string sql, IEnumerable<object> parameters, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlRawResult(sql, parameters, expectedResult);\n        }\n\n        protected override void AddFromSqlInterpolatedResult(DbSet<T> mockedDbSet, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlInterpolatedResult(expectedResult);\n        }\n\n        protected override void AddFromSqlInterpolatedResult(DbSet<T> mockedDbSet, FormattableString sql, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlInterpolatedResult(sql, expectedResult);\n        }\n\n        protected override void AddFromSqlInterpolatedResult(DbSet<T> mockedDbSet, string sql, IEnumerable<object> parameters, IEnumerable<T> expectedResult)\n        {\n            mockedDbSet.AddFromSqlInterpolatedResult(sql, parameters, expectedResult);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/ByPropertyDbSetTests.cs",
    "content": "﻿using System.Linq;\nusing EntityFrameworkCore.Testing.Common.Tests;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class ByPropertyDbSetTests : BaseForDbSetTests<TestEntity>\n    {\n        protected override IQueryable<TestEntity> Queryable => MockedDbContext.TestEntities;\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/ByPropertyReadOnlyDbSetExceptionTests.cs",
    "content": "﻿using EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class ByPropertyReadOnlyDbSetExceptionTests : ReadOnlyDbSetExceptionTests<TestReadOnlyEntity>\n    {\n        protected TestDbContext MockedDbContext;\n\n        protected override DbSet<TestReadOnlyEntity> DbSet => MockedDbContext.TestReadOnlyEntities;\n\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            MockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/ByPropertyReadOnlyDbSetTests.cs",
    "content": "﻿using System.Linq;\nusing EntityFrameworkCore.Testing.Common.Tests;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class ByPropertyReadOnlyDbSetTests : BaseForDbQueryTests<TestReadOnlyEntity>\n    {\n        protected override IQueryable<TestReadOnlyEntity> Queryable => MockedDbContext.Set<TestReadOnlyEntity>();\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/ByTypeDbSetTests.cs",
    "content": "﻿using System.Linq;\nusing System.Linq.Expressions;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing NSubstitute;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class ByTypeDbSetTests : BaseForDbSetTests<TestEntity>\n    {\n        protected override IQueryable<TestEntity> Queryable => MockedDbContext.Set<TestEntity>();\n\n        [Test(Description = \"This test ensures that method invoked via CallBase = true are verifiable\")]\n        public override void Select_ReturnsSequence()\n        {\n            base.Select_ReturnsSequence();\n\n            Queryable.Provider.Received(2).CreateQuery<TestEntity>(Arg.Any<Expression>());\n\n            Queryable.Provider.Received(2).CreateQuery<TestEntity>(Arg.Is<MethodCallExpression>(mce => mce.Method.Name.Equals(nameof(System.Linq.Queryable.Select))));\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/ByTypeReadOnlyDbSetExceptionTests.cs",
    "content": "﻿using EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class ByTypeReadOnlyDbSetExceptionTests : ReadOnlyDbSetExceptionTests<TestReadOnlyEntity>\n    {\n        protected TestDbContext MockedDbContext;\n\n        protected override DbSet<TestReadOnlyEntity> DbSet => MockedDbContext.Set<TestReadOnlyEntity>();\n\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            MockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/ByTypeReadOnlyDbSetTests.cs",
    "content": "﻿using System.Linq;\nusing EntityFrameworkCore.Testing.Common.Tests;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class ByTypeReadOnlyDbSetTests : BaseForDbQueryTests<TestReadOnlyEntity>\n    {\n        protected override IQueryable<TestReadOnlyEntity> Queryable => MockedDbContext.Set<TestReadOnlyEntity>();\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/CreateFactoryTests.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing Castle.DynamicProxy;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class CreateFactoryTests : BaseForTests\n    {\n        [Test]\n        public void CreateMockedDbContextFor_Type_CreatesMockedDbContext()\n        {\n            var mocked = Create.MockedDbContextFor<TestDbContext>();\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(mocked, Is.Not.Null);\n                Assert.That(ProxyUtil.IsProxy(mocked), Is.True);\n            });\n        }\n\n        [Test]\n        public void CreateMockedQueryProviderFor_Queryable_CreatesMockedQueryProvider()\n        {\n            var dbContextToMock = new TestDbContext(new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options);\n\n            var mocked = Create.MockedQueryProviderFor(dbContextToMock.TestEntities);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(mocked, Is.Not.Null);\n                Assert.That(ProxyUtil.IsProxy(mocked), Is.True);\n            });\n        }\n\n        [Test]\n        public void CreateMockedQueryProviderFor_NullQueryable_ThrowsException()\n        {\n            Assert.Throws<ArgumentNullException>(() =>\n            {\n                var mocked = Create.MockedQueryProviderFor((IQueryable<TestEntity>) null);\n            });\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/DbContextTestsUsingConstructorParameters.cs",
    "content": "﻿using System;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class DbContextTestsUsingConstructorParameters : BaseForDbContextTests<TestDbContext>\n    {\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            MockedDbContext = Create.MockedDbContextFor<TestDbContext>(new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/DbContextTestsUsingType.cs",
    "content": "﻿using EntityFrameworkCore.Testing.Common.Tests;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class DbContextTestsUsingType : BaseForDbContextTests<TestDbContext>\n    {\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            MockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/EntityFrameworkCore.Testing.NSubstitute.Tests.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Debug' \">\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Release' \">\n    <DebugSymbols>true</DebugSymbols>\n    <WarningsAsErrors>NU1605</WarningsAsErrors>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"coverlet.msbuild\" Version=\"6.0.4\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"18.0.1\" />\n    <PackageReference Include=\"NUnit\" Version=\"4.4.0\" />\n    <PackageReference Include=\"NUnit3TestAdapter\" Version=\"5.2.0\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\EntityFrameworkCore.Testing.Common.Tests\\EntityFrameworkCore.Testing.Common.Tests.csproj\" />\n    <ProjectReference Include=\"..\\EntityFrameworkCore.Testing.NSubstitute\\EntityFrameworkCore.Testing.NSubstitute.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/Issue114Tests.cs",
    "content": "﻿namespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class Issue114Tests : Common.Tests.Issue114Tests\n    {\n        protected override TestDbContext MockedDbContextFactory()\n        {\n            return Create.MockedDbContextFor<TestDbContext>();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/Issue117Tests.cs",
    "content": "﻿namespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class Issue117Tests : Common.Tests.Issue117Tests\n    {\n        protected override TestDbContext MockedDbContextFactory()\n        {\n            return Create.MockedDbContextFor<TestDbContext>();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/Issue126Tests.cs",
    "content": "﻿using System;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class Issue126Tests : Issue126Tests<TestDbContext>\n    {\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            var options = new DbContextOptionsBuilder<TestDbContext>()\n                .UseInMemoryDatabase(Guid.NewGuid().ToString())\n                .Options;\n\n            DbContextFactory = () => Create.MockedDbContextFor<TestDbContext>(options);\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/Issue1Tests.cs",
    "content": "﻿using System;\nusing System.Data;\nusing Microsoft.Data.SqlClient;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing AutoFixture;\nusing Castle.DynamicProxy;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing EntityFrameworkCore.Testing.NSubstitute.Extensions;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class Issue1Tests : BaseForTests\n    {\n        [Test]\n        public void CreateMockedDbContextFor_ParametersForSpecificConstructor_CreatesSubstitute()\n        {\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>(new DbContextOptionsBuilder<TestDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString())\n                .EnableSensitiveDataLogging()\n                .Options);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(mockedDbContext, Is.Not.Null);\n                Assert.That(ProxyUtil.IsProxy(mockedDbContext), Is.True);\n            });\n        }\n\n        [Test]\n        public async Task ExecuteSqlRawAsync_SpecifiedSqlAndSqlParameter_ReturnsExpectedResultAndSetsOutputParameterValue()\n        {\n            var expectedResult = Fixture.Create<string>();\n\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n            mockedDbContext.AddExecuteSqlRawResult(-1,\n                (sql, parameters) =>\n                {\n                    ((SqlParameter) parameters.ElementAt(0)).Value = expectedResult;\n                });\n\n            var outputParameter = new SqlParameter(\"OutputParameter\", SqlDbType.NVarChar, 255) { Direction = ParameterDirection.Output };\n            var result = await mockedDbContext.Database.ExecuteSqlRawAsync(@\"EXEC [StoredProcedureWithOutputParameter] @OutputParameter = @Result OUTPUT\", outputParameter);\n\n            Assert.Multiple(() =>\n            {\n                Assert.That(result, Is.EqualTo(-1));\n                Assert.That(outputParameter.Value.ToString(), Is.EqualTo(expectedResult));\n            });\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/Issue49Tests.cs",
    "content": "﻿using EntityFrameworkCore.Testing.Common.Tests;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class Issue49Tests : Issue49Tests<TestDbContext, TestEntity>\n    {\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            DbContext = Create.MockedDbContextFor<TestDbContext>();\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/Issue4Tests.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing AutoFixture;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Query;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class Issue4Tests : BaseForTests\n    {\n        [Test]\n        public void AsQueryable_Set_ReturnsIQueryableOfTWithMockedQueryProvider()\n        {\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n\n            var mockedSetAsQueryable = mockedDbContext.TestEntities.AsQueryable();\n\n            var asyncProvider = mockedSetAsQueryable.Provider as IAsyncQueryProvider;\n            Assert.That(asyncProvider, Is.Not.Null);\n        }\n\n        [Test]\n        public async Task AsQueryableThenWhereThenSingleOrDefaultAsync_WhereOperationReturnsFalse_ReturnsDefault()\n        {\n            var entities = Fixture.CreateMany<TestEntity>().ToList();\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n            var mockedSet = mockedDbContext.TestEntities;\n            mockedSet.AddRange(entities);\n            mockedDbContext.SaveChanges();\n\n            var result = await mockedSet.AsQueryable().Where(x => x.Id.Equals(Guid.NewGuid())).SingleOrDefaultAsync();\n\n            Assert.That(result, Is.Null);\n        }\n\n        [Test]\n        public async Task AsQueryableThenWhereThenSingleOrDefaultAsync_WhereOperationReturnsTrue_ReturnsSingleEntity()\n        {\n            var entities = Fixture.CreateMany<TestEntity>().ToList();\n            var entityToFind = entities.ElementAt(1);\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n            var mockedSet = mockedDbContext.TestEntities;\n            mockedSet.AddRange(entities);\n            mockedDbContext.SaveChanges();\n\n            var result = await mockedSet.AsQueryable().Where(x => x.Id.Equals(entityToFind.Id)).SingleOrDefaultAsync();\n\n            Assert.That(result, Is.EqualTo(entityToFind));\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/Issue6Tests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing AutoFixture;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing EntityFrameworkCore.Testing.NSubstitute.Extensions;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class Issue6Tests : BaseForTests\n    {\n        private static IEnumerable<TestCaseData> FromSqlInterpolated_SpecifiedSqlWithNullParameters_TestCases {\n            get\n            {\n                yield return new TestCaseData(null, null);\n                yield return new TestCaseData(null, 1);\n                yield return new TestCaseData(DateTime.Parse(\"21 May 2020 9:05 PM\"), null);\n            }\n        }\n\n        [TestCaseSource(nameof(FromSqlInterpolated_SpecifiedSqlWithNullParameters_TestCases))]\n        public void FromSqlInterpolated_SpecifiedSqlWithNullParameters_ReturnsExpectedResult(DateTime? dateTimeValue, int? intValue)\n        {\n            var expectedResult = new List<TestEntity> { Fixture.Create<TestEntity>() };\n\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n            mockedDbContext.Set<TestEntity>().AddFromSqlInterpolatedResult($\"SELECT * FROM [SqlFunctionWithNullableParameters]({dateTimeValue}, {intValue})\", expectedResult);\n\n            var actualResult = mockedDbContext.Set<TestEntity>().FromSqlInterpolated($\"SELECT * FROM [SqlFunctionWithNullableParameters]({dateTimeValue}, {intValue})\");\n\n            Assert.That(actualResult, Is.EqualTo(expectedResult));\n        }\n\n        [Test]\n        public void FromSqlInterpolated_SpecifiedSqlWithDbNullParameters_ReturnsExpectedResult()\n        {\n            var expectedResult = new List<TestEntity> { Fixture.Create<TestEntity>() };\n\n            var mockedDbContext = Create.MockedDbContextFor<TestDbContext>();\n            mockedDbContext.Set<TestEntity>().AddFromSqlInterpolatedResult($\"SELECT * FROM [SqlFunctionWithNullableParameters]({DBNull.Value}, {DBNull.Value})\", expectedResult);\n\n            var actualResult = mockedDbContext.Set<TestEntity>().FromSqlInterpolated($\"SELECT * FROM [SqlFunctionWithNullableParameters]({DBNull.Value}, {DBNull.Value})\");\n\n            Assert.That(actualResult, Is.EqualTo(expectedResult));\n        }\n    }\n}"
  },
  {
    "path": "src/EntityFrameworkCore.Testing.NSubstitute.Tests/Issue88Tests.cs",
    "content": "﻿using System;\nusing EntityFrameworkCore.Testing.Common.Tests;\nusing Microsoft.EntityFrameworkCore;\nusing NUnit.Framework;\n\nnamespace EntityFrameworkCore.Testing.NSubstitute.Tests\n{\n    public class Issue88Tests : Issue88Tests<TestDbContext, TestEntity>\n    {\n        [SetUp]\n        public override void SetUp()\n        {\n            base.SetUp();\n\n            var options = new DbContextOptionsBuilder<TestDbContext>()\n                .UseInMemoryDatabase(Guid.NewGuid().ToString())\n                .Options;\n\n            DbContextFactory = () => Create.MockedDbContextFor<TestDbContext>(options);\n        }\n    }\n}"
  }
]