<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<!--
  Version here define the base values that the project has been tested with
-->

<Project>
  <PropertyGroup Label="Build, Test, Code Analysis">
    <MicrosoftBuildFrameworkVersion>17.2.0</MicrosoftBuildFrameworkVersion>
    <MicrosoftBuildUtilitiesCoreVersion>17.2.0</MicrosoftBuildUtilitiesCoreVersion>
    <MicrosoftCodeAnalysisVersion>4.3.0-3.final</MicrosoftCodeAnalysisVersion>
    <MicrosoftCodeAnalysisCSharpVersion>4.3.0-3.final</MicrosoftCodeAnalysisCSharpVersion>
    <MicrosoftCodeAnalysisCSharpCodeStyleVersion>4.3.0-3.final</MicrosoftCodeAnalysisCSharpCodeStyleVersion>
    <MicrosoftExtensionsCachingMemoryVersion>5.0.0</MicrosoftExtensionsCachingMemoryVersion>
    <MicrosoftExtensionsLoggingVersion>5.0.0</MicrosoftExtensionsLoggingVersion>
    <!-- When .NET 7 SDK is released or the package is not in preview, update this version -->
    <MicrosoftCodeAnalysisNetAnalyzersVersion Condition="'$(TargetFramework)' != 'net7.0'">6.0.0</MicrosoftCodeAnalysisNetAnalyzersVersion>
    <MicrosoftCodeAnalysisNetAnalyzersVersion Condition="'$(TargetFramework)' == 'net7.0'">7.0.0-preview*</MicrosoftCodeAnalysisNetAnalyzersVersion>
    <MicrosoftNETTestSdkVersion>17.2.0</MicrosoftNETTestSdkVersion>
    <MoqVersion>4.18.2</MoqVersion>
    <NUnitVersion>3.13.3</NUnitVersion>
    <NUnitConsoleRunnerVersion>3.15.2</NUnitConsoleRunnerVersion>
    <NUnit3TestAdapterVersion>4.2.1</NUnit3TestAdapterVersion>
    <NLogVersion>4.7.15</NLogVersion>
    <NLogExtensionsVersion>1.7.5</NLogExtensionsVersion>
    <StyleCopAnalyzersVersion>1.1.118</StyleCopAnalyzersVersion>
  </PropertyGroup>
</Project>
