Пуртова Аліна Геннадіївна
8 months ago
114 changed files with 24830 additions and 0 deletions
@ -0,0 +1,33 @@ |
|||
pipeline { |
|||
agent any |
|||
|
|||
stages { |
|||
stage('Checkout') { |
|||
steps { |
|||
git url: 'add here your url', credentialsId: 'add credentialsId' |
|||
} |
|||
} |
|||
|
|||
stage('Build') { |
|||
steps { |
|||
// Крок для збірки проекту з Visual Studio |
|||
// Встановіть правильні шляхи до рішення/проекту та параметри MSBuild |
|||
bat '"path to MSBuild" test_repos.sln /t:Build /p:Configuration=Release' |
|||
} |
|||
} |
|||
|
|||
stage('Test') { |
|||
steps { |
|||
// Команди для запуску тестів |
|||
bat "x64\\Debug\\test_repos.exe --gtest_output=xml:test_report.xml" |
|||
} |
|||
} |
|||
} |
|||
|
|||
post { |
|||
always { |
|||
// Publish test results using the junit step |
|||
// Specify the path to the XML test result files |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,4 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<packages> |
|||
<package id="Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn" version="1.8.1.7" targetFramework="native" /> |
|||
</packages> |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,45 @@ |
|||
|
|||
THIRD-PARTY SOFTWARE NOTICES AND INFORMATION |
|||
Do Not Translate or Localize |
|||
|
|||
This package incorporates components from the projects listed below. Microsoft licenses these components to you under the license terms for the Microsoft package. The original copyright notices and the licenses under which Microsoft received such components are set forth below for informational purposes. Microsoft reserves all rights not expressly granted herein, whether by implication, estoppel or otherwise. |
|||
|
|||
|
|||
|
|||
1. Google Test Framework (https://github.com/google/googletest) |
|||
|
|||
|
|||
%% Google Test Framework NOTICES, INFORMATION, AND LICENSE BEGIN HERE |
|||
========================================= |
|||
Copyright 2008, Google Inc. |
|||
All rights reserved. |
|||
|
|||
Redistribution and use in source and binary forms, with or without |
|||
modification, are permitted provided that the following conditions are |
|||
met: |
|||
|
|||
* Redistributions of source code must retain the above copyright |
|||
notice, this list of conditions and the following disclaimer. |
|||
* Redistributions in binary form must reproduce the above |
|||
copyright notice, this list of conditions and the following disclaimer |
|||
in the documentation and/or other materials provided with the |
|||
distribution. |
|||
* Neither the name of Google Inc. nor the names of its |
|||
contributors may be used to endorse or promote products derived from |
|||
this software without specific prior written permission. |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
========================================= |
|||
END OF Google Test Framework NOTICES, INFORMATION, AND LICENSE |
|||
|
|||
|
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="參考的套件" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="使用 Google Test 的主要函式" Description="使用 Google Test 架構提供的主要函式" Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="是" /> |
|||
<EnumValue Name="true" DisplayName="否" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="Odkazované balíčky" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="Použít hlavní funkci Google Test" Description="Použít funkci main poskytovanou rozhraním Google Test" Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="Ano" /> |
|||
<EnumValue Name="true" DisplayName="Ne" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="Referenzierte Pakete" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="Hauptfunktion von Google Test verwenden" Description="Verwenden Sie die vom Google Test-Framework bereitgestellte Hauptfunktion." Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="Ja" /> |
|||
<EnumValue Name="true" DisplayName="Nein" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="Referenced Packages" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="Use Google Test's main Function" Description="Use the main function provided by the Google Test framework." Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="Yes" /> |
|||
<EnumValue Name="true" DisplayName="No" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="Paquetes a los que se hace referencia" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="Usar la función principal de Google Test" Description="Usar la función principal proporcionada por el marco de Google Test" Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="Sí" /> |
|||
<EnumValue Name="true" DisplayName="No" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="Packages référencés" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="Utiliser la fonction principale de Google Test" Description="Utiliser la fonction principale fournie par l’infrastructure Google Test" Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="Oui" /> |
|||
<EnumValue Name="true" DisplayName="Non" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="Pacchetti di riferimento" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="Usa la funzione main di Google Test" Description="Usa la funzione principale fornita dal framework di Google Test" Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="Sì" /> |
|||
<EnumValue Name="true" DisplayName="No" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="参照されたパッケージ" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="Google Test の主な機能を使用します" Description="Google Test フレームワークによって提供される主な関数を使用する" Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="はい" /> |
|||
<EnumValue Name="true" DisplayName="いいえ" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="참조된 패키지" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="Google Test의 main 함수 사용" Description="Google Test Framework에서 제공하는 기본 기능 사용" Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="예" /> |
|||
<EnumValue Name="true" DisplayName="아니요" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="Przywoływane pakiety" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="Użyj funkcji main biblioteki Google Test" Description="Użyj głównej funkcji udostępnianej przez strukturę Google Test" Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="Tak" /> |
|||
<EnumValue Name="true" DisplayName="Nie" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="Pacotes referenciados" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="Usar a função principal do Google Test" Description="Use a função principal fornecida pela estrutura do Google Test" Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="Sim" /> |
|||
<EnumValue Name="true" DisplayName="Não" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="Пакеты, на которые имеются ссылки" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="Использовать основную функцию Google Test" Description="Использовать основную функцию, предоставляемую платформой Google Test" Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="Да" /> |
|||
<EnumValue Name="true" DisplayName="Нет" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="Başvurulan Paketler" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="Google Test'in ana işlevini kullanın" Description="Google Test altyapısı tarafından sağlanan main işlevini kullan" Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="Evet" /> |
|||
<EnumValue Name="true" DisplayName="Hayır" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework"> |
|||
<Rule Name="ReferencedPackages-Microsoft-GoogleTest" PageTemplate="tool" DisplayName="引用的包" SwitchPrefix="/" Order="1"> |
|||
<Rule.Categories> |
|||
<Category Name="Google Test" DisplayName="Google Test" /> |
|||
</Rule.Categories> |
|||
<Rule.DataSource> |
|||
<DataSource Persistence="ProjectFile" ItemType="" /> |
|||
</Rule.DataSource> |
|||
<EnumProperty Name="Microsoft-GoogleTest-Disable-gtest_main" DisplayName="使用 Google Test 的主要函数" Description="使用 Google Test 框架提供的主函数" Category="Google Test"> |
|||
<!-- Note that UI and code behind have the logic inversed; this is to have "Yes" treated as the default. --> |
|||
<EnumValue Name="" DisplayName="是" /> |
|||
<EnumValue Name="true" DisplayName="否" /> |
|||
</EnumProperty> |
|||
</Rule> |
|||
</ProjectSchemaDefinitions> |
@ -0,0 +1,66 @@ |
|||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
|||
<PropertyGroup Condition="'$(Force-Enable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn)' == '' And (('$(PlatformToolset)' != 'v143' And '$(PlatformToolset)' != 'v142' And '$(PlatformToolset)' != 'v141' And '$(PlatformToolset)' != 'v140') Or '$(ApplicationType)' != '')"> |
|||
<Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn>true</Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn> |
|||
</PropertyGroup> |
|||
<PropertyGroup Condition="'$(Force-Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn)' != ''"> |
|||
<Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn>true</Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn> |
|||
</PropertyGroup> |
|||
<ItemGroup Condition="'$(Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn)' == ''"> |
|||
<PropertyPageSchema Include="$(MSBuildThisFileDirectory)\$(LangID)\googletest.propertiesui.xml" /> |
|||
</ItemGroup> |
|||
<ItemDefinitionGroup Condition="'$(Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn)' == ''"> |
|||
<Link> |
|||
<AdditionalDependencies Condition="'$(Configuration)' == 'Debug' And '$(Platform)' == 'x64'">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x64\Debug\gtestd.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' == 'Debug' And '$(Platform)' == 'x64' And '$(Microsoft-GoogleTest-Disable-gtest_main)' == ''">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x64\Debug\gtest_maind.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' != 'Debug' And '$(Platform)' == 'x64'">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x64\Release\gtest.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' != 'Debug' And '$(Platform)' == 'x64' And '$(Microsoft-GoogleTest-Disable-gtest_main)' == ''">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x64\Release\gtest_main.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' == 'Debug' And ('$(Platform)' == 'Win32' Or '$(Platform)' == 'x86')">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x86\Debug\gtestd.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' == 'Debug' And ('$(Platform)' == 'Win32' Or '$(Platform)' == 'x86') And '$(Microsoft-GoogleTest-Disable-gtest_main)' == ''">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x86\Debug\gtest_maind.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' != 'Debug' And ('$(Platform)' == 'Win32' Or '$(Platform)' == 'x86')">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x86\Release\gtest.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' != 'Debug' And ('$(Platform)' == 'Win32' Or '$(Platform)' == 'x86') And '$(Microsoft-GoogleTest-Disable-gtest_main)' == ''">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x86\Release\gtest_main.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' == 'Debug' And '$(Platform)' == 'arm64'">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm64\Debug\gtestd.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' == 'Debug' And '$(Platform)' == 'arm64' And '$(Microsoft-GoogleTest-Disable-gtest_main)' == ''">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm64\Debug\gtest_maind.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' != 'Debug' And '$(Platform)' == 'arm64'">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm64\Release\gtest.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' != 'Debug' And '$(Platform)' == 'arm64' And '$(Microsoft-GoogleTest-Disable-gtest_main)' == ''">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm64\Release\gtest_main.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' == 'Debug' And '$(Platform)' == 'arm'">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm\Debug\gtestd.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' == 'Debug' And '$(Platform)' == 'arm' And '$(Microsoft-GoogleTest-Disable-gtest_main)' == ''">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm\Debug\gtest_maind.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' != 'Debug' And '$(Platform)' == 'arm'">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm\Release\gtest.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
<AdditionalDependencies Condition="'$(Configuration)' != 'Debug' And '$(Platform)' == 'arm' And '$(Microsoft-GoogleTest-Disable-gtest_main)' == ''">$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm\Release\gtest_main.lib;%(AdditionalDependencies)</AdditionalDependencies> |
|||
</Link> |
|||
<ClCompile> |
|||
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
|||
</ClCompile> |
|||
</ItemDefinitionGroup> |
|||
<ItemGroup Condition="'$(Configuration)' == 'Debug' And '$(Platform)' == 'x64' And '$(Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn)' == ''"> |
|||
<ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x64\Debug\gtest.pdb" /> |
|||
<ReferenceCopyLocalPaths Condition="'$(Microsoft-GoogleTest-Disable-gtest_main)' == ''" Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x64\Debug\gtest_main.pdb" /> |
|||
</ItemGroup> |
|||
<ItemGroup Condition="'$(Configuration)' != 'Debug' And '$(Platform)' == 'x64' And '$(Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn)' == ''"> |
|||
<ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x64\Release\gtest.pdb" /> |
|||
<ReferenceCopyLocalPaths Condition="'$(Microsoft-GoogleTest-Disable-gtest_main)' == ''" Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x64\Release\gtest_main.pdb" /> |
|||
</ItemGroup> |
|||
<ItemGroup Condition="'$(Configuration)' == 'Debug' And ('$(Platform)' == 'Win32' Or '$(Platform)' == 'x86') And '$(Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn)' == ''"> |
|||
<ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x86\Debug\gtest.pdb" /> |
|||
<ReferenceCopyLocalPaths Condition="'$(Microsoft-GoogleTest-Disable-gtest_main)' == ''" Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x86\Debug\gtest_main.pdb" /> |
|||
</ItemGroup> |
|||
<ItemGroup Condition="'$(Configuration)' != 'Debug' And ('$(Platform)' == 'Win32' Or '$(Platform)' == 'x86') And '$(Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn)' == ''"> |
|||
<ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x86\Release\gtest.pdb" /> |
|||
<ReferenceCopyLocalPaths Condition="'$(Microsoft-GoogleTest-Disable-gtest_main)' == ''" Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\x86\Release\gtest_main.pdb" /> |
|||
</ItemGroup> |
|||
<ItemGroup Condition="'$(Configuration)' == 'Debug' And '$(Platform)' == 'arm64' And '$(Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn)' == ''"> |
|||
<ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm64\Debug\gtest.pdb" /> |
|||
<ReferenceCopyLocalPaths Condition="'$(Microsoft-GoogleTest-Disable-gtest_main)' == ''" Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm64\Debug\gtest_main.pdb" /> |
|||
</ItemGroup> |
|||
<ItemGroup Condition="'$(Configuration)' != 'Debug' And '$(Platform)' == 'arm64' And '$(Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn)' == ''"> |
|||
<ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm64\Release\gtest.pdb" /> |
|||
<ReferenceCopyLocalPaths Condition="'$(Microsoft-GoogleTest-Disable-gtest_main)' == ''" Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm64\Release\gtest_main.pdb" /> |
|||
</ItemGroup> |
|||
<ItemGroup Condition="'$(Configuration)' == 'Debug' And '$(Platform)' == 'arm' And '$(Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn)' == ''"> |
|||
<ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm\Debug\gtest.pdb" /> |
|||
<ReferenceCopyLocalPaths Condition="'$(Microsoft-GoogleTest-Disable-gtest_main)' == ''" Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm\Debug\gtest_main.pdb" /> |
|||
</ItemGroup> |
|||
<ItemGroup Condition="'$(Configuration)' != 'Debug' And '$(Platform)' == 'arm' And '$(Disable-Microsoft-googletest-v140-windesktop-msvcstl-static-rt-dyn)' == ''"> |
|||
<ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm\Release\gtest.pdb" /> |
|||
<ReferenceCopyLocalPaths Condition="'$(Microsoft-GoogleTest-Disable-gtest_main)' == ''" Include="$(MSBuildThisFileDirectory)..\..\lib\native\v140\windesktop\msvcstl\static\rt-dyn\arm\Release\gtest_main.pdb" /> |
|||
</ItemGroup> |
|||
</Project> |
@ -0,0 +1,344 @@ |
|||
// Copyright 2005, Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|||
//
|
|||
// The Google C++ Testing and Mocking Framework (Google Test)
|
|||
//
|
|||
// This header file defines the public API for death tests. It is
|
|||
// #included by gtest.h so a user doesn't need to include this
|
|||
// directly.
|
|||
// GOOGLETEST_CM0001 DO NOT DELETE
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ |
|||
#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ |
|||
|
|||
#include "gtest/internal/gtest-death-test-internal.h" |
|||
|
|||
namespace testing { |
|||
|
|||
// This flag controls the style of death tests. Valid values are "threadsafe",
|
|||
// meaning that the death test child process will re-execute the test binary
|
|||
// from the start, running only a single death test, or "fast",
|
|||
// meaning that the child process will execute the test logic immediately
|
|||
// after forking.
|
|||
GTEST_DECLARE_string_(death_test_style); |
|||
|
|||
#if GTEST_HAS_DEATH_TEST |
|||
|
|||
namespace internal { |
|||
|
|||
// Returns a Boolean value indicating whether the caller is currently
|
|||
// executing in the context of the death test child process. Tools such as
|
|||
// Valgrind heap checkers may need this to modify their behavior in death
|
|||
// tests. IMPORTANT: This is an internal utility. Using it may break the
|
|||
// implementation of death tests. User code MUST NOT use it.
|
|||
GTEST_API_ bool InDeathTestChild(); |
|||
|
|||
} // namespace internal
|
|||
|
|||
// The following macros are useful for writing death tests.
|
|||
|
|||
// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
|
|||
// executed:
|
|||
//
|
|||
// 1. It generates a warning if there is more than one active
|
|||
// thread. This is because it's safe to fork() or clone() only
|
|||
// when there is a single thread.
|
|||
//
|
|||
// 2. The parent process clone()s a sub-process and runs the death
|
|||
// test in it; the sub-process exits with code 0 at the end of the
|
|||
// death test, if it hasn't exited already.
|
|||
//
|
|||
// 3. The parent process waits for the sub-process to terminate.
|
|||
//
|
|||
// 4. The parent process checks the exit code and error message of
|
|||
// the sub-process.
|
|||
//
|
|||
// Examples:
|
|||
//
|
|||
// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
|
|||
// for (int i = 0; i < 5; i++) {
|
|||
// EXPECT_DEATH(server.ProcessRequest(i),
|
|||
// "Invalid request .* in ProcessRequest()")
|
|||
// << "Failed to die on request " << i;
|
|||
// }
|
|||
//
|
|||
// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
|
|||
//
|
|||
// bool KilledBySIGHUP(int exit_code) {
|
|||
// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
|
|||
// }
|
|||
//
|
|||
// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
|
|||
//
|
|||
// On the regular expressions used in death tests:
|
|||
//
|
|||
// GOOGLETEST_CM0005 DO NOT DELETE
|
|||
// On POSIX-compliant systems (*nix), we use the <regex.h> library,
|
|||
// which uses the POSIX extended regex syntax.
|
|||
//
|
|||
// On other platforms (e.g. Windows or Mac), we only support a simple regex
|
|||
// syntax implemented as part of Google Test. This limited
|
|||
// implementation should be enough most of the time when writing
|
|||
// death tests; though it lacks many features you can find in PCRE
|
|||
// or POSIX extended regex syntax. For example, we don't support
|
|||
// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
|
|||
// repetition count ("x{5,7}"), among others.
|
|||
//
|
|||
// Below is the syntax that we do support. We chose it to be a
|
|||
// subset of both PCRE and POSIX extended regex, so it's easy to
|
|||
// learn wherever you come from. In the following: 'A' denotes a
|
|||
// literal character, period (.), or a single \\ escape sequence;
|
|||
// 'x' and 'y' denote regular expressions; 'm' and 'n' are for
|
|||
// natural numbers.
|
|||
//
|
|||
// c matches any literal character c
|
|||
// \\d matches any decimal digit
|
|||
// \\D matches any character that's not a decimal digit
|
|||
// \\f matches \f
|
|||
// \\n matches \n
|
|||
// \\r matches \r
|
|||
// \\s matches any ASCII whitespace, including \n
|
|||
// \\S matches any character that's not a whitespace
|
|||
// \\t matches \t
|
|||
// \\v matches \v
|
|||
// \\w matches any letter, _, or decimal digit
|
|||
// \\W matches any character that \\w doesn't match
|
|||
// \\c matches any literal character c, which must be a punctuation
|
|||
// . matches any single character except \n
|
|||
// A? matches 0 or 1 occurrences of A
|
|||
// A* matches 0 or many occurrences of A
|
|||
// A+ matches 1 or many occurrences of A
|
|||
// ^ matches the beginning of a string (not that of each line)
|
|||
// $ matches the end of a string (not that of each line)
|
|||
// xy matches x followed by y
|
|||
//
|
|||
// If you accidentally use PCRE or POSIX extended regex features
|
|||
// not implemented by us, you will get a run-time failure. In that
|
|||
// case, please try to rewrite your regular expression within the
|
|||
// above syntax.
|
|||
//
|
|||
// This implementation is *not* meant to be as highly tuned or robust
|
|||
// as a compiled regex library, but should perform well enough for a
|
|||
// death test, which already incurs significant overhead by launching
|
|||
// a child process.
|
|||
//
|
|||
// Known caveats:
|
|||
//
|
|||
// A "threadsafe" style death test obtains the path to the test
|
|||
// program from argv[0] and re-executes it in the sub-process. For
|
|||
// simplicity, the current implementation doesn't search the PATH
|
|||
// when launching the sub-process. This means that the user must
|
|||
// invoke the test program via a path that contains at least one
|
|||
// path separator (e.g. path/to/foo_test and
|
|||
// /absolute/path/to/bar_test are fine, but foo_test is not). This
|
|||
// is rarely a problem as people usually don't put the test binary
|
|||
// directory in PATH.
|
|||
//
|
|||
// FIXME: make thread-safe death tests search the PATH.
|
|||
|
|||
// Asserts that a given statement causes the program to exit, with an
|
|||
// integer exit status that satisfies predicate, and emitting error output
|
|||
// that matches regex.
|
|||
# define ASSERT_EXIT(statement, predicate, regex) \ |
|||
GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_) |
|||
|
|||
// Like ASSERT_EXIT, but continues on to successive tests in the
|
|||
// test case, if any:
|
|||
# define EXPECT_EXIT(statement, predicate, regex) \ |
|||
GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_) |
|||
|
|||
// Asserts that a given statement causes the program to exit, either by
|
|||
// explicitly exiting with a nonzero exit code or being killed by a
|
|||
// signal, and emitting error output that matches regex.
|
|||
# define ASSERT_DEATH(statement, regex) \ |
|||
ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) |
|||
|
|||
// Like ASSERT_DEATH, but continues on to successive tests in the
|
|||
// test case, if any:
|
|||
# define EXPECT_DEATH(statement, regex) \ |
|||
EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) |
|||
|
|||
// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
|
|||
|
|||
// Tests that an exit code describes a normal exit with a given exit code.
|
|||
class GTEST_API_ ExitedWithCode { |
|||
public: |
|||
explicit ExitedWithCode(int exit_code); |
|||
bool operator()(int exit_status) const; |
|||
private: |
|||
// No implementation - assignment is unsupported.
|
|||
void operator=(const ExitedWithCode& other); |
|||
|
|||
const int exit_code_; |
|||
}; |
|||
|
|||
# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA |
|||
// Tests that an exit code describes an exit due to termination by a
|
|||
// given signal.
|
|||
// GOOGLETEST_CM0006 DO NOT DELETE
|
|||
class GTEST_API_ KilledBySignal { |
|||
public: |
|||
explicit KilledBySignal(int signum); |
|||
bool operator()(int exit_status) const; |
|||
private: |
|||
const int signum_; |
|||
}; |
|||
# endif // !GTEST_OS_WINDOWS
|
|||
|
|||
// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
|
|||
// The death testing framework causes this to have interesting semantics,
|
|||
// since the sideeffects of the call are only visible in opt mode, and not
|
|||
// in debug mode.
|
|||
//
|
|||
// In practice, this can be used to test functions that utilize the
|
|||
// LOG(DFATAL) macro using the following style:
|
|||
//
|
|||
// int DieInDebugOr12(int* sideeffect) {
|
|||
// if (sideeffect) {
|
|||
// *sideeffect = 12;
|
|||
// }
|
|||
// LOG(DFATAL) << "death";
|
|||
// return 12;
|
|||
// }
|
|||
//
|
|||
// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
|
|||
// int sideeffect = 0;
|
|||
// // Only asserts in dbg.
|
|||
// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
|
|||
//
|
|||
// #ifdef NDEBUG
|
|||
// // opt-mode has sideeffect visible.
|
|||
// EXPECT_EQ(12, sideeffect);
|
|||
// #else
|
|||
// // dbg-mode no visible sideeffect.
|
|||
// EXPECT_EQ(0, sideeffect);
|
|||
// #endif
|
|||
// }
|
|||
//
|
|||
// This will assert that DieInDebugReturn12InOpt() crashes in debug
|
|||
// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
|
|||
// appropriate fallback value (12 in this case) in opt mode. If you
|
|||
// need to test that a function has appropriate side-effects in opt
|
|||
// mode, include assertions against the side-effects. A general
|
|||
// pattern for this is:
|
|||
//
|
|||
// EXPECT_DEBUG_DEATH({
|
|||
// // Side-effects here will have an effect after this statement in
|
|||
// // opt mode, but none in debug mode.
|
|||
// EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
|
|||
// }, "death");
|
|||
//
|
|||
# ifdef NDEBUG |
|||
|
|||
# define EXPECT_DEBUG_DEATH(statement, regex) \ |
|||
GTEST_EXECUTE_STATEMENT_(statement, regex) |
|||
|
|||
# define ASSERT_DEBUG_DEATH(statement, regex) \ |
|||
GTEST_EXECUTE_STATEMENT_(statement, regex) |
|||
|
|||
# else |
|||
|
|||
# define EXPECT_DEBUG_DEATH(statement, regex) \ |
|||
EXPECT_DEATH(statement, regex) |
|||
|
|||
# define ASSERT_DEBUG_DEATH(statement, regex) \ |
|||
ASSERT_DEATH(statement, regex) |
|||
|
|||
# endif // NDEBUG for EXPECT_DEBUG_DEATH
|
|||
#endif // GTEST_HAS_DEATH_TEST
|
|||
|
|||
// This macro is used for implementing macros such as
|
|||
// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
|
|||
// death tests are not supported. Those macros must compile on such systems
|
|||
// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
|
|||
// systems that support death tests. This allows one to write such a macro
|
|||
// on a system that does not support death tests and be sure that it will
|
|||
// compile on a death-test supporting system. It is exposed publicly so that
|
|||
// systems that have death-tests with stricter requirements than
|
|||
// GTEST_HAS_DEATH_TEST can write their own equivalent of
|
|||
// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED.
|
|||
//
|
|||
// Parameters:
|
|||
// statement - A statement that a macro such as EXPECT_DEATH would test
|
|||
// for program termination. This macro has to make sure this
|
|||
// statement is compiled but not executed, to ensure that
|
|||
// EXPECT_DEATH_IF_SUPPORTED compiles with a certain
|
|||
// parameter iff EXPECT_DEATH compiles with it.
|
|||
// regex - A regex that a macro such as EXPECT_DEATH would use to test
|
|||
// the output of statement. This parameter has to be
|
|||
// compiled but not evaluated by this macro, to ensure that
|
|||
// this macro only accepts expressions that a macro such as
|
|||
// EXPECT_DEATH would accept.
|
|||
// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
|
|||
// and a return statement for ASSERT_DEATH_IF_SUPPORTED.
|
|||
// This ensures that ASSERT_DEATH_IF_SUPPORTED will not
|
|||
// compile inside functions where ASSERT_DEATH doesn't
|
|||
// compile.
|
|||
//
|
|||
// The branch that has an always false condition is used to ensure that
|
|||
// statement and regex are compiled (and thus syntactically correct) but
|
|||
// never executed. The unreachable code macro protects the terminator
|
|||
// statement from generating an 'unreachable code' warning in case
|
|||
// statement unconditionally returns or throws. The Message constructor at
|
|||
// the end allows the syntax of streaming additional messages into the
|
|||
// macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
|
|||
# define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, terminator) \ |
|||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ |
|||
if (::testing::internal::AlwaysTrue()) { \ |
|||
GTEST_LOG_(WARNING) \ |
|||
<< "Death tests are not supported on this platform.\n" \ |
|||
<< "Statement '" #statement "' cannot be verified."; \ |
|||
} else if (::testing::internal::AlwaysFalse()) { \ |
|||
::testing::internal::RE::PartialMatch(".*", (regex)); \ |
|||
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ |
|||
terminator; \ |
|||
} else \ |
|||
::testing::Message() |
|||
|
|||
// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
|
|||
// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
|
|||
// death tests are supported; otherwise they just issue a warning. This is
|
|||
// useful when you are combining death test assertions with normal test
|
|||
// assertions in one test.
|
|||
#if GTEST_HAS_DEATH_TEST |
|||
# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ |
|||
EXPECT_DEATH(statement, regex) |
|||
# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ |
|||
ASSERT_DEATH(statement, regex) |
|||
#else |
|||
# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ |
|||
GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, ) |
|||
# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ |
|||
GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, return) |
|||
#endif |
|||
|
|||
} // namespace testing
|
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
|
@ -0,0 +1,255 @@ |
|||
// Copyright 2005, Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|||
//
|
|||
// The Google C++ Testing and Mocking Framework (Google Test)
|
|||
//
|
|||
// This header file defines the Message class.
|
|||
//
|
|||
// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
|
|||
// leave some internal implementation details in this header file.
|
|||
// They are clearly marked by comments like this:
|
|||
//
|
|||
// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
|||
//
|
|||
// Such code is NOT meant to be used by a user directly, and is subject
|
|||
// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
|
|||
// program!
|
|||
|
|||
// GOOGLETEST_CM0001 DO NOT DELETE
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ |
|||
#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ |
|||
|
|||
#include <limits> |
|||
|
|||
#include "gtest/internal/gtest-port.h" |
|||
|
|||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ |
|||
/* class A needs to have dll-interface to be used by clients of class B */) |
|||
|
|||
// Ensures that there is at least one operator<< in the global namespace.
|
|||
// See Message& operator<<(...) below for why.
|
|||
void operator<<(const testing::internal::Secret&, int); |
|||
|
|||
namespace testing { |
|||
|
|||
// The Message class works like an ostream repeater.
|
|||
//
|
|||
// Typical usage:
|
|||
//
|
|||
// 1. You stream a bunch of values to a Message object.
|
|||
// It will remember the text in a stringstream.
|
|||
// 2. Then you stream the Message object to an ostream.
|
|||
// This causes the text in the Message to be streamed
|
|||
// to the ostream.
|
|||
//
|
|||
// For example;
|
|||
//
|
|||
// testing::Message foo;
|
|||
// foo << 1 << " != " << 2;
|
|||
// std::cout << foo;
|
|||
//
|
|||
// will print "1 != 2".
|
|||
//
|
|||
// Message is not intended to be inherited from. In particular, its
|
|||
// destructor is not virtual.
|
|||
//
|
|||
// Note that stringstream behaves differently in gcc and in MSVC. You
|
|||
// can stream a NULL char pointer to it in the former, but not in the
|
|||
// latter (it causes an access violation if you do). The Message
|
|||
// class hides this difference by treating a NULL char pointer as
|
|||
// "(null)".
|
|||
class GTEST_API_ Message { |
|||
private: |
|||
// The type of basic IO manipulators (endl, ends, and flush) for
|
|||
// narrow streams.
|
|||
typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&); |
|||
|
|||
public: |
|||
// Constructs an empty Message.
|
|||
Message(); |
|||
|
|||
// Copy constructor.
|
|||
Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT
|
|||
*ss_ << msg.GetString(); |
|||
} |
|||
|
|||
// Constructs a Message from a C-string.
|
|||
explicit Message(const char* str) : ss_(new ::std::stringstream) { |
|||
*ss_ << str; |
|||
} |
|||
|
|||
#if GTEST_OS_SYMBIAN |
|||
// Streams a value (either a pointer or not) to this object.
|
|||
template <typename T> |
|||
inline Message& operator <<(const T& value) { |
|||
StreamHelper(typename internal::is_pointer<T>::type(), value); |
|||
return *this; |
|||
} |
|||
#else |
|||
// Streams a non-pointer value to this object.
|
|||
template <typename T> |
|||
inline Message& operator <<(const T& val) { |
|||
// Some libraries overload << for STL containers. These
|
|||
// overloads are defined in the global namespace instead of ::std.
|
|||
//
|
|||
// C++'s symbol lookup rule (i.e. Koenig lookup) says that these
|
|||
// overloads are visible in either the std namespace or the global
|
|||
// namespace, but not other namespaces, including the testing
|
|||
// namespace which Google Test's Message class is in.
|
|||
//
|
|||
// To allow STL containers (and other types that has a << operator
|
|||
// defined in the global namespace) to be used in Google Test
|
|||
// assertions, testing::Message must access the custom << operator
|
|||
// from the global namespace. With this using declaration,
|
|||
// overloads of << defined in the global namespace and those
|
|||
// visible via Koenig lookup are both exposed in this function.
|
|||
using ::operator <<; |
|||
*ss_ << val; |
|||
return *this; |
|||
} |
|||
|
|||
// Streams a pointer value to this object.
|
|||
//
|
|||
// This function is an overload of the previous one. When you
|
|||
// stream a pointer to a Message, this definition will be used as it
|
|||
// is more specialized. (The C++ Standard, section
|
|||
// [temp.func.order].) If you stream a non-pointer, then the
|
|||
// previous definition will be used.
|
|||
//
|
|||
// The reason for this overload is that streaming a NULL pointer to
|
|||
// ostream is undefined behavior. Depending on the compiler, you
|
|||
// may get "0", "(nil)", "(null)", or an access violation. To
|
|||
// ensure consistent result across compilers, we always treat NULL
|
|||
// as "(null)".
|
|||
template <typename T> |
|||
inline Message& operator <<(T* const& pointer) { // NOLINT
|
|||
if (pointer == NULL) { |
|||
*ss_ << "(null)"; |
|||
} else { |
|||
*ss_ << pointer; |
|||
} |
|||
return *this; |
|||
} |
|||
#endif // GTEST_OS_SYMBIAN
|
|||
|
|||
// Since the basic IO manipulators are overloaded for both narrow
|
|||
// and wide streams, we have to provide this specialized definition
|
|||
// of operator <<, even though its body is the same as the
|
|||
// templatized version above. Without this definition, streaming
|
|||
// endl or other basic IO manipulators to Message will confuse the
|
|||
// compiler.
|
|||
Message& operator <<(BasicNarrowIoManip val) { |
|||
*ss_ << val; |
|||
return *this; |
|||
} |
|||
|
|||
// Instead of 1/0, we want to see true/false for bool values.
|
|||
Message& operator <<(bool b) { |
|||
return *this << (b ? "true" : "false"); |
|||
} |
|||
|
|||
// These two overloads allow streaming a wide C string to a Message
|
|||
// using the UTF-8 encoding.
|
|||
Message& operator <<(const wchar_t* wide_c_str); |
|||
Message& operator <<(wchar_t* wide_c_str); |
|||
|
|||
#if GTEST_HAS_STD_WSTRING |
|||
// Converts the given wide string to a narrow string using the UTF-8
|
|||
// encoding, and streams the result to this Message object.
|
|||
Message& operator <<(const ::std::wstring& wstr); |
|||
#endif // GTEST_HAS_STD_WSTRING
|
|||
|
|||
#if GTEST_HAS_GLOBAL_WSTRING |
|||
// Converts the given wide string to a narrow string using the UTF-8
|
|||
// encoding, and streams the result to this Message object.
|
|||
Message& operator <<(const ::wstring& wstr); |
|||
#endif // GTEST_HAS_GLOBAL_WSTRING
|
|||
|
|||
// Gets the text streamed to this object so far as an std::string.
|
|||
// Each '\0' character in the buffer is replaced with "\\0".
|
|||
//
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
|||
std::string GetString() const; |
|||
|
|||
private: |
|||
#if GTEST_OS_SYMBIAN |
|||
// These are needed as the Nokia Symbian Compiler cannot decide between
|
|||
// const T& and const T* in a function template. The Nokia compiler _can_
|
|||
// decide between class template specializations for T and T*, so a
|
|||
// tr1::type_traits-like is_pointer works, and we can overload on that.
|
|||
template <typename T> |
|||
inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) { |
|||
if (pointer == NULL) { |
|||
*ss_ << "(null)"; |
|||
} else { |
|||
*ss_ << pointer; |
|||
} |
|||
} |
|||
template <typename T> |
|||
inline void StreamHelper(internal::false_type /*is_pointer*/, |
|||
const T& value) { |
|||
// See the comments in Message& operator <<(const T&) above for why
|
|||
// we need this using statement.
|
|||
using ::operator <<; |
|||
*ss_ << value; |
|||
} |
|||
#endif // GTEST_OS_SYMBIAN
|
|||
|
|||
// We'll hold the text streamed to this object here.
|
|||
const internal::scoped_ptr< ::std::stringstream> ss_; |
|||
|
|||
// We declare (but don't implement) this to prevent the compiler
|
|||
// from implementing the assignment operator.
|
|||
void operator=(const Message&); |
|||
}; |
|||
|
|||
// Streams a Message to an ostream.
|
|||
inline std::ostream& operator <<(std::ostream& os, const Message& sb) { |
|||
return os << sb.GetString(); |
|||
} |
|||
|
|||
namespace internal { |
|||
|
|||
// Converts a streamable value to an std::string. A NULL pointer is
|
|||
// converted to "(null)". When the input value is a ::string,
|
|||
// ::std::string, ::wstring, or ::std::wstring object, each NUL
|
|||
// character in it is replaced with "\\0".
|
|||
template <typename T> |
|||
std::string StreamableToString(const T& streamable) { |
|||
return (Message() << streamable).GetString(); |
|||
} |
|||
|
|||
} // namespace internal
|
|||
} // namespace testing
|
|||
|
|||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
|
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
|
File diff suppressed because it is too large
@ -0,0 +1,500 @@ |
|||
$$ -*- mode: c++; -*- |
|||
$var n = 50 $$ Maximum length of Values arguments we want to support. |
|||
$var maxtuple = 10 $$ Maximum number of Combine arguments we want to support. |
|||
// Copyright 2008, Google Inc. |
|||
// All rights reserved. |
|||
// |
|||
// Redistribution and use in source and binary forms, with or without |
|||
// modification, are permitted provided that the following conditions are |
|||
// met: |
|||
// |
|||
// * Redistributions of source code must retain the above copyright |
|||
// notice, this list of conditions and the following disclaimer. |
|||
// * Redistributions in binary form must reproduce the above |
|||
// copyright notice, this list of conditions and the following disclaimer |
|||
// in the documentation and/or other materials provided with the |
|||
// distribution. |
|||
// * Neither the name of Google Inc. nor the names of its |
|||
// contributors may be used to endorse or promote products derived from |
|||
// this software without specific prior written permission. |
|||
// |
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
// |
|||
// Macros and functions for implementing parameterized tests |
|||
// in Google C++ Testing and Mocking Framework (Google Test) |
|||
// |
|||
// This file is generated by a SCRIPT. DO NOT EDIT BY HAND! |
|||
// |
|||
// GOOGLETEST_CM0001 DO NOT DELETE |
|||
#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ |
|||
#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ |
|||
|
|||
|
|||
// Value-parameterized tests allow you to test your code with different |
|||
// parameters without writing multiple copies of the same test. |
|||
// |
|||
// Here is how you use value-parameterized tests: |
|||
|
|||
#if 0 |
|||
|
|||
// To write value-parameterized tests, first you should define a fixture |
|||
// class. It is usually derived from testing::TestWithParam<T> (see below for |
|||
// another inheritance scheme that's sometimes useful in more complicated |
|||
// class hierarchies), where the type of your parameter values. |
|||
// TestWithParam<T> is itself derived from testing::Test. T can be any |
|||
// copyable type. If it's a raw pointer, you are responsible for managing the |
|||
// lifespan of the pointed values. |
|||
|
|||
class FooTest : public ::testing::TestWithParam<const char*> { |
|||
// You can implement all the usual class fixture members here. |
|||
}; |
|||
|
|||
// Then, use the TEST_P macro to define as many parameterized tests |
|||
// for this fixture as you want. The _P suffix is for "parameterized" |
|||
// or "pattern", whichever you prefer to think. |
|||
|
|||
TEST_P(FooTest, DoesBlah) { |
|||
// Inside a test, access the test parameter with the GetParam() method |
|||
// of the TestWithParam<T> class: |
|||
EXPECT_TRUE(foo.Blah(GetParam())); |
|||
... |
|||
} |
|||
|
|||
TEST_P(FooTest, HasBlahBlah) { |
|||
... |
|||
} |
|||
|
|||
// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test |
|||
// case with any set of parameters you want. Google Test defines a number |
|||
// of functions for generating test parameters. They return what we call |
|||
// (surprise!) parameter generators. Here is a summary of them, which |
|||
// are all in the testing namespace: |
|||
// |
|||
// |
|||
// Range(begin, end [, step]) - Yields values {begin, begin+step, |
|||
// begin+step+step, ...}. The values do not |
|||
// include end. step defaults to 1. |
|||
// Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}. |
|||
// ValuesIn(container) - Yields values from a C-style array, an STL |
|||
// ValuesIn(begin,end) container, or an iterator range [begin, end). |
|||
// Bool() - Yields sequence {false, true}. |
|||
// Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product |
|||
// for the math savvy) of the values generated |
|||
// by the N generators. |
|||
// |
|||
// For more details, see comments at the definitions of these functions below |
|||
// in this file. |
|||
// |
|||
// The following statement will instantiate tests from the FooTest test case |
|||
// each with parameter values "meeny", "miny", and "moe". |
|||
|
|||
INSTANTIATE_TEST_CASE_P(InstantiationName, |
|||
FooTest, |
|||
Values("meeny", "miny", "moe")); |
|||
|
|||
// To distinguish different instances of the pattern, (yes, you |
|||
// can instantiate it more then once) the first argument to the |
|||
// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the |
|||
// actual test case name. Remember to pick unique prefixes for different |
|||
// instantiations. The tests from the instantiation above will have |
|||
// these names: |
|||
// |
|||
// * InstantiationName/FooTest.DoesBlah/0 for "meeny" |
|||
// * InstantiationName/FooTest.DoesBlah/1 for "miny" |
|||
// * InstantiationName/FooTest.DoesBlah/2 for "moe" |
|||
// * InstantiationName/FooTest.HasBlahBlah/0 for "meeny" |
|||
// * InstantiationName/FooTest.HasBlahBlah/1 for "miny" |
|||
// * InstantiationName/FooTest.HasBlahBlah/2 for "moe" |
|||
// |
|||
// You can use these names in --gtest_filter. |
|||
// |
|||
// This statement will instantiate all tests from FooTest again, each |
|||
// with parameter values "cat" and "dog": |
|||
|
|||
const char* pets[] = {"cat", "dog"}; |
|||
INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets)); |
|||
|
|||
// The tests from the instantiation above will have these names: |
|||
// |
|||
// * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat" |
|||
// * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog" |
|||
// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat" |
|||
// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog" |
|||
// |
|||
// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests |
|||
// in the given test case, whether their definitions come before or |
|||
// AFTER the INSTANTIATE_TEST_CASE_P statement. |
|||
// |
|||
// Please also note that generator expressions (including parameters to the |
|||
// generators) are evaluated in InitGoogleTest(), after main() has started. |
|||
// This allows the user on one hand, to adjust generator parameters in order |
|||
// to dynamically determine a set of tests to run and on the other hand, |
|||
// give the user a chance to inspect the generated tests with Google Test |
|||
// reflection API before RUN_ALL_TESTS() is executed. |
|||
// |
|||
// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc |
|||
// for more examples. |
|||
// |
|||
// In the future, we plan to publish the API for defining new parameter |
|||
// generators. But for now this interface remains part of the internal |
|||
// implementation and is subject to change. |
|||
// |
|||
// |
|||
// A parameterized test fixture must be derived from testing::Test and from |
|||
// testing::WithParamInterface<T>, where T is the type of the parameter |
|||
// values. Inheriting from TestWithParam<T> satisfies that requirement because |
|||
// TestWithParam<T> inherits from both Test and WithParamInterface. In more |
|||
// complicated hierarchies, however, it is occasionally useful to inherit |
|||
// separately from Test and WithParamInterface. For example: |
|||
|
|||
class BaseTest : public ::testing::Test { |
|||
// You can inherit all the usual members for a non-parameterized test |
|||
// fixture here. |
|||
}; |
|||
|
|||
class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> { |
|||
// The usual test fixture members go here too. |
|||
}; |
|||
|
|||
TEST_F(BaseTest, HasFoo) { |
|||
// This is an ordinary non-parameterized test. |
|||
} |
|||
|
|||
TEST_P(DerivedTest, DoesBlah) { |
|||
// GetParam works just the same here as if you inherit from TestWithParam. |
|||
EXPECT_TRUE(foo.Blah(GetParam())); |
|||
} |
|||
|
|||
#endif // 0 |
|||
|
|||
#include "gtest/internal/gtest-port.h" |
|||
|
|||
#if !GTEST_OS_SYMBIAN |
|||
# include <utility> |
|||
#endif |
|||
|
|||
#include "gtest/internal/gtest-internal.h" |
|||
#include "gtest/internal/gtest-param-util.h" |
|||
#include "gtest/internal/gtest-param-util-generated.h" |
|||
|
|||
namespace testing { |
|||
|
|||
// Functions producing parameter generators. |
|||
// |
|||
// Google Test uses these generators to produce parameters for value- |
|||
// parameterized tests. When a parameterized test case is instantiated |
|||
// with a particular generator, Google Test creates and runs tests |
|||
// for each element in the sequence produced by the generator. |
|||
// |
|||
// In the following sample, tests from test case FooTest are instantiated |
|||
// each three times with parameter values 3, 5, and 8: |
|||
// |
|||
// class FooTest : public TestWithParam<int> { ... }; |
|||
// |
|||
// TEST_P(FooTest, TestThis) { |
|||
// } |
|||
// TEST_P(FooTest, TestThat) { |
|||
// } |
|||
// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8)); |
|||
// |
|||
|
|||
// Range() returns generators providing sequences of values in a range. |
|||
// |
|||
// Synopsis: |
|||
// Range(start, end) |
|||
// - returns a generator producing a sequence of values {start, start+1, |
|||
// start+2, ..., }. |
|||
// Range(start, end, step) |
|||
// - returns a generator producing a sequence of values {start, start+step, |
|||
// start+step+step, ..., }. |
|||
// Notes: |
|||
// * The generated sequences never include end. For example, Range(1, 5) |
|||
// returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2) |
|||
// returns a generator producing {1, 3, 5, 7}. |
|||
// * start and end must have the same type. That type may be any integral or |
|||
// floating-point type or a user defined type satisfying these conditions: |
|||
// * It must be assignable (have operator=() defined). |
|||
// * It must have operator+() (operator+(int-compatible type) for |
|||
// two-operand version). |
|||
// * It must have operator<() defined. |
|||
// Elements in the resulting sequences will also have that type. |
|||
// * Condition start < end must be satisfied in order for resulting sequences |
|||
// to contain any elements. |
|||
// |
|||
template <typename T, typename IncrementT> |
|||
internal::ParamGenerator<T> Range(T start, T end, IncrementT step) { |
|||
return internal::ParamGenerator<T>( |
|||
new internal::RangeGenerator<T, IncrementT>(start, end, step)); |
|||
} |
|||
|
|||
template <typename T> |
|||
internal::ParamGenerator<T> Range(T start, T end) { |
|||
return Range(start, end, 1); |
|||
} |
|||
|
|||
// ValuesIn() function allows generation of tests with parameters coming from |
|||
// a container. |
|||
// |
|||
// Synopsis: |
|||
// ValuesIn(const T (&array)[N]) |
|||
// - returns a generator producing sequences with elements from |
|||
// a C-style array. |
|||
// ValuesIn(const Container& container) |
|||
// - returns a generator producing sequences with elements from |
|||
// an STL-style container. |
|||
// ValuesIn(Iterator begin, Iterator end) |
|||
// - returns a generator producing sequences with elements from |
|||
// a range [begin, end) defined by a pair of STL-style iterators. These |
|||
// iterators can also be plain C pointers. |
|||
// |
|||
// Please note that ValuesIn copies the values from the containers |
|||
// passed in and keeps them to generate tests in RUN_ALL_TESTS(). |
|||
// |
|||
// Examples: |
|||
// |
|||
// This instantiates tests from test case StringTest |
|||
// each with C-string values of "foo", "bar", and "baz": |
|||
// |
|||
// const char* strings[] = {"foo", "bar", "baz"}; |
|||
// INSTANTIATE_TEST_CASE_P(StringSequence, StringTest, ValuesIn(strings)); |
|||
// |
|||
// This instantiates tests from test case StlStringTest |
|||
// each with STL strings with values "a" and "b": |
|||
// |
|||
// ::std::vector< ::std::string> GetParameterStrings() { |
|||
// ::std::vector< ::std::string> v; |
|||
// v.push_back("a"); |
|||
// v.push_back("b"); |
|||
// return v; |
|||
// } |
|||
// |
|||
// INSTANTIATE_TEST_CASE_P(CharSequence, |
|||
// StlStringTest, |
|||
// ValuesIn(GetParameterStrings())); |
|||
// |
|||
// |
|||
// This will also instantiate tests from CharTest |
|||
// each with parameter values 'a' and 'b': |
|||
// |
|||
// ::std::list<char> GetParameterChars() { |
|||
// ::std::list<char> list; |
|||
// list.push_back('a'); |
|||
// list.push_back('b'); |
|||
// return list; |
|||
// } |
|||
// ::std::list<char> l = GetParameterChars(); |
|||
// INSTANTIATE_TEST_CASE_P(CharSequence2, |
|||
// CharTest, |
|||
// ValuesIn(l.begin(), l.end())); |
|||
// |
|||
template <typename ForwardIterator> |
|||
internal::ParamGenerator< |
|||
typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type> |
|||
ValuesIn(ForwardIterator begin, ForwardIterator end) { |
|||
typedef typename ::testing::internal::IteratorTraits<ForwardIterator> |
|||
::value_type ParamType; |
|||
return internal::ParamGenerator<ParamType>( |
|||
new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end)); |
|||
} |
|||
|
|||
template <typename T, size_t N> |
|||
internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) { |
|||
return ValuesIn(array, array + N); |
|||
} |
|||
|
|||
template <class Container> |
|||
internal::ParamGenerator<typename Container::value_type> ValuesIn( |
|||
const Container& container) { |
|||
return ValuesIn(container.begin(), container.end()); |
|||
} |
|||
|
|||
// Values() allows generating tests from explicitly specified list of |
|||
// parameters. |
|||
// |
|||
// Synopsis: |
|||
// Values(T v1, T v2, ..., T vN) |
|||
// - returns a generator producing sequences with elements v1, v2, ..., vN. |
|||
// |
|||
// For example, this instantiates tests from test case BarTest each |
|||
// with values "one", "two", and "three": |
|||
// |
|||
// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three")); |
|||
// |
|||
// This instantiates tests from test case BazTest each with values 1, 2, 3.5. |
|||
// The exact type of values will depend on the type of parameter in BazTest. |
|||
// |
|||
// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5)); |
|||
// |
|||
// Currently, Values() supports from 1 to $n parameters. |
|||
// |
|||
$range i 1..n |
|||
$for i [[ |
|||
$range j 1..i |
|||
|
|||
template <$for j, [[typename T$j]]> |
|||
internal::ValueArray$i<$for j, [[T$j]]> Values($for j, [[T$j v$j]]) { |
|||
return internal::ValueArray$i<$for j, [[T$j]]>($for j, [[v$j]]); |
|||
} |
|||
|
|||
]] |
|||
|
|||
// Bool() allows generating tests with parameters in a set of (false, true). |
|||
// |
|||
// Synopsis: |
|||
// Bool() |
|||
// - returns a generator producing sequences with elements {false, true}. |
|||
// |
|||
// It is useful when testing code that depends on Boolean flags. Combinations |
|||
// of multiple flags can be tested when several Bool()'s are combined using |
|||
// Combine() function. |
|||
// |
|||
// In the following example all tests in the test case FlagDependentTest |
|||
// will be instantiated twice with parameters false and true. |
|||
// |
|||
// class FlagDependentTest : public testing::TestWithParam<bool> { |
|||
// virtual void SetUp() { |
|||
// external_flag = GetParam(); |
|||
// } |
|||
// } |
|||
// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool()); |
|||
// |
|||
inline internal::ParamGenerator<bool> Bool() { |
|||
return Values(false, true); |
|||
} |
|||
|
|||
# if GTEST_HAS_COMBINE |
|||
// Combine() allows the user to combine two or more sequences to produce |
|||
// values of a Cartesian product of those sequences' elements. |
|||
// |
|||
// Synopsis: |
|||
// Combine(gen1, gen2, ..., genN) |
|||
// - returns a generator producing sequences with elements coming from |
|||
// the Cartesian product of elements from the sequences generated by |
|||
// gen1, gen2, ..., genN. The sequence elements will have a type of |
|||
// tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types |
|||
// of elements from sequences produces by gen1, gen2, ..., genN. |
|||
// |
|||
// Combine can have up to $maxtuple arguments. This number is currently limited |
|||
// by the maximum number of elements in the tuple implementation used by Google |
|||
// Test. |
|||
// |
|||
// Example: |
|||
// |
|||
// This will instantiate tests in test case AnimalTest each one with |
|||
// the parameter values tuple("cat", BLACK), tuple("cat", WHITE), |
|||
// tuple("dog", BLACK), and tuple("dog", WHITE): |
|||
// |
|||
// enum Color { BLACK, GRAY, WHITE }; |
|||
// class AnimalTest |
|||
// : public testing::TestWithParam<tuple<const char*, Color> > {...}; |
|||
// |
|||
// TEST_P(AnimalTest, AnimalLooksNice) {...} |
|||
// |
|||
// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest, |
|||
// Combine(Values("cat", "dog"), |
|||
// Values(BLACK, WHITE))); |
|||
// |
|||
// This will instantiate tests in FlagDependentTest with all variations of two |
|||
// Boolean flags: |
|||
// |
|||
// class FlagDependentTest |
|||
// : public testing::TestWithParam<tuple<bool, bool> > { |
|||
// virtual void SetUp() { |
|||
// // Assigns external_flag_1 and external_flag_2 values from the tuple. |
|||
// tie(external_flag_1, external_flag_2) = GetParam(); |
|||
// } |
|||
// }; |
|||
// |
|||
// TEST_P(FlagDependentTest, TestFeature1) { |
|||
// // Test your code using external_flag_1 and external_flag_2 here. |
|||
// } |
|||
// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest, |
|||
// Combine(Bool(), Bool())); |
|||
// |
|||
$range i 2..maxtuple |
|||
$for i [[ |
|||
$range j 1..i |
|||
|
|||
template <$for j, [[typename Generator$j]]> |
|||
internal::CartesianProductHolder$i<$for j, [[Generator$j]]> Combine( |
|||
$for j, [[const Generator$j& g$j]]) { |
|||
return internal::CartesianProductHolder$i<$for j, [[Generator$j]]>( |
|||
$for j, [[g$j]]); |
|||
} |
|||
|
|||
]] |
|||
# endif // GTEST_HAS_COMBINE |
|||
|
|||
# define TEST_P(test_case_name, test_name) \ |
|||
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ |
|||
: public test_case_name { \ |
|||
public: \ |
|||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \ |
|||
virtual void TestBody(); \ |
|||
private: \ |
|||
static int AddToRegistry() { \ |
|||
::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ |
|||
GetTestCasePatternHolder<test_case_name>(\ |
|||
#test_case_name, \ |
|||
::testing::internal::CodeLocation(\ |
|||
__FILE__, __LINE__))->AddTestPattern(\ |
|||
GTEST_STRINGIFY_(test_case_name), \ |
|||
GTEST_STRINGIFY_(test_name), \ |
|||
new ::testing::internal::TestMetaFactory< \ |
|||
GTEST_TEST_CLASS_NAME_(\ |
|||
test_case_name, test_name)>()); \ |
|||
return 0; \ |
|||
} \ |
|||
static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \ |
|||
GTEST_DISALLOW_COPY_AND_ASSIGN_(\ |
|||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \ |
|||
}; \ |
|||
int GTEST_TEST_CLASS_NAME_(test_case_name, \ |
|||
test_name)::gtest_registering_dummy_ = \ |
|||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ |
|||
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() |
|||
|
|||
// The optional last argument to INSTANTIATE_TEST_CASE_P allows the user |
|||
// to specify a function or functor that generates custom test name suffixes |
|||
// based on the test parameters. The function should accept one argument of |
|||
// type testing::TestParamInfo<class ParamType>, and return std::string. |
|||
// |
|||
// testing::PrintToStringParamName is a builtin test suffix generator that |
|||
// returns the value of testing::PrintToString(GetParam()). |
|||
// |
|||
// Note: test names must be non-empty, unique, and may only contain ASCII |
|||
// alphanumeric characters or underscore. Because PrintToString adds quotes |
|||
// to std::string and C strings, it won't work for these types. |
|||
|
|||
# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator, ...) \ |
|||
static ::testing::internal::ParamGenerator<test_case_name::ParamType> \ |
|||
gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \ |
|||
static ::std::string gtest_##prefix##test_case_name##_EvalGenerateName_( \ |
|||
const ::testing::TestParamInfo<test_case_name::ParamType>& info) { \ |
|||
return ::testing::internal::GetParamNameGen<test_case_name::ParamType> \ |
|||
(__VA_ARGS__)(info); \ |
|||
} \ |
|||
static int gtest_##prefix##test_case_name##_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \ |
|||
::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ |
|||
GetTestCasePatternHolder<test_case_name>(\ |
|||
#test_case_name, \ |
|||
::testing::internal::CodeLocation(\ |
|||
__FILE__, __LINE__))->AddTestCaseInstantiation(\ |
|||
#prefix, \ |
|||
>est_##prefix##test_case_name##_EvalGenerator_, \ |
|||
>est_##prefix##test_case_name##_EvalGenerateName_, \ |
|||
__FILE__, __LINE__) |
|||
|
|||
} // namespace testing |
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ |
File diff suppressed because it is too large
@ -0,0 +1,237 @@ |
|||
// Copyright 2007, Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|||
//
|
|||
// Utilities for testing Google Test itself and code that uses Google Test
|
|||
// (e.g. frameworks built on top of Google Test).
|
|||
|
|||
// GOOGLETEST_CM0004 DO NOT DELETE
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_ |
|||
#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_ |
|||
|
|||
#include "gtest/gtest.h" |
|||
|
|||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ |
|||
/* class A needs to have dll-interface to be used by clients of class B */) |
|||
|
|||
namespace testing { |
|||
|
|||
// This helper class can be used to mock out Google Test failure reporting
|
|||
// so that we can test Google Test or code that builds on Google Test.
|
|||
//
|
|||
// An object of this class appends a TestPartResult object to the
|
|||
// TestPartResultArray object given in the constructor whenever a Google Test
|
|||
// failure is reported. It can either intercept only failures that are
|
|||
// generated in the same thread that created this object or it can intercept
|
|||
// all generated failures. The scope of this mock object can be controlled with
|
|||
// the second argument to the two arguments constructor.
|
|||
class GTEST_API_ ScopedFakeTestPartResultReporter |
|||
: public TestPartResultReporterInterface { |
|||
public: |
|||
// The two possible mocking modes of this object.
|
|||
enum InterceptMode { |
|||
INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures.
|
|||
INTERCEPT_ALL_THREADS // Intercepts all failures.
|
|||
}; |
|||
|
|||
// The c'tor sets this object as the test part result reporter used
|
|||
// by Google Test. The 'result' parameter specifies where to report the
|
|||
// results. This reporter will only catch failures generated in the current
|
|||
// thread. DEPRECATED
|
|||
explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result); |
|||
|
|||
// Same as above, but you can choose the interception scope of this object.
|
|||
ScopedFakeTestPartResultReporter(InterceptMode intercept_mode, |
|||
TestPartResultArray* result); |
|||
|
|||
// The d'tor restores the previous test part result reporter.
|
|||
virtual ~ScopedFakeTestPartResultReporter(); |
|||
|
|||
// Appends the TestPartResult object to the TestPartResultArray
|
|||
// received in the constructor.
|
|||
//
|
|||
// This method is from the TestPartResultReporterInterface
|
|||
// interface.
|
|||
virtual void ReportTestPartResult(const TestPartResult& result); |
|||
private: |
|||
void Init(); |
|||
|
|||
const InterceptMode intercept_mode_; |
|||
TestPartResultReporterInterface* old_reporter_; |
|||
TestPartResultArray* const result_; |
|||
|
|||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter); |
|||
}; |
|||
|
|||
namespace internal { |
|||
|
|||
// A helper class for implementing EXPECT_FATAL_FAILURE() and
|
|||
// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given
|
|||
// TestPartResultArray contains exactly one failure that has the given
|
|||
// type and contains the given substring. If that's not the case, a
|
|||
// non-fatal failure will be generated.
|
|||
class GTEST_API_ SingleFailureChecker { |
|||
public: |
|||
// The constructor remembers the arguments.
|
|||
SingleFailureChecker(const TestPartResultArray* results, |
|||
TestPartResult::Type type, const std::string& substr); |
|||
~SingleFailureChecker(); |
|||
private: |
|||
const TestPartResultArray* const results_; |
|||
const TestPartResult::Type type_; |
|||
const std::string substr_; |
|||
|
|||
GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker); |
|||
}; |
|||
|
|||
} // namespace internal
|
|||
|
|||
} // namespace testing
|
|||
|
|||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
|
|||
|
|||
// A set of macros for testing Google Test assertions or code that's expected
|
|||
// to generate Google Test fatal failures. It verifies that the given
|
|||
// statement will cause exactly one fatal Google Test failure with 'substr'
|
|||
// being part of the failure message.
|
|||
//
|
|||
// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
|
|||
// affects and considers failures generated in the current thread and
|
|||
// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
|
|||
//
|
|||
// The verification of the assertion is done correctly even when the statement
|
|||
// throws an exception or aborts the current function.
|
|||
//
|
|||
// Known restrictions:
|
|||
// - 'statement' cannot reference local non-static variables or
|
|||
// non-static members of the current object.
|
|||
// - 'statement' cannot return a value.
|
|||
// - You cannot stream a failure message to this macro.
|
|||
//
|
|||
// Note that even though the implementations of the following two
|
|||
// macros are much alike, we cannot refactor them to use a common
|
|||
// helper macro, due to some peculiarity in how the preprocessor
|
|||
// works. The AcceptsMacroThatExpandsToUnprotectedComma test in
|
|||
// gtest_unittest.cc will fail to compile if we do that.
|
|||
#define EXPECT_FATAL_FAILURE(statement, substr) \ |
|||
do { \ |
|||
class GTestExpectFatalFailureHelper {\ |
|||
public:\ |
|||
static void Execute() { statement; }\ |
|||
};\ |
|||
::testing::TestPartResultArray gtest_failures;\ |
|||
::testing::internal::SingleFailureChecker gtest_checker(\ |
|||
>est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ |
|||
{\ |
|||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ |
|||
::testing::ScopedFakeTestPartResultReporter:: \ |
|||
INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ |
|||
GTestExpectFatalFailureHelper::Execute();\ |
|||
}\ |
|||
} while (::testing::internal::AlwaysFalse()) |
|||
|
|||
#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ |
|||
do { \ |
|||
class GTestExpectFatalFailureHelper {\ |
|||
public:\ |
|||
static void Execute() { statement; }\ |
|||
};\ |
|||
::testing::TestPartResultArray gtest_failures;\ |
|||
::testing::internal::SingleFailureChecker gtest_checker(\ |
|||
>est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ |
|||
{\ |
|||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ |
|||
::testing::ScopedFakeTestPartResultReporter:: \ |
|||
INTERCEPT_ALL_THREADS, >est_failures);\ |
|||
GTestExpectFatalFailureHelper::Execute();\ |
|||
}\ |
|||
} while (::testing::internal::AlwaysFalse()) |
|||
|
|||
// A macro for testing Google Test assertions or code that's expected to
|
|||
// generate Google Test non-fatal failures. It asserts that the given
|
|||
// statement will cause exactly one non-fatal Google Test failure with 'substr'
|
|||
// being part of the failure message.
|
|||
//
|
|||
// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
|
|||
// affects and considers failures generated in the current thread and
|
|||
// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
|
|||
//
|
|||
// 'statement' is allowed to reference local variables and members of
|
|||
// the current object.
|
|||
//
|
|||
// The verification of the assertion is done correctly even when the statement
|
|||
// throws an exception or aborts the current function.
|
|||
//
|
|||
// Known restrictions:
|
|||
// - You cannot stream a failure message to this macro.
|
|||
//
|
|||
// Note that even though the implementations of the following two
|
|||
// macros are much alike, we cannot refactor them to use a common
|
|||
// helper macro, due to some peculiarity in how the preprocessor
|
|||
// works. If we do that, the code won't compile when the user gives
|
|||
// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
|
|||
// expands to code containing an unprotected comma. The
|
|||
// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
|
|||
// catches that.
|
|||
//
|
|||
// For the same reason, we have to write
|
|||
// if (::testing::internal::AlwaysTrue()) { statement; }
|
|||
// instead of
|
|||
// GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
|
|||
// to avoid an MSVC warning on unreachable code.
|
|||
#define EXPECT_NONFATAL_FAILURE(statement, substr) \ |
|||
do {\ |
|||
::testing::TestPartResultArray gtest_failures;\ |
|||
::testing::internal::SingleFailureChecker gtest_checker(\ |
|||
>est_failures, ::testing::TestPartResult::kNonFatalFailure, \ |
|||
(substr));\ |
|||
{\ |
|||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ |
|||
::testing::ScopedFakeTestPartResultReporter:: \ |
|||
INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ |
|||
if (::testing::internal::AlwaysTrue()) { statement; }\ |
|||
}\ |
|||
} while (::testing::internal::AlwaysFalse()) |
|||
|
|||
#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ |
|||
do {\ |
|||
::testing::TestPartResultArray gtest_failures;\ |
|||
::testing::internal::SingleFailureChecker gtest_checker(\ |
|||
>est_failures, ::testing::TestPartResult::kNonFatalFailure, \ |
|||
(substr));\ |
|||
{\ |
|||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ |
|||
::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \ |
|||
>est_failures);\ |
|||
if (::testing::internal::AlwaysTrue()) { statement; }\ |
|||
}\ |
|||
} while (::testing::internal::AlwaysFalse()) |
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
|
@ -0,0 +1,183 @@ |
|||
// Copyright 2008, Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
//
|
|||
// GOOGLETEST_CM0001 DO NOT DELETE
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ |
|||
#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ |
|||
|
|||
#include <iosfwd> |
|||
#include <vector> |
|||
#include "gtest/internal/gtest-internal.h" |
|||
#include "gtest/internal/gtest-string.h" |
|||
|
|||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ |
|||
/* class A needs to have dll-interface to be used by clients of class B */) |
|||
|
|||
namespace testing { |
|||
|
|||
// A copyable object representing the result of a test part (i.e. an
|
|||
// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
|
|||
//
|
|||
// Don't inherit from TestPartResult as its destructor is not virtual.
|
|||
class GTEST_API_ TestPartResult { |
|||
public: |
|||
// The possible outcomes of a test part (i.e. an assertion or an
|
|||
// explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
|
|||
enum Type { |
|||
kSuccess, // Succeeded.
|
|||
kNonFatalFailure, // Failed but the test can continue.
|
|||
kFatalFailure // Failed and the test should be terminated.
|
|||
}; |
|||
|
|||
// C'tor. TestPartResult does NOT have a default constructor.
|
|||
// Always use this constructor (with parameters) to create a
|
|||
// TestPartResult object.
|
|||
TestPartResult(Type a_type, |
|||
const char* a_file_name, |
|||
int a_line_number, |
|||
const char* a_message) |
|||
: type_(a_type), |
|||
file_name_(a_file_name == NULL ? "" : a_file_name), |
|||
line_number_(a_line_number), |
|||
summary_(ExtractSummary(a_message)), |
|||
message_(a_message) { |
|||
} |
|||
|
|||
// Gets the outcome of the test part.
|
|||
Type type() const { return type_; } |
|||
|
|||
// Gets the name of the source file where the test part took place, or
|
|||
// NULL if it's unknown.
|
|||
const char* file_name() const { |
|||
return file_name_.empty() ? NULL : file_name_.c_str(); |
|||
} |
|||
|
|||
// Gets the line in the source file where the test part took place,
|
|||
// or -1 if it's unknown.
|
|||
int line_number() const { return line_number_; } |
|||
|
|||
// Gets the summary of the failure message.
|
|||
const char* summary() const { return summary_.c_str(); } |
|||
|
|||
// Gets the message associated with the test part.
|
|||
const char* message() const { return message_.c_str(); } |
|||
|
|||
// Returns true iff the test part passed.
|
|||
bool passed() const { return type_ == kSuccess; } |
|||
|
|||
// Returns true iff the test part failed.
|
|||
bool failed() const { return type_ != kSuccess; } |
|||
|
|||
// Returns true iff the test part non-fatally failed.
|
|||
bool nonfatally_failed() const { return type_ == kNonFatalFailure; } |
|||
|
|||
// Returns true iff the test part fatally failed.
|
|||
bool fatally_failed() const { return type_ == kFatalFailure; } |
|||
|
|||
private: |
|||
Type type_; |
|||
|
|||
// Gets the summary of the failure message by omitting the stack
|
|||
// trace in it.
|
|||
static std::string ExtractSummary(const char* message); |
|||
|
|||
// The name of the source file where the test part took place, or
|
|||
// "" if the source file is unknown.
|
|||
std::string file_name_; |
|||
// The line in the source file where the test part took place, or -1
|
|||
// if the line number is unknown.
|
|||
int line_number_; |
|||
std::string summary_; // The test failure summary.
|
|||
std::string message_; // The test failure message.
|
|||
}; |
|||
|
|||
// Prints a TestPartResult object.
|
|||
std::ostream& operator<<(std::ostream& os, const TestPartResult& result); |
|||
|
|||
// An array of TestPartResult objects.
|
|||
//
|
|||
// Don't inherit from TestPartResultArray as its destructor is not
|
|||
// virtual.
|
|||
class GTEST_API_ TestPartResultArray { |
|||
public: |
|||
TestPartResultArray() {} |
|||
|
|||
// Appends the given TestPartResult to the array.
|
|||
void Append(const TestPartResult& result); |
|||
|
|||
// Returns the TestPartResult at the given index (0-based).
|
|||
const TestPartResult& GetTestPartResult(int index) const; |
|||
|
|||
// Returns the number of TestPartResult objects in the array.
|
|||
int size() const; |
|||
|
|||
private: |
|||
std::vector<TestPartResult> array_; |
|||
|
|||
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray); |
|||
}; |
|||
|
|||
// This interface knows how to report a test part result.
|
|||
class GTEST_API_ TestPartResultReporterInterface { |
|||
public: |
|||
virtual ~TestPartResultReporterInterface() {} |
|||
|
|||
virtual void ReportTestPartResult(const TestPartResult& result) = 0; |
|||
}; |
|||
|
|||
namespace internal { |
|||
|
|||
// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
|
|||
// statement generates new fatal failures. To do so it registers itself as the
|
|||
// current test part result reporter. Besides checking if fatal failures were
|
|||
// reported, it only delegates the reporting to the former result reporter.
|
|||
// The original result reporter is restored in the destructor.
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
|||
class GTEST_API_ HasNewFatalFailureHelper |
|||
: public TestPartResultReporterInterface { |
|||
public: |
|||
HasNewFatalFailureHelper(); |
|||
virtual ~HasNewFatalFailureHelper(); |
|||
virtual void ReportTestPartResult(const TestPartResult& result); |
|||
bool has_new_fatal_failure() const { return has_new_fatal_failure_; } |
|||
private: |
|||
bool has_new_fatal_failure_; |
|||
TestPartResultReporterInterface* original_reporter_; |
|||
|
|||
GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper); |
|||
}; |
|||
|
|||
} // namespace internal
|
|||
|
|||
} // namespace testing
|
|||
|
|||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
|
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
|
@ -0,0 +1,306 @@ |
|||
// Copyright 2008 Google Inc.
|
|||
// All Rights Reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|||
|
|||
// GOOGLETEST_CM0001 DO NOT DELETE
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ |
|||
#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ |
|||
|
|||
// This header implements typed tests and type-parameterized tests.
|
|||
|
|||
// Typed (aka type-driven) tests repeat the same test for types in a
|
|||
// list. You must know which types you want to test with when writing
|
|||
// typed tests. Here's how you do it:
|
|||
|
|||
#if 0 |
|||
|
|||
// First, define a fixture class template. It should be parameterized
|
|||
// by a type. Remember to derive it from testing::Test.
|
|||
template <typename T> |
|||
class FooTest : public testing::Test { |
|||
public: |
|||
... |
|||
typedef std::list<T> List; |
|||
static T shared_; |
|||
T value_; |
|||
}; |
|||
|
|||
// Next, associate a list of types with the test case, which will be
|
|||
// repeated for each type in the list. The typedef is necessary for
|
|||
// the macro to parse correctly.
|
|||
typedef testing::Types<char, int, unsigned int> MyTypes; |
|||
TYPED_TEST_CASE(FooTest, MyTypes); |
|||
|
|||
// If the type list contains only one type, you can write that type
|
|||
// directly without Types<...>:
|
|||
// TYPED_TEST_CASE(FooTest, int);
|
|||
|
|||
// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
|
|||
// tests for this test case as you want.
|
|||
TYPED_TEST(FooTest, DoesBlah) { |
|||
// Inside a test, refer to TypeParam to get the type parameter.
|
|||
// Since we are inside a derived class template, C++ requires use to
|
|||
// visit the members of FooTest via 'this'.
|
|||
TypeParam n = this->value_; |
|||
|
|||
// To visit static members of the fixture, add the TestFixture::
|
|||
// prefix.
|
|||
n += TestFixture::shared_; |
|||
|
|||
// To refer to typedefs in the fixture, add the "typename
|
|||
// TestFixture::" prefix.
|
|||
typename TestFixture::List values; |
|||
values.push_back(n); |
|||
... |
|||
} |
|||
|
|||
TYPED_TEST(FooTest, HasPropertyA) { ... } |
|||
|
|||
// TYPED_TEST_CASE takes an optional third argument which allows to specify a
|
|||
// class that generates custom test name suffixes based on the type. This should
|
|||
// be a class which has a static template function GetName(int index) returning
|
|||
// a string for each type. The provided integer index equals the index of the
|
|||
// type in the provided type list. In many cases the index can be ignored.
|
|||
//
|
|||
// For example:
|
|||
// class MyTypeNames {
|
|||
// public:
|
|||
// template <typename T>
|
|||
// static std::string GetName(int) {
|
|||
// if (std::is_same<T, char>()) return "char";
|
|||
// if (std::is_same<T, int>()) return "int";
|
|||
// if (std::is_same<T, unsigned int>()) return "unsignedInt";
|
|||
// }
|
|||
// };
|
|||
// TYPED_TEST_CASE(FooTest, MyTypes, MyTypeNames);
|
|||
|
|||
#endif // 0
|
|||
|
|||
// Type-parameterized tests are abstract test patterns parameterized
|
|||
// by a type. Compared with typed tests, type-parameterized tests
|
|||
// allow you to define the test pattern without knowing what the type
|
|||
// parameters are. The defined pattern can be instantiated with
|
|||
// different types any number of times, in any number of translation
|
|||
// units.
|
|||
//
|
|||
// If you are designing an interface or concept, you can define a
|
|||
// suite of type-parameterized tests to verify properties that any
|
|||
// valid implementation of the interface/concept should have. Then,
|
|||
// each implementation can easily instantiate the test suite to verify
|
|||
// that it conforms to the requirements, without having to write
|
|||
// similar tests repeatedly. Here's an example:
|
|||
|
|||
#if 0 |
|||
|
|||
// First, define a fixture class template. It should be parameterized
|
|||
// by a type. Remember to derive it from testing::Test.
|
|||
template <typename T> |
|||
class FooTest : public testing::Test { |
|||
... |
|||
}; |
|||
|
|||
// Next, declare that you will define a type-parameterized test case
|
|||
// (the _P suffix is for "parameterized" or "pattern", whichever you
|
|||
// prefer):
|
|||
TYPED_TEST_CASE_P(FooTest); |
|||
|
|||
// Then, use TYPED_TEST_P() to define as many type-parameterized tests
|
|||
// for this type-parameterized test case as you want.
|
|||
TYPED_TEST_P(FooTest, DoesBlah) { |
|||
// Inside a test, refer to TypeParam to get the type parameter.
|
|||
TypeParam n = 0; |
|||
... |
|||
} |
|||
|
|||
TYPED_TEST_P(FooTest, HasPropertyA) { ... } |
|||
|
|||
// Now the tricky part: you need to register all test patterns before
|
|||
// you can instantiate them. The first argument of the macro is the
|
|||
// test case name; the rest are the names of the tests in this test
|
|||
// case.
|
|||
REGISTER_TYPED_TEST_CASE_P(FooTest, |
|||
DoesBlah, HasPropertyA); |
|||
|
|||
// Finally, you are free to instantiate the pattern with the types you
|
|||
// want. If you put the above code in a header file, you can #include
|
|||
// it in multiple C++ source files and instantiate it multiple times.
|
|||
//
|
|||
// To distinguish different instances of the pattern, the first
|
|||
// argument to the INSTANTIATE_* macro is a prefix that will be added
|
|||
// to the actual test case name. Remember to pick unique prefixes for
|
|||
// different instances.
|
|||
typedef testing::Types<char, int, unsigned int> MyTypes; |
|||
INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes); |
|||
|
|||
// If the type list contains only one type, you can write that type
|
|||
// directly without Types<...>:
|
|||
// INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
|
|||
//
|
|||
// Similar to the optional argument of TYPED_TEST_CASE above,
|
|||
// INSTANTIATE_TEST_CASE_P takes an optional fourth argument which allows to
|
|||
// generate custom names.
|
|||
// INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes, MyTypeNames);
|
|||
|
|||
#endif // 0
|
|||
|
|||
#include "gtest/internal/gtest-port.h" |
|||
#include "gtest/internal/gtest-type-util.h" |
|||
|
|||
// Implements typed tests.
|
|||
|
|||
#if GTEST_HAS_TYPED_TEST |
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
|||
//
|
|||
// Expands to the name of the typedef for the type parameters of the
|
|||
// given test case.
|
|||
# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_ |
|||
|
|||
// Expands to the name of the typedef for the NameGenerator, responsible for
|
|||
// creating the suffixes of the name.
|
|||
#define GTEST_NAME_GENERATOR_(TestCaseName) \ |
|||
gtest_type_params_##TestCaseName##_NameGenerator |
|||
|
|||
// The 'Types' template argument below must have spaces around it
|
|||
// since some compilers may choke on '>>' when passing a template
|
|||
// instance (e.g. Types<int>)
|
|||
# define TYPED_TEST_CASE(CaseName, Types, ...) \ |
|||
typedef ::testing::internal::TypeList< Types >::type GTEST_TYPE_PARAMS_( \ |
|||
CaseName); \ |
|||
typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \ |
|||
GTEST_NAME_GENERATOR_(CaseName) |
|||
|
|||
# define TYPED_TEST(CaseName, TestName) \ |
|||
template <typename gtest_TypeParam_> \ |
|||
class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \ |
|||
: public CaseName<gtest_TypeParam_> { \ |
|||
private: \ |
|||
typedef CaseName<gtest_TypeParam_> TestFixture; \ |
|||
typedef gtest_TypeParam_ TypeParam; \ |
|||
virtual void TestBody(); \ |
|||
}; \ |
|||
static bool gtest_##CaseName##_##TestName##_registered_ \ |
|||
GTEST_ATTRIBUTE_UNUSED_ = \ |
|||
::testing::internal::TypeParameterizedTest< \ |
|||
CaseName, \ |
|||
::testing::internal::TemplateSel<GTEST_TEST_CLASS_NAME_(CaseName, \ |
|||
TestName)>, \ |
|||
GTEST_TYPE_PARAMS_( \ |
|||
CaseName)>::Register("", \ |
|||
::testing::internal::CodeLocation( \ |
|||
__FILE__, __LINE__), \ |
|||
#CaseName, #TestName, 0, \ |
|||
::testing::internal::GenerateNames< \ |
|||
GTEST_NAME_GENERATOR_(CaseName), \ |
|||
GTEST_TYPE_PARAMS_(CaseName)>()); \ |
|||
template <typename gtest_TypeParam_> \ |
|||
void GTEST_TEST_CLASS_NAME_(CaseName, \ |
|||
TestName)<gtest_TypeParam_>::TestBody() |
|||
|
|||
#endif // GTEST_HAS_TYPED_TEST
|
|||
|
|||
// Implements type-parameterized tests.
|
|||
|
|||
#if GTEST_HAS_TYPED_TEST_P |
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
|||
//
|
|||
// Expands to the namespace name that the type-parameterized tests for
|
|||
// the given type-parameterized test case are defined in. The exact
|
|||
// name of the namespace is subject to change without notice.
|
|||
# define GTEST_CASE_NAMESPACE_(TestCaseName) \ |
|||
gtest_case_##TestCaseName##_ |
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
|||
//
|
|||
// Expands to the name of the variable used to remember the names of
|
|||
// the defined tests in the given test case.
|
|||
# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \ |
|||
gtest_typed_test_case_p_state_##TestCaseName##_ |
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
|
|||
//
|
|||
// Expands to the name of the variable used to remember the names of
|
|||
// the registered tests in the given test case.
|
|||
# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \ |
|||
gtest_registered_test_names_##TestCaseName##_ |
|||
|
|||
// The variables defined in the type-parameterized test macros are
|
|||
// static as typically these macros are used in a .h file that can be
|
|||
// #included in multiple translation units linked together.
|
|||
# define TYPED_TEST_CASE_P(CaseName) \ |
|||
static ::testing::internal::TypedTestCasePState \ |
|||
GTEST_TYPED_TEST_CASE_P_STATE_(CaseName) |
|||
|
|||
# define TYPED_TEST_P(CaseName, TestName) \ |
|||
namespace GTEST_CASE_NAMESPACE_(CaseName) { \ |
|||
template <typename gtest_TypeParam_> \ |
|||
class TestName : public CaseName<gtest_TypeParam_> { \ |
|||
private: \ |
|||
typedef CaseName<gtest_TypeParam_> TestFixture; \ |
|||
typedef gtest_TypeParam_ TypeParam; \ |
|||
virtual void TestBody(); \ |
|||
}; \ |
|||
static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \ |
|||
GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\ |
|||
__FILE__, __LINE__, #CaseName, #TestName); \ |
|||
} \ |
|||
template <typename gtest_TypeParam_> \ |
|||
void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody() |
|||
|
|||
# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \ |
|||
namespace GTEST_CASE_NAMESPACE_(CaseName) { \ |
|||
typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \ |
|||
} \ |
|||
static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) \ |
|||
GTEST_ATTRIBUTE_UNUSED_ = \ |
|||
GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames( \ |
|||
__FILE__, __LINE__, #__VA_ARGS__) |
|||
|
|||
// The 'Types' template argument below must have spaces around it
|
|||
// since some compilers may choke on '>>' when passing a template
|
|||
// instance (e.g. Types<int>)
|
|||
# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types, ...) \ |
|||
static bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \ |
|||
::testing::internal::TypeParameterizedTestCase< \ |
|||
CaseName, GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \ |
|||
::testing::internal::TypeList< Types >::type>:: \ |
|||
Register(#Prefix, \ |
|||
::testing::internal::CodeLocation(__FILE__, __LINE__), \ |
|||
>EST_TYPED_TEST_CASE_P_STATE_(CaseName), #CaseName, \ |
|||
GTEST_REGISTERED_TEST_NAMES_(CaseName), \ |
|||
::testing::internal::GenerateNames< \ |
|||
::testing::internal::NameGeneratorSelector< \ |
|||
__VA_ARGS__>::type, \ |
|||
::testing::internal::TypeList< Types >::type>()) |
|||
|
|||
#endif // GTEST_HAS_TYPED_TEST_P
|
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
|
File diff suppressed because it is too large
@ -0,0 +1,359 @@ |
|||
// Copyright 2006, Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|||
// This file is AUTOMATICALLY GENERATED on 01/02/2018 by command
|
|||
// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND!
|
|||
//
|
|||
// Implements a family of generic predicate assertion macros.
|
|||
|
|||
// GOOGLETEST_CM0001 DO NOT DELETE
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ |
|||
#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ |
|||
|
|||
#include "gtest/gtest.h" |
|||
|
|||
namespace testing { |
|||
|
|||
// This header implements a family of generic predicate assertion
|
|||
// macros:
|
|||
//
|
|||
// ASSERT_PRED_FORMAT1(pred_format, v1)
|
|||
// ASSERT_PRED_FORMAT2(pred_format, v1, v2)
|
|||
// ...
|
|||
//
|
|||
// where pred_format is a function or functor that takes n (in the
|
|||
// case of ASSERT_PRED_FORMATn) values and their source expression
|
|||
// text, and returns a testing::AssertionResult. See the definition
|
|||
// of ASSERT_EQ in gtest.h for an example.
|
|||
//
|
|||
// If you don't care about formatting, you can use the more
|
|||
// restrictive version:
|
|||
//
|
|||
// ASSERT_PRED1(pred, v1)
|
|||
// ASSERT_PRED2(pred, v1, v2)
|
|||
// ...
|
|||
//
|
|||
// where pred is an n-ary function or functor that returns bool,
|
|||
// and the values v1, v2, ..., must support the << operator for
|
|||
// streaming to std::ostream.
|
|||
//
|
|||
// We also define the EXPECT_* variations.
|
|||
//
|
|||
// For now we only support predicates whose arity is at most 5.
|
|||
|
|||
// GTEST_ASSERT_ is the basic statement to which all of the assertions
|
|||
// in this file reduce. Don't use this in your code.
|
|||
|
|||
#define GTEST_ASSERT_(expression, on_failure) \ |
|||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ |
|||
if (const ::testing::AssertionResult gtest_ar = (expression)) \ |
|||
; \ |
|||
else \ |
|||
on_failure(gtest_ar.failure_message()) |
|||
|
|||
|
|||
// Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use
|
|||
// this in your code.
|
|||
template <typename Pred, |
|||
typename T1> |
|||
AssertionResult AssertPred1Helper(const char* pred_text, |
|||
const char* e1, |
|||
Pred pred, |
|||
const T1& v1) { |
|||
if (pred(v1)) return AssertionSuccess(); |
|||
|
|||
return AssertionFailure() << pred_text << "(" |
|||
<< e1 << ") evaluates to false, where" |
|||
<< "\n" << e1 << " evaluates to " << v1; |
|||
} |
|||
|
|||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
|
|||
// Don't use this in your code.
|
|||
#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\ |
|||
GTEST_ASSERT_(pred_format(#v1, v1), \ |
|||
on_failure) |
|||
|
|||
// Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use
|
|||
// this in your code.
|
|||
#define GTEST_PRED1_(pred, v1, on_failure)\ |
|||
GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \ |
|||
#v1, \ |
|||
pred, \ |
|||
v1), on_failure) |
|||
|
|||
// Unary predicate assertion macros.
|
|||
#define EXPECT_PRED_FORMAT1(pred_format, v1) \ |
|||
GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_) |
|||
#define EXPECT_PRED1(pred, v1) \ |
|||
GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_) |
|||
#define ASSERT_PRED_FORMAT1(pred_format, v1) \ |
|||
GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_) |
|||
#define ASSERT_PRED1(pred, v1) \ |
|||
GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_) |
|||
|
|||
|
|||
|
|||
// Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use
|
|||
// this in your code.
|
|||
template <typename Pred, |
|||
typename T1, |
|||
typename T2> |
|||
AssertionResult AssertPred2Helper(const char* pred_text, |
|||
const char* e1, |
|||
const char* e2, |
|||
Pred pred, |
|||
const T1& v1, |
|||
const T2& v2) { |
|||
if (pred(v1, v2)) return AssertionSuccess(); |
|||
|
|||
return AssertionFailure() << pred_text << "(" |
|||
<< e1 << ", " |
|||
<< e2 << ") evaluates to false, where" |
|||
<< "\n" << e1 << " evaluates to " << v1 |
|||
<< "\n" << e2 << " evaluates to " << v2; |
|||
} |
|||
|
|||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
|
|||
// Don't use this in your code.
|
|||
#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\ |
|||
GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \ |
|||
on_failure) |
|||
|
|||
// Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use
|
|||
// this in your code.
|
|||
#define GTEST_PRED2_(pred, v1, v2, on_failure)\ |
|||
GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \ |
|||
#v1, \ |
|||
#v2, \ |
|||
pred, \ |
|||
v1, \ |
|||
v2), on_failure) |
|||
|
|||
// Binary predicate assertion macros.
|
|||
#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \ |
|||
GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_) |
|||
#define EXPECT_PRED2(pred, v1, v2) \ |
|||
GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_) |
|||
#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \ |
|||
GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_) |
|||
#define ASSERT_PRED2(pred, v1, v2) \ |
|||
GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_) |
|||
|
|||
|
|||
|
|||
// Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use
|
|||
// this in your code.
|
|||
template <typename Pred, |
|||
typename T1, |
|||
typename T2, |
|||
typename T3> |
|||
AssertionResult AssertPred3Helper(const char* pred_text, |
|||
const char* e1, |
|||
const char* e2, |
|||
const char* e3, |
|||
Pred pred, |
|||
const T1& v1, |
|||
const T2& v2, |
|||
const T3& v3) { |
|||
if (pred(v1, v2, v3)) return AssertionSuccess(); |
|||
|
|||
return AssertionFailure() << pred_text << "(" |
|||
<< e1 << ", " |
|||
<< e2 << ", " |
|||
<< e3 << ") evaluates to false, where" |
|||
<< "\n" << e1 << " evaluates to " << v1 |
|||
<< "\n" << e2 << " evaluates to " << v2 |
|||
<< "\n" << e3 << " evaluates to " << v3; |
|||
} |
|||
|
|||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
|
|||
// Don't use this in your code.
|
|||
#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\ |
|||
GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \ |
|||
on_failure) |
|||
|
|||
// Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use
|
|||
// this in your code.
|
|||
#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\ |
|||
GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \ |
|||
#v1, \ |
|||
#v2, \ |
|||
#v3, \ |
|||
pred, \ |
|||
v1, \ |
|||
v2, \ |
|||
v3), on_failure) |
|||
|
|||
// Ternary predicate assertion macros.
|
|||
#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \ |
|||
GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_) |
|||
#define EXPECT_PRED3(pred, v1, v2, v3) \ |
|||
GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_) |
|||
#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \ |
|||
GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_) |
|||
#define ASSERT_PRED3(pred, v1, v2, v3) \ |
|||
GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_) |
|||
|
|||
|
|||
|
|||
// Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use
|
|||
// this in your code.
|
|||
template <typename Pred, |
|||
typename T1, |
|||
typename T2, |
|||
typename T3, |
|||
typename T4> |
|||
AssertionResult AssertPred4Helper(const char* pred_text, |
|||
const char* e1, |
|||
const char* e2, |
|||
const char* e3, |
|||
const char* e4, |
|||
Pred pred, |
|||
const T1& v1, |
|||
const T2& v2, |
|||
const T3& v3, |
|||
const T4& v4) { |
|||
if (pred(v1, v2, v3, v4)) return AssertionSuccess(); |
|||
|
|||
return AssertionFailure() << pred_text << "(" |
|||
<< e1 << ", " |
|||
<< e2 << ", " |
|||
<< e3 << ", " |
|||
<< e4 << ") evaluates to false, where" |
|||
<< "\n" << e1 << " evaluates to " << v1 |
|||
<< "\n" << e2 << " evaluates to " << v2 |
|||
<< "\n" << e3 << " evaluates to " << v3 |
|||
<< "\n" << e4 << " evaluates to " << v4; |
|||
} |
|||
|
|||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
|
|||
// Don't use this in your code.
|
|||
#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\ |
|||
GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \ |
|||
on_failure) |
|||
|
|||
// Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use
|
|||
// this in your code.
|
|||
#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\ |
|||
GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \ |
|||
#v1, \ |
|||
#v2, \ |
|||
#v3, \ |
|||
#v4, \ |
|||
pred, \ |
|||
v1, \ |
|||
v2, \ |
|||
v3, \ |
|||
v4), on_failure) |
|||
|
|||
// 4-ary predicate assertion macros.
|
|||
#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ |
|||
GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) |
|||
#define EXPECT_PRED4(pred, v1, v2, v3, v4) \ |
|||
GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) |
|||
#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ |
|||
GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) |
|||
#define ASSERT_PRED4(pred, v1, v2, v3, v4) \ |
|||
GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) |
|||
|
|||
|
|||
|
|||
// Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use
|
|||
// this in your code.
|
|||
template <typename Pred, |
|||
typename T1, |
|||
typename T2, |
|||
typename T3, |
|||
typename T4, |
|||
typename T5> |
|||
AssertionResult AssertPred5Helper(const char* pred_text, |
|||
const char* e1, |
|||
const char* e2, |
|||
const char* e3, |
|||
const char* e4, |
|||
const char* e5, |
|||
Pred pred, |
|||
const T1& v1, |
|||
const T2& v2, |
|||
const T3& v3, |
|||
const T4& v4, |
|||
const T5& v5) { |
|||
if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess(); |
|||
|
|||
return AssertionFailure() << pred_text << "(" |
|||
<< e1 << ", " |
|||
<< e2 << ", " |
|||
<< e3 << ", " |
|||
<< e4 << ", " |
|||
<< e5 << ") evaluates to false, where" |
|||
<< "\n" << e1 << " evaluates to " << v1 |
|||
<< "\n" << e2 << " evaluates to " << v2 |
|||
<< "\n" << e3 << " evaluates to " << v3 |
|||
<< "\n" << e4 << " evaluates to " << v4 |
|||
<< "\n" << e5 << " evaluates to " << v5; |
|||
} |
|||
|
|||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
|
|||
// Don't use this in your code.
|
|||
#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\ |
|||
GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \ |
|||
on_failure) |
|||
|
|||
// Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use
|
|||
// this in your code.
|
|||
#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\ |
|||
GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \ |
|||
#v1, \ |
|||
#v2, \ |
|||
#v3, \ |
|||
#v4, \ |
|||
#v5, \ |
|||
pred, \ |
|||
v1, \ |
|||
v2, \ |
|||
v3, \ |
|||
v4, \ |
|||
v5), on_failure) |
|||
|
|||
// 5-ary predicate assertion macros.
|
|||
#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ |
|||
GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) |
|||
#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \ |
|||
GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) |
|||
#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ |
|||
GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) |
|||
#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \ |
|||
GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) |
|||
|
|||
|
|||
|
|||
} // namespace testing
|
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
|
@ -0,0 +1,61 @@ |
|||
// Copyright 2006, Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|||
//
|
|||
// Google C++ Testing and Mocking Framework definitions useful in production code.
|
|||
// GOOGLETEST_CM0003 DO NOT DELETE
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_ |
|||
#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_ |
|||
|
|||
// When you need to test the private or protected members of a class,
|
|||
// use the FRIEND_TEST macro to declare your tests as friends of the
|
|||
// class. For example:
|
|||
//
|
|||
// class MyClass {
|
|||
// private:
|
|||
// void PrivateMethod();
|
|||
// FRIEND_TEST(MyClassTest, PrivateMethodWorks);
|
|||
// };
|
|||
//
|
|||
// class MyClassTest : public testing::Test {
|
|||
// // ...
|
|||
// };
|
|||
//
|
|||
// TEST_F(MyClassTest, PrivateMethodWorks) {
|
|||
// // Can call MyClass::PrivateMethod() here.
|
|||
// }
|
|||
//
|
|||
// Note: The test class must be in the same namespace as the class being tested.
|
|||
// For example, putting MyClassTest in an anonymous namespace will not work.
|
|||
|
|||
#define FRIEND_TEST(test_case_name, test_name)\ |
|||
friend class test_case_name##_##test_name##_Test |
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
|
@ -0,0 +1,56 @@ |
|||
# Customization Points |
|||
|
|||
The custom directory is an injection point for custom user configurations. |
|||
|
|||
## Header `gtest.h` |
|||
|
|||
### The following macros can be defined: |
|||
|
|||
* `GTEST_OS_STACK_TRACE_GETTER_` - The name of an implementation of |
|||
`OsStackTraceGetterInterface`. |
|||
* `GTEST_CUSTOM_TEMPDIR_FUNCTION_` - An override for `testing::TempDir()`. See |
|||
`testing::TempDir` for semantics and signature. |
|||
|
|||
## Header `gtest-port.h` |
|||
|
|||
The following macros can be defined: |
|||
|
|||
### Flag related macros: |
|||
|
|||
* `GTEST_FLAG(flag_name)` |
|||
* `GTEST_USE_OWN_FLAGFILE_FLAG_` - Define to 0 when the system provides its |
|||
own flagfile flag parsing. |
|||
* `GTEST_DECLARE_bool_(name)` |
|||
* `GTEST_DECLARE_int32_(name)` |
|||
* `GTEST_DECLARE_string_(name)` |
|||
* `GTEST_DEFINE_bool_(name, default_val, doc)` |
|||
* `GTEST_DEFINE_int32_(name, default_val, doc)` |
|||
* `GTEST_DEFINE_string_(name, default_val, doc)` |
|||
|
|||
### Logging: |
|||
|
|||
* `GTEST_LOG_(severity)` |
|||
* `GTEST_CHECK_(condition)` |
|||
* Functions `LogToStderr()` and `FlushInfoLog()` have to be provided too. |
|||
|
|||
### Threading: |
|||
|
|||
* `GTEST_HAS_NOTIFICATION_` - Enabled if Notification is already provided. |
|||
* `GTEST_HAS_MUTEX_AND_THREAD_LOCAL_` - Enabled if `Mutex` and `ThreadLocal` |
|||
are already provided. Must also provide `GTEST_DECLARE_STATIC_MUTEX_(mutex)` |
|||
and `GTEST_DEFINE_STATIC_MUTEX_(mutex)` |
|||
* `GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)` |
|||
* `GTEST_LOCK_EXCLUDED_(locks)` |
|||
|
|||
### Underlying library support features |
|||
|
|||
* `GTEST_HAS_CXXABI_H_` |
|||
|
|||
### Exporting API symbols: |
|||
|
|||
* `GTEST_API_` - Specifier for exported symbols. |
|||
|
|||
## Header `gtest-printers.h` |
|||
|
|||
* See documentation at `gtest/gtest-printers.h` for details on how to define a |
|||
custom printer. |
@ -0,0 +1,37 @@ |
|||
// Copyright 2015, Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
//
|
|||
// Injection point for custom user configurations. See README for details
|
|||
//
|
|||
// ** Custom implementation starts here **
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ |
|||
#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ |
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_
|
@ -0,0 +1,42 @@ |
|||
// Copyright 2015, Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
//
|
|||
// This file provides an injection point for custom printers in a local
|
|||
// installation of gTest.
|
|||
// It will be included from gtest-printers.h and the overrides in this file
|
|||
// will be visible to everyone.
|
|||
//
|
|||
// Injection point for custom user configurations. See README for details
|
|||
//
|
|||
// ** Custom implementation starts here **
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ |
|||
#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ |
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
|
@ -0,0 +1,37 @@ |
|||
// Copyright 2015, Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
//
|
|||
// Injection point for custom user configurations. See README for details
|
|||
//
|
|||
// ** Custom implementation starts here **
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ |
|||
#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ |
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_
|
@ -0,0 +1,280 @@ |
|||
// Copyright 2005, Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
//
|
|||
// The Google C++ Testing and Mocking Framework (Google Test)
|
|||
//
|
|||
// This header file defines internal utilities needed for implementing
|
|||
// death tests. They are subject to change without notice.
|
|||
// GOOGLETEST_CM0001 DO NOT DELETE
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ |
|||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ |
|||
|
|||
#include "gtest/internal/gtest-internal.h" |
|||
|
|||
#include <stdio.h> |
|||
|
|||
namespace testing { |
|||
namespace internal { |
|||
|
|||
GTEST_DECLARE_string_(internal_run_death_test); |
|||
|
|||
// Names of the flags (needed for parsing Google Test flags).
|
|||
const char kDeathTestStyleFlag[] = "death_test_style"; |
|||
const char kDeathTestUseFork[] = "death_test_use_fork"; |
|||
const char kInternalRunDeathTestFlag[] = "internal_run_death_test"; |
|||
|
|||
#if GTEST_HAS_DEATH_TEST |
|||
|
|||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ |
|||
/* class A needs to have dll-interface to be used by clients of class B */) |
|||
|
|||
// DeathTest is a class that hides much of the complexity of the
|
|||
// GTEST_DEATH_TEST_ macro. It is abstract; its static Create method
|
|||
// returns a concrete class that depends on the prevailing death test
|
|||
// style, as defined by the --gtest_death_test_style and/or
|
|||
// --gtest_internal_run_death_test flags.
|
|||
|
|||
// In describing the results of death tests, these terms are used with
|
|||
// the corresponding definitions:
|
|||
//
|
|||
// exit status: The integer exit information in the format specified
|
|||
// by wait(2)
|
|||
// exit code: The integer code passed to exit(3), _exit(2), or
|
|||
// returned from main()
|
|||
class GTEST_API_ DeathTest { |
|||
public: |
|||
// Create returns false if there was an error determining the
|
|||
// appropriate action to take for the current death test; for example,
|
|||
// if the gtest_death_test_style flag is set to an invalid value.
|
|||
// The LastMessage method will return a more detailed message in that
|
|||
// case. Otherwise, the DeathTest pointer pointed to by the "test"
|
|||
// argument is set. If the death test should be skipped, the pointer
|
|||
// is set to NULL; otherwise, it is set to the address of a new concrete
|
|||
// DeathTest object that controls the execution of the current test.
|
|||
static bool Create(const char* statement, const RE* regex, |
|||
const char* file, int line, DeathTest** test); |
|||
DeathTest(); |
|||
virtual ~DeathTest() { } |
|||
|
|||
// A helper class that aborts a death test when it's deleted.
|
|||
class ReturnSentinel { |
|||
public: |
|||
explicit ReturnSentinel(DeathTest* test) : test_(test) { } |
|||
~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); } |
|||
private: |
|||
DeathTest* const test_; |
|||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel); |
|||
} GTEST_ATTRIBUTE_UNUSED_; |
|||
|
|||
// An enumeration of possible roles that may be taken when a death
|
|||
// test is encountered. EXECUTE means that the death test logic should
|
|||
// be executed immediately. OVERSEE means that the program should prepare
|
|||
// the appropriate environment for a child process to execute the death
|
|||
// test, then wait for it to complete.
|
|||
enum TestRole { OVERSEE_TEST, EXECUTE_TEST }; |
|||
|
|||
// An enumeration of the three reasons that a test might be aborted.
|
|||
enum AbortReason { |
|||
TEST_ENCOUNTERED_RETURN_STATEMENT, |
|||
TEST_THREW_EXCEPTION, |
|||
TEST_DID_NOT_DIE |
|||
}; |
|||
|
|||
// Assumes one of the above roles.
|
|||
virtual TestRole AssumeRole() = 0; |
|||
|
|||
// Waits for the death test to finish and returns its status.
|
|||
virtual int Wait() = 0; |
|||
|
|||
// Returns true if the death test passed; that is, the test process
|
|||
// exited during the test, its exit status matches a user-supplied
|
|||
// predicate, and its stderr output matches a user-supplied regular
|
|||
// expression.
|
|||
// The user-supplied predicate may be a macro expression rather
|
|||
// than a function pointer or functor, or else Wait and Passed could
|
|||
// be combined.
|
|||
virtual bool Passed(bool exit_status_ok) = 0; |
|||
|
|||
// Signals that the death test did not die as expected.
|
|||
virtual void Abort(AbortReason reason) = 0; |
|||
|
|||
// Returns a human-readable outcome message regarding the outcome of
|
|||
// the last death test.
|
|||
static const char* LastMessage(); |
|||
|
|||
static void set_last_death_test_message(const std::string& message); |
|||
|
|||
private: |
|||
// A string containing a description of the outcome of the last death test.
|
|||
static std::string last_death_test_message_; |
|||
|
|||
GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest); |
|||
}; |
|||
|
|||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
|
|||
|
|||
// Factory interface for death tests. May be mocked out for testing.
|
|||
class DeathTestFactory { |
|||
public: |
|||
virtual ~DeathTestFactory() { } |
|||
virtual bool Create(const char* statement, const RE* regex, |
|||
const char* file, int line, DeathTest** test) = 0; |
|||
}; |
|||
|
|||
// A concrete DeathTestFactory implementation for normal use.
|
|||
class DefaultDeathTestFactory : public DeathTestFactory { |
|||
public: |
|||
virtual bool Create(const char* statement, const RE* regex, |
|||
const char* file, int line, DeathTest** test); |
|||
}; |
|||
|
|||
// Returns true if exit_status describes a process that was terminated
|
|||
// by a signal, or exited normally with a nonzero exit code.
|
|||
GTEST_API_ bool ExitedUnsuccessfully(int exit_status); |
|||
|
|||
// Traps C++ exceptions escaping statement and reports them as test
|
|||
// failures. Note that trapping SEH exceptions is not implemented here.
|
|||
# if GTEST_HAS_EXCEPTIONS |
|||
# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ |
|||
try { \ |
|||
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ |
|||
} catch (const ::std::exception& gtest_exception) { \ |
|||
fprintf(\ |
|||
stderr, \ |
|||
"\n%s: Caught std::exception-derived exception escaping the " \ |
|||
"death test statement. Exception message: %s\n", \ |
|||
::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \ |
|||
gtest_exception.what()); \ |
|||
fflush(stderr); \ |
|||
death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ |
|||
} catch (...) { \ |
|||
death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ |
|||
} |
|||
|
|||
# else |
|||
# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ |
|||
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) |
|||
|
|||
# endif |
|||
|
|||
// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
|
|||
// ASSERT_EXIT*, and EXPECT_EXIT*.
|
|||
# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \ |
|||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ |
|||
if (::testing::internal::AlwaysTrue()) { \ |
|||
const ::testing::internal::RE& gtest_regex = (regex); \ |
|||
::testing::internal::DeathTest* gtest_dt; \ |
|||
if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \ |
|||
__FILE__, __LINE__, >est_dt)) { \ |
|||
goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ |
|||
} \ |
|||
if (gtest_dt != NULL) { \ |
|||
::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \ |
|||
gtest_dt_ptr(gtest_dt); \ |
|||
switch (gtest_dt->AssumeRole()) { \ |
|||
case ::testing::internal::DeathTest::OVERSEE_TEST: \ |
|||
if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ |
|||
goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ |
|||
} \ |
|||
break; \ |
|||
case ::testing::internal::DeathTest::EXECUTE_TEST: { \ |
|||
::testing::internal::DeathTest::ReturnSentinel \ |
|||
gtest_sentinel(gtest_dt); \ |
|||
GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \ |
|||
gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ |
|||
break; \ |
|||
} \ |
|||
default: \ |
|||
break; \ |
|||
} \ |
|||
} \ |
|||
} else \ |
|||
GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \ |
|||
fail(::testing::internal::DeathTest::LastMessage()) |
|||
// The symbol "fail" here expands to something into which a message
|
|||
// can be streamed.
|
|||
|
|||
// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
|
|||
// NDEBUG mode. In this case we need the statements to be executed and the macro
|
|||
// must accept a streamed message even though the message is never printed.
|
|||
// The regex object is not evaluated, but it is used to prevent "unused"
|
|||
// warnings and to avoid an expression that doesn't compile in debug mode.
|
|||
#define GTEST_EXECUTE_STATEMENT_(statement, regex) \ |
|||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ |
|||
if (::testing::internal::AlwaysTrue()) { \ |
|||
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ |
|||
} else if (!::testing::internal::AlwaysTrue()) { \ |
|||
const ::testing::internal::RE& gtest_regex = (regex); \ |
|||
static_cast<void>(gtest_regex); \ |
|||
} else \ |
|||
::testing::Message() |
|||
|
|||
// A class representing the parsed contents of the
|
|||
// --gtest_internal_run_death_test flag, as it existed when
|
|||
// RUN_ALL_TESTS was called.
|
|||
class InternalRunDeathTestFlag { |
|||
public: |
|||
InternalRunDeathTestFlag(const std::string& a_file, |
|||
int a_line, |
|||
int an_index, |
|||
int a_write_fd) |
|||
: file_(a_file), line_(a_line), index_(an_index), |
|||
write_fd_(a_write_fd) {} |
|||
|
|||
~InternalRunDeathTestFlag() { |
|||
if (write_fd_ >= 0) |
|||
posix::Close(write_fd_); |
|||
} |
|||
|
|||
const std::string& file() const { return file_; } |
|||
int line() const { return line_; } |
|||
int index() const { return index_; } |
|||
int write_fd() const { return write_fd_; } |
|||
|
|||
private: |
|||
std::string file_; |
|||
int line_; |
|||
int index_; |
|||
int write_fd_; |
|||
|
|||
GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag); |
|||
}; |
|||
|
|||
// Returns a newly created InternalRunDeathTestFlag object with fields
|
|||
// initialized from the GTEST_FLAG(internal_run_death_test) flag if
|
|||
// the flag is specified; otherwise returns NULL.
|
|||
InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag(); |
|||
|
|||
#endif // GTEST_HAS_DEATH_TEST
|
|||
|
|||
} // namespace internal
|
|||
} // namespace testing
|
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
|
@ -0,0 +1,211 @@ |
|||
// Copyright 2008, Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
//
|
|||
// Google Test filepath utilities
|
|||
//
|
|||
// This header file declares classes and functions used internally by
|
|||
// Google Test. They are subject to change without notice.
|
|||
//
|
|||
// This file is #included in gtest/internal/gtest-internal.h.
|
|||
// Do not include this header file separately!
|
|||
|
|||
// GOOGLETEST_CM0001 DO NOT DELETE
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ |
|||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ |
|||
|
|||
#include "gtest/internal/gtest-string.h" |
|||
|
|||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ |
|||
/* class A needs to have dll-interface to be used by clients of class B */) |
|||
|
|||
namespace testing { |
|||
namespace internal { |
|||
|
|||
// FilePath - a class for file and directory pathname manipulation which
|
|||
// handles platform-specific conventions (like the pathname separator).
|
|||
// Used for helper functions for naming files in a directory for xml output.
|
|||
// Except for Set methods, all methods are const or static, which provides an
|
|||
// "immutable value object" -- useful for peace of mind.
|
|||
// A FilePath with a value ending in a path separator ("like/this/") represents
|
|||
// a directory, otherwise it is assumed to represent a file. In either case,
|
|||
// it may or may not represent an actual file or directory in the file system.
|
|||
// Names are NOT checked for syntax correctness -- no checking for illegal
|
|||
// characters, malformed paths, etc.
|
|||
|
|||
class GTEST_API_ FilePath { |
|||
public: |
|||
FilePath() : pathname_("") { } |
|||
FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { } |
|||
|
|||
explicit FilePath(const std::string& pathname) : pathname_(pathname) { |
|||
Normalize(); |
|||
} |
|||
|
|||
FilePath& operator=(const FilePath& rhs) { |
|||
Set(rhs); |
|||
return *this; |
|||
} |
|||
|
|||
void Set(const FilePath& rhs) { |
|||
pathname_ = rhs.pathname_; |
|||
} |
|||
|
|||
const std::string& string() const { return pathname_; } |
|||
const char* c_str() const { return pathname_.c_str(); } |
|||
|
|||
// Returns the current working directory, or "" if unsuccessful.
|
|||
static FilePath GetCurrentDir(); |
|||
|
|||
// Given directory = "dir", base_name = "test", number = 0,
|
|||
// extension = "xml", returns "dir/test.xml". If number is greater
|
|||
// than zero (e.g., 12), returns "dir/test_12.xml".
|
|||
// On Windows platform, uses \ as the separator rather than /.
|
|||
static FilePath MakeFileName(const FilePath& directory, |
|||
const FilePath& base_name, |
|||
int number, |
|||
const char* extension); |
|||
|
|||
// Given directory = "dir", relative_path = "test.xml",
|
|||
// returns "dir/test.xml".
|
|||
// On Windows, uses \ as the separator rather than /.
|
|||
static FilePath ConcatPaths(const FilePath& directory, |
|||
const FilePath& relative_path); |
|||
|
|||
// Returns a pathname for a file that does not currently exist. The pathname
|
|||
// will be directory/base_name.extension or
|
|||
// directory/base_name_<number>.extension if directory/base_name.extension
|
|||
// already exists. The number will be incremented until a pathname is found
|
|||
// that does not already exist.
|
|||
// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
|
|||
// There could be a race condition if two or more processes are calling this
|
|||
// function at the same time -- they could both pick the same filename.
|
|||
static FilePath GenerateUniqueFileName(const FilePath& directory, |
|||
const FilePath& base_name, |
|||
const char* extension); |
|||
|
|||
// Returns true iff the path is "".
|
|||
bool IsEmpty() const { return pathname_.empty(); } |
|||
|
|||
// If input name has a trailing separator character, removes it and returns
|
|||
// the name, otherwise return the name string unmodified.
|
|||
// On Windows platform, uses \ as the separator, other platforms use /.
|
|||
FilePath RemoveTrailingPathSeparator() const; |
|||
|
|||
// Returns a copy of the FilePath with the directory part removed.
|
|||
// Example: FilePath("path/to/file").RemoveDirectoryName() returns
|
|||
// FilePath("file"). If there is no directory part ("just_a_file"), it returns
|
|||
// the FilePath unmodified. If there is no file part ("just_a_dir/") it
|
|||
// returns an empty FilePath ("").
|
|||
// On Windows platform, '\' is the path separator, otherwise it is '/'.
|
|||
FilePath RemoveDirectoryName() const; |
|||
|
|||
// RemoveFileName returns the directory path with the filename removed.
|
|||
// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
|
|||
// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
|
|||
// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
|
|||
// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
|
|||
// On Windows platform, '\' is the path separator, otherwise it is '/'.
|
|||
FilePath RemoveFileName() const; |
|||
|
|||
// Returns a copy of the FilePath with the case-insensitive extension removed.
|
|||
// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
|
|||
// FilePath("dir/file"). If a case-insensitive extension is not
|
|||
// found, returns a copy of the original FilePath.
|
|||
FilePath RemoveExtension(const char* extension) const; |
|||
|
|||
// Creates directories so that path exists. Returns true if successful or if
|
|||
// the directories already exist; returns false if unable to create
|
|||
// directories for any reason. Will also return false if the FilePath does
|
|||
// not represent a directory (that is, it doesn't end with a path separator).
|
|||
bool CreateDirectoriesRecursively() const; |
|||
|
|||
// Create the directory so that path exists. Returns true if successful or
|
|||
// if the directory already exists; returns false if unable to create the
|
|||
// directory for any reason, including if the parent directory does not
|
|||
// exist. Not named "CreateDirectory" because that's a macro on Windows.
|
|||
bool CreateFolder() const; |
|||
|
|||
// Returns true if FilePath describes something in the file-system,
|
|||
// either a file, directory, or whatever, and that something exists.
|
|||
bool FileOrDirectoryExists() const; |
|||
|
|||
// Returns true if pathname describes a directory in the file-system
|
|||
// that exists.
|
|||
bool DirectoryExists() const; |
|||
|
|||
// Returns true if FilePath ends with a path separator, which indicates that
|
|||
// it is intended to represent a directory. Returns false otherwise.
|
|||
// This does NOT check that a directory (or file) actually exists.
|
|||
bool IsDirectory() const; |
|||
|
|||
// Returns true if pathname describes a root directory. (Windows has one
|
|||
// root directory per disk drive.)
|
|||
bool IsRootDirectory() const; |
|||
|
|||
// Returns true if pathname describes an absolute path.
|
|||
bool IsAbsolutePath() const; |
|||
|
|||
private: |
|||
// Replaces multiple consecutive separators with a single separator.
|
|||
// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
|
|||
// redundancies that might be in a pathname involving "." or "..".
|
|||
//
|
|||
// A pathname with multiple consecutive separators may occur either through
|
|||
// user error or as a result of some scripts or APIs that generate a pathname
|
|||
// with a trailing separator. On other platforms the same API or script
|
|||
// may NOT generate a pathname with a trailing "/". Then elsewhere that
|
|||
// pathname may have another "/" and pathname components added to it,
|
|||
// without checking for the separator already being there.
|
|||
// The script language and operating system may allow paths like "foo//bar"
|
|||
// but some of the functions in FilePath will not handle that correctly. In
|
|||
// particular, RemoveTrailingPathSeparator() only removes one separator, and
|
|||
// it is called in CreateDirectoriesRecursively() assuming that it will change
|
|||
// a pathname from directory syntax (trailing separator) to filename syntax.
|
|||
//
|
|||
// On Windows this method also replaces the alternate path separator '/' with
|
|||
// the primary path separator '\\', so that for example "bar\\/\\foo" becomes
|
|||
// "bar\\foo".
|
|||
|
|||
void Normalize(); |
|||
|
|||
// Returns a pointer to the last occurence of a valid path separator in
|
|||
// the FilePath. On Windows, for example, both '/' and '\' are valid path
|
|||
// separators. Returns NULL if no path separator was found.
|
|||
const char* FindLastPathSeparator() const; |
|||
|
|||
std::string pathname_; |
|||
}; // class FilePath
|
|||
|
|||
} // namespace internal
|
|||
} // namespace testing
|
|||
|
|||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
|
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
|
File diff suppressed because it is too large
@ -0,0 +1,243 @@ |
|||
// Copyright 2003 Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
//
|
|||
// A "smart" pointer type with reference tracking. Every pointer to a
|
|||
// particular object is kept on a circular linked list. When the last pointer
|
|||
// to an object is destroyed or reassigned, the object is deleted.
|
|||
//
|
|||
// Used properly, this deletes the object when the last reference goes away.
|
|||
// There are several caveats:
|
|||
// - Like all reference counting schemes, cycles lead to leaks.
|
|||
// - Each smart pointer is actually two pointers (8 bytes instead of 4).
|
|||
// - Every time a pointer is assigned, the entire list of pointers to that
|
|||
// object is traversed. This class is therefore NOT SUITABLE when there
|
|||
// will often be more than two or three pointers to a particular object.
|
|||
// - References are only tracked as long as linked_ptr<> objects are copied.
|
|||
// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
|
|||
// will happen (double deletion).
|
|||
//
|
|||
// A good use of this class is storing object references in STL containers.
|
|||
// You can safely put linked_ptr<> in a vector<>.
|
|||
// Other uses may not be as good.
|
|||
//
|
|||
// Note: If you use an incomplete type with linked_ptr<>, the class
|
|||
// *containing* linked_ptr<> must have a constructor and destructor (even
|
|||
// if they do nothing!).
|
|||
//
|
|||
// Bill Gibbons suggested we use something like this.
|
|||
//
|
|||
// Thread Safety:
|
|||
// Unlike other linked_ptr implementations, in this implementation
|
|||
// a linked_ptr object is thread-safe in the sense that:
|
|||
// - it's safe to copy linked_ptr objects concurrently,
|
|||
// - it's safe to copy *from* a linked_ptr and read its underlying
|
|||
// raw pointer (e.g. via get()) concurrently, and
|
|||
// - it's safe to write to two linked_ptrs that point to the same
|
|||
// shared object concurrently.
|
|||
// FIXME: rename this to safe_linked_ptr to avoid
|
|||
// confusion with normal linked_ptr.
|
|||
|
|||
// GOOGLETEST_CM0001 DO NOT DELETE
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ |
|||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ |
|||
|
|||
#include <stdlib.h> |
|||
#include <assert.h> |
|||
|
|||
#include "gtest/internal/gtest-port.h" |
|||
|
|||
namespace testing { |
|||
namespace internal { |
|||
|
|||
// Protects copying of all linked_ptr objects.
|
|||
GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex); |
|||
|
|||
// This is used internally by all instances of linked_ptr<>. It needs to be
|
|||
// a non-template class because different types of linked_ptr<> can refer to
|
|||
// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
|
|||
// So, it needs to be possible for different types of linked_ptr to participate
|
|||
// in the same circular linked list, so we need a single class type here.
|
|||
//
|
|||
// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr<T>.
|
|||
class linked_ptr_internal { |
|||
public: |
|||
// Create a new circle that includes only this instance.
|
|||
void join_new() { |
|||
next_ = this; |
|||
} |
|||
|
|||
// Many linked_ptr operations may change p.link_ for some linked_ptr
|
|||
// variable p in the same circle as this object. Therefore we need
|
|||
// to prevent two such operations from occurring concurrently.
|
|||
//
|
|||
// Note that different types of linked_ptr objects can coexist in a
|
|||
// circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
|
|||
// linked_ptr<Derived2>). Therefore we must use a single mutex to
|
|||
// protect all linked_ptr objects. This can create serious
|
|||
// contention in production code, but is acceptable in a testing
|
|||
// framework.
|
|||
|
|||
// Join an existing circle.
|
|||
void join(linked_ptr_internal const* ptr) |
|||
GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) { |
|||
MutexLock lock(&g_linked_ptr_mutex); |
|||
|
|||
linked_ptr_internal const* p = ptr; |
|||
while (p->next_ != ptr) { |
|||
assert(p->next_ != this && |
|||
"Trying to join() a linked ring we are already in. " |
|||
"Is GMock thread safety enabled?"); |
|||
p = p->next_; |
|||
} |
|||
p->next_ = this; |
|||
next_ = ptr; |
|||
} |
|||
|
|||
// Leave whatever circle we're part of. Returns true if we were the
|
|||
// last member of the circle. Once this is done, you can join() another.
|
|||
bool depart() |
|||
GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) { |
|||
MutexLock lock(&g_linked_ptr_mutex); |
|||
|
|||
if (next_ == this) return true; |
|||
linked_ptr_internal const* p = next_; |
|||
while (p->next_ != this) { |
|||
assert(p->next_ != next_ && |
|||
"Trying to depart() a linked ring we are not in. " |
|||
"Is GMock thread safety enabled?"); |
|||
p = p->next_; |
|||
} |
|||
p->next_ = next_; |
|||
return false; |
|||
} |
|||
|
|||
private: |
|||
mutable linked_ptr_internal const* next_; |
|||
}; |
|||
|
|||
template <typename T> |
|||
class linked_ptr { |
|||
public: |
|||
typedef T element_type; |
|||
|
|||
// Take over ownership of a raw pointer. This should happen as soon as
|
|||
// possible after the object is created.
|
|||
explicit linked_ptr(T* ptr = NULL) { capture(ptr); } |
|||
~linked_ptr() { depart(); } |
|||
|
|||
// Copy an existing linked_ptr<>, adding ourselves to the list of references.
|
|||
template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); } |
|||
linked_ptr(linked_ptr const& ptr) { // NOLINT
|
|||
assert(&ptr != this); |
|||
copy(&ptr); |
|||
} |
|||
|
|||
// Assignment releases the old value and acquires the new.
|
|||
template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) { |
|||
depart(); |
|||
copy(&ptr); |
|||
return *this; |
|||
} |
|||
|
|||
linked_ptr& operator=(linked_ptr const& ptr) { |
|||
if (&ptr != this) { |
|||
depart(); |
|||
copy(&ptr); |
|||
} |
|||
return *this; |
|||
} |
|||
|
|||
// Smart pointer members.
|
|||
void reset(T* ptr = NULL) { |
|||
depart(); |
|||
capture(ptr); |
|||
} |
|||
T* get() const { return value_; } |
|||
T* operator->() const { return value_; } |
|||
T& operator*() const { return *value_; } |
|||
|
|||
bool operator==(T* p) const { return value_ == p; } |
|||
bool operator!=(T* p) const { return value_ != p; } |
|||
template <typename U> |
|||
bool operator==(linked_ptr<U> const& ptr) const { |
|||
return value_ == ptr.get(); |
|||
} |
|||
template <typename U> |
|||
bool operator!=(linked_ptr<U> const& ptr) const { |
|||
return value_ != ptr.get(); |
|||
} |
|||
|
|||
private: |
|||
template <typename U> |
|||
friend class linked_ptr; |
|||
|
|||
T* value_; |
|||
linked_ptr_internal link_; |
|||
|
|||
void depart() { |
|||
if (link_.depart()) delete value_; |
|||
} |
|||
|
|||
void capture(T* ptr) { |
|||
value_ = ptr; |
|||
link_.join_new(); |
|||
} |
|||
|
|||
template <typename U> void copy(linked_ptr<U> const* ptr) { |
|||
value_ = ptr->get(); |
|||
if (value_) |
|||
link_.join(&ptr->link_); |
|||
else |
|||
link_.join_new(); |
|||
} |
|||
}; |
|||
|
|||
template<typename T> inline |
|||
bool operator==(T* ptr, const linked_ptr<T>& x) { |
|||
return ptr == x.get(); |
|||
} |
|||
|
|||
template<typename T> inline |
|||
bool operator!=(T* ptr, const linked_ptr<T>& x) { |
|||
return ptr != x.get(); |
|||
} |
|||
|
|||
// A function to convert T* into linked_ptr<T>
|
|||
// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
|
|||
// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
|
|||
template <typename T> |
|||
linked_ptr<T> make_linked_ptr(T* ptr) { |
|||
return linked_ptr<T>(ptr); |
|||
} |
|||
|
|||
} // namespace internal
|
|||
} // namespace testing
|
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
|
File diff suppressed because it is too large
@ -0,0 +1,282 @@ |
|||
$$ -*- mode: c++; -*- |
|||
$var n = 50 $$ Maximum length of Values arguments we want to support. |
|||
$var maxtuple = 10 $$ Maximum number of Combine arguments we want to support. |
|||
// Copyright 2008 Google Inc. |
|||
// All Rights Reserved. |
|||
// |
|||
// Redistribution and use in source and binary forms, with or without |
|||
// modification, are permitted provided that the following conditions are |
|||
// met: |
|||
// |
|||
// * Redistributions of source code must retain the above copyright |
|||
// notice, this list of conditions and the following disclaimer. |
|||
// * Redistributions in binary form must reproduce the above |
|||
// copyright notice, this list of conditions and the following disclaimer |
|||
// in the documentation and/or other materials provided with the |
|||
// distribution. |
|||
// * Neither the name of Google Inc. nor the names of its |
|||
// contributors may be used to endorse or promote products derived from |
|||
// this software without specific prior written permission. |
|||
// |
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
|
|||
|
|||
// Type and function utilities for implementing parameterized tests. |
|||
// This file is generated by a SCRIPT. DO NOT EDIT BY HAND! |
|||
// |
|||
// Currently Google Test supports at most $n arguments in Values, |
|||
// and at most $maxtuple arguments in Combine. Please contact |
|||
// googletestframework@googlegroups.com if you need more. |
|||
// Please note that the number of arguments to Combine is limited |
|||
// by the maximum arity of the implementation of tuple which is |
|||
// currently set at $maxtuple. |
|||
|
|||
// GOOGLETEST_CM0001 DO NOT DELETE |
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ |
|||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ |
|||
|
|||
#include "gtest/internal/gtest-param-util.h" |
|||
#include "gtest/internal/gtest-port.h" |
|||
|
|||
namespace testing { |
|||
|
|||
// Forward declarations of ValuesIn(), which is implemented in |
|||
// include/gtest/gtest-param-test.h. |
|||
template <typename ForwardIterator> |
|||
internal::ParamGenerator< |
|||
typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type> |
|||
ValuesIn(ForwardIterator begin, ForwardIterator end); |
|||
|
|||
template <typename T, size_t N> |
|||
internal::ParamGenerator<T> ValuesIn(const T (&array)[N]); |
|||
|
|||
template <class Container> |
|||
internal::ParamGenerator<typename Container::value_type> ValuesIn( |
|||
const Container& container); |
|||
|
|||
namespace internal { |
|||
|
|||
// Used in the Values() function to provide polymorphic capabilities. |
|||
$range i 1..n |
|||
$for i [[ |
|||
$range j 1..i |
|||
|
|||
template <$for j, [[typename T$j]]> |
|||
class ValueArray$i { |
|||
public: |
|||
$if i==1 [[explicit ]]ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {} |
|||
|
|||
template <typename T> |
|||
operator ParamGenerator<T>() const { |
|||
const T array[] = {$for j, [[static_cast<T>(v$(j)_)]]}; |
|||
return ValuesIn(array); |
|||
} |
|||
|
|||
ValueArray$i(const ValueArray$i& other) : $for j, [[v$(j)_(other.v$(j)_)]] {} |
|||
|
|||
private: |
|||
// No implementation - assignment is unsupported. |
|||
void operator=(const ValueArray$i& other); |
|||
|
|||
$for j [[ |
|||
|
|||
const T$j v$(j)_; |
|||
]] |
|||
|
|||
}; |
|||
|
|||
]] |
|||
|
|||
# if GTEST_HAS_COMBINE |
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. |
|||
// |
|||
// Generates values from the Cartesian product of values produced |
|||
// by the argument generators. |
|||
// |
|||
$range i 2..maxtuple |
|||
$for i [[ |
|||
$range j 1..i |
|||
$range k 2..i |
|||
|
|||
template <$for j, [[typename T$j]]> |
|||
class CartesianProductGenerator$i |
|||
: public ParamGeneratorInterface< ::testing::tuple<$for j, [[T$j]]> > { |
|||
public: |
|||
typedef ::testing::tuple<$for j, [[T$j]]> ParamType; |
|||
|
|||
CartesianProductGenerator$i($for j, [[const ParamGenerator<T$j>& g$j]]) |
|||
: $for j, [[g$(j)_(g$j)]] {} |
|||
virtual ~CartesianProductGenerator$i() {} |
|||
|
|||
virtual ParamIteratorInterface<ParamType>* Begin() const { |
|||
return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]); |
|||
} |
|||
virtual ParamIteratorInterface<ParamType>* End() const { |
|||
return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]); |
|||
} |
|||
|
|||
private: |
|||
class Iterator : public ParamIteratorInterface<ParamType> { |
|||
public: |
|||
Iterator(const ParamGeneratorInterface<ParamType>* base, $for j, [[ |
|||
|
|||
const ParamGenerator<T$j>& g$j, |
|||
const typename ParamGenerator<T$j>::iterator& current$(j)]]) |
|||
: base_(base), |
|||
$for j, [[ |
|||
|
|||
begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j) |
|||
]] { |
|||
ComputeCurrentValue(); |
|||
} |
|||
virtual ~Iterator() {} |
|||
|
|||
virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { |
|||
return base_; |
|||
} |
|||
// Advance should not be called on beyond-of-range iterators |
|||
// so no component iterators must be beyond end of range, either. |
|||
virtual void Advance() { |
|||
assert(!AtEnd()); |
|||
++current$(i)_; |
|||
|
|||
$for k [[ |
|||
if (current$(i+2-k)_ == end$(i+2-k)_) { |
|||
current$(i+2-k)_ = begin$(i+2-k)_; |
|||
++current$(i+2-k-1)_; |
|||
} |
|||
|
|||
]] |
|||
ComputeCurrentValue(); |
|||
} |
|||
virtual ParamIteratorInterface<ParamType>* Clone() const { |
|||
return new Iterator(*this); |
|||
} |
|||
virtual const ParamType* Current() const { return current_value_.get(); } |
|||
virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { |
|||
// Having the same base generator guarantees that the other |
|||
// iterator is of the same type and we can downcast. |
|||
GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) |
|||
<< "The program attempted to compare iterators " |
|||
<< "from different generators." << std::endl; |
|||
const Iterator* typed_other = |
|||
CheckedDowncastToActualType<const Iterator>(&other); |
|||
// We must report iterators equal if they both point beyond their |
|||
// respective ranges. That can happen in a variety of fashions, |
|||
// so we have to consult AtEnd(). |
|||
return (AtEnd() && typed_other->AtEnd()) || |
|||
($for j && [[ |
|||
|
|||
current$(j)_ == typed_other->current$(j)_ |
|||
]]); |
|||
} |
|||
|
|||
private: |
|||
Iterator(const Iterator& other) |
|||
: base_(other.base_), $for j, [[ |
|||
|
|||
begin$(j)_(other.begin$(j)_), |
|||
end$(j)_(other.end$(j)_), |
|||
current$(j)_(other.current$(j)_) |
|||
]] { |
|||
ComputeCurrentValue(); |
|||
} |
|||
|
|||
void ComputeCurrentValue() { |
|||
if (!AtEnd()) |
|||
current_value_.reset(new ParamType($for j, [[*current$(j)_]])); |
|||
} |
|||
bool AtEnd() const { |
|||
// We must report iterator past the end of the range when either of the |
|||
// component iterators has reached the end of its range. |
|||
return |
|||
$for j || [[ |
|||
|
|||
current$(j)_ == end$(j)_ |
|||
]]; |
|||
} |
|||
|
|||
// No implementation - assignment is unsupported. |
|||
void operator=(const Iterator& other); |
|||
|
|||
const ParamGeneratorInterface<ParamType>* const base_; |
|||
// begin[i]_ and end[i]_ define the i-th range that Iterator traverses. |
|||
// current[i]_ is the actual traversing iterator. |
|||
$for j [[ |
|||
|
|||
const typename ParamGenerator<T$j>::iterator begin$(j)_; |
|||
const typename ParamGenerator<T$j>::iterator end$(j)_; |
|||
typename ParamGenerator<T$j>::iterator current$(j)_; |
|||
]] |
|||
|
|||
linked_ptr<ParamType> current_value_; |
|||
}; // class CartesianProductGenerator$i::Iterator |
|||
|
|||
// No implementation - assignment is unsupported. |
|||
void operator=(const CartesianProductGenerator$i& other); |
|||
|
|||
|
|||
$for j [[ |
|||
const ParamGenerator<T$j> g$(j)_; |
|||
|
|||
]] |
|||
}; // class CartesianProductGenerator$i |
|||
|
|||
|
|||
]] |
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. |
|||
// |
|||
// Helper classes providing Combine() with polymorphic features. They allow |
|||
// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is |
|||
// convertible to U. |
|||
// |
|||
$range i 2..maxtuple |
|||
$for i [[ |
|||
$range j 1..i |
|||
|
|||
template <$for j, [[class Generator$j]]> |
|||
class CartesianProductHolder$i { |
|||
public: |
|||
CartesianProductHolder$i($for j, [[const Generator$j& g$j]]) |
|||
: $for j, [[g$(j)_(g$j)]] {} |
|||
template <$for j, [[typename T$j]]> |
|||
operator ParamGenerator< ::testing::tuple<$for j, [[T$j]]> >() const { |
|||
return ParamGenerator< ::testing::tuple<$for j, [[T$j]]> >( |
|||
new CartesianProductGenerator$i<$for j, [[T$j]]>( |
|||
$for j,[[ |
|||
|
|||
static_cast<ParamGenerator<T$j> >(g$(j)_) |
|||
]])); |
|||
} |
|||
|
|||
private: |
|||
// No implementation - assignment is unsupported. |
|||
void operator=(const CartesianProductHolder$i& other); |
|||
|
|||
|
|||
$for j [[ |
|||
const Generator$j g$(j)_; |
|||
|
|||
]] |
|||
}; // class CartesianProductHolder$i |
|||
|
|||
]] |
|||
|
|||
# endif // GTEST_HAS_COMBINE |
|||
|
|||
} // namespace internal |
|||
} // namespace testing |
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ |
@ -0,0 +1,724 @@ |
|||
// Copyright 2008 Google Inc.
|
|||
// All Rights Reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|||
|
|||
// Type and function utilities for implementing parameterized tests.
|
|||
|
|||
// GOOGLETEST_CM0001 DO NOT DELETE
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ |
|||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ |
|||
|
|||
#include <ctype.h> |
|||
|
|||
#include <iterator> |
|||
#include <set> |
|||
#include <utility> |
|||
#include <vector> |
|||
|
|||
#include "gtest/internal/gtest-internal.h" |
|||
#include "gtest/internal/gtest-linked_ptr.h" |
|||
#include "gtest/internal/gtest-port.h" |
|||
#include "gtest/gtest-printers.h" |
|||
|
|||
namespace testing { |
|||
|
|||
// Input to a parameterized test name generator, describing a test parameter.
|
|||
// Consists of the parameter value and the integer parameter index.
|
|||
template <class ParamType> |
|||
struct TestParamInfo { |
|||
TestParamInfo(const ParamType& a_param, size_t an_index) : |
|||
param(a_param), |
|||
index(an_index) {} |
|||
ParamType param; |
|||
size_t index; |
|||
}; |
|||
|
|||
// A builtin parameterized test name generator which returns the result of
|
|||
// testing::PrintToString.
|
|||
struct PrintToStringParamName { |
|||
template <class ParamType> |
|||
std::string operator()(const TestParamInfo<ParamType>& info) const { |
|||
return PrintToString(info.param); |
|||
} |
|||
}; |
|||
|
|||
namespace internal { |
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
|||
//
|
|||
// Outputs a message explaining invalid registration of different
|
|||
// fixture class for the same test case. This may happen when
|
|||
// TEST_P macro is used to define two tests with the same name
|
|||
// but in different namespaces.
|
|||
GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name, |
|||
CodeLocation code_location); |
|||
|
|||
template <typename> class ParamGeneratorInterface; |
|||
template <typename> class ParamGenerator; |
|||
|
|||
// Interface for iterating over elements provided by an implementation
|
|||
// of ParamGeneratorInterface<T>.
|
|||
template <typename T> |
|||
class ParamIteratorInterface { |
|||
public: |
|||
virtual ~ParamIteratorInterface() {} |
|||
// A pointer to the base generator instance.
|
|||
// Used only for the purposes of iterator comparison
|
|||
// to make sure that two iterators belong to the same generator.
|
|||
virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0; |
|||
// Advances iterator to point to the next element
|
|||
// provided by the generator. The caller is responsible
|
|||
// for not calling Advance() on an iterator equal to
|
|||
// BaseGenerator()->End().
|
|||
virtual void Advance() = 0; |
|||
// Clones the iterator object. Used for implementing copy semantics
|
|||
// of ParamIterator<T>.
|
|||
virtual ParamIteratorInterface* Clone() const = 0; |
|||
// Dereferences the current iterator and provides (read-only) access
|
|||
// to the pointed value. It is the caller's responsibility not to call
|
|||
// Current() on an iterator equal to BaseGenerator()->End().
|
|||
// Used for implementing ParamGenerator<T>::operator*().
|
|||
virtual const T* Current() const = 0; |
|||
// Determines whether the given iterator and other point to the same
|
|||
// element in the sequence generated by the generator.
|
|||
// Used for implementing ParamGenerator<T>::operator==().
|
|||
virtual bool Equals(const ParamIteratorInterface& other) const = 0; |
|||
}; |
|||
|
|||
// Class iterating over elements provided by an implementation of
|
|||
// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
|
|||
// and implements the const forward iterator concept.
|
|||
template <typename T> |
|||
class ParamIterator { |
|||
public: |
|||
typedef T value_type; |
|||
typedef const T& reference; |
|||
typedef ptrdiff_t difference_type; |
|||
|
|||
// ParamIterator assumes ownership of the impl_ pointer.
|
|||
ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {} |
|||
ParamIterator& operator=(const ParamIterator& other) { |
|||
if (this != &other) |
|||
impl_.reset(other.impl_->Clone()); |
|||
return *this; |
|||
} |
|||
|
|||
const T& operator*() const { return *impl_->Current(); } |
|||
const T* operator->() const { return impl_->Current(); } |
|||
// Prefix version of operator++.
|
|||
ParamIterator& operator++() { |
|||
impl_->Advance(); |
|||
return *this; |
|||
} |
|||
// Postfix version of operator++.
|
|||
ParamIterator operator++(int /*unused*/) { |
|||
ParamIteratorInterface<T>* clone = impl_->Clone(); |
|||
impl_->Advance(); |
|||
return ParamIterator(clone); |
|||
} |
|||
bool operator==(const ParamIterator& other) const { |
|||
return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_); |
|||
} |
|||
bool operator!=(const ParamIterator& other) const { |
|||
return !(*this == other); |
|||
} |
|||
|
|||
private: |
|||
friend class ParamGenerator<T>; |
|||
explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {} |
|||
scoped_ptr<ParamIteratorInterface<T> > impl_; |
|||
}; |
|||
|
|||
// ParamGeneratorInterface<T> is the binary interface to access generators
|
|||
// defined in other translation units.
|
|||
template <typename T> |
|||
class ParamGeneratorInterface { |
|||
public: |
|||
typedef T ParamType; |
|||
|
|||
virtual ~ParamGeneratorInterface() {} |
|||
|
|||
// Generator interface definition
|
|||
virtual ParamIteratorInterface<T>* Begin() const = 0; |
|||
virtual ParamIteratorInterface<T>* End() const = 0; |
|||
}; |
|||
|
|||
// Wraps ParamGeneratorInterface<T> and provides general generator syntax
|
|||
// compatible with the STL Container concept.
|
|||
// This class implements copy initialization semantics and the contained
|
|||
// ParamGeneratorInterface<T> instance is shared among all copies
|
|||
// of the original object. This is possible because that instance is immutable.
|
|||
template<typename T> |
|||
class ParamGenerator { |
|||
public: |
|||
typedef ParamIterator<T> iterator; |
|||
|
|||
explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {} |
|||
ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {} |
|||
|
|||
ParamGenerator& operator=(const ParamGenerator& other) { |
|||
impl_ = other.impl_; |
|||
return *this; |
|||
} |
|||
|
|||
iterator begin() const { return iterator(impl_->Begin()); } |
|||
iterator end() const { return iterator(impl_->End()); } |
|||
|
|||
private: |
|||
linked_ptr<const ParamGeneratorInterface<T> > impl_; |
|||
}; |
|||
|
|||
// Generates values from a range of two comparable values. Can be used to
|
|||
// generate sequences of user-defined types that implement operator+() and
|
|||
// operator<().
|
|||
// This class is used in the Range() function.
|
|||
template <typename T, typename IncrementT> |
|||
class RangeGenerator : public ParamGeneratorInterface<T> { |
|||
public: |
|||
RangeGenerator(T begin, T end, IncrementT step) |
|||
: begin_(begin), end_(end), |
|||
step_(step), end_index_(CalculateEndIndex(begin, end, step)) {} |
|||
virtual ~RangeGenerator() {} |
|||
|
|||
virtual ParamIteratorInterface<T>* Begin() const { |
|||
return new Iterator(this, begin_, 0, step_); |
|||
} |
|||
virtual ParamIteratorInterface<T>* End() const { |
|||
return new Iterator(this, end_, end_index_, step_); |
|||
} |
|||
|
|||
private: |
|||
class Iterator : public ParamIteratorInterface<T> { |
|||
public: |
|||
Iterator(const ParamGeneratorInterface<T>* base, T value, int index, |
|||
IncrementT step) |
|||
: base_(base), value_(value), index_(index), step_(step) {} |
|||
virtual ~Iterator() {} |
|||
|
|||
virtual const ParamGeneratorInterface<T>* BaseGenerator() const { |
|||
return base_; |
|||
} |
|||
virtual void Advance() { |
|||
value_ = static_cast<T>(value_ + step_); |
|||
index_++; |
|||
} |
|||
virtual ParamIteratorInterface<T>* Clone() const { |
|||
return new Iterator(*this); |
|||
} |
|||
virtual const T* Current() const { return &value_; } |
|||
virtual bool Equals(const ParamIteratorInterface<T>& other) const { |
|||
// Having the same base generator guarantees that the other
|
|||
// iterator is of the same type and we can downcast.
|
|||
GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) |
|||
<< "The program attempted to compare iterators " |
|||
<< "from different generators." << std::endl; |
|||
const int other_index = |
|||
CheckedDowncastToActualType<const Iterator>(&other)->index_; |
|||
return index_ == other_index; |
|||
} |
|||
|
|||
private: |
|||
Iterator(const Iterator& other) |
|||
: ParamIteratorInterface<T>(), |
|||
base_(other.base_), value_(other.value_), index_(other.index_), |
|||
step_(other.step_) {} |
|||
|
|||
// No implementation - assignment is unsupported.
|
|||
void operator=(const Iterator& other); |
|||
|
|||
const ParamGeneratorInterface<T>* const base_; |
|||
T value_; |
|||
int index_; |
|||
const IncrementT step_; |
|||
}; // class RangeGenerator::Iterator
|
|||
|
|||
static int CalculateEndIndex(const T& begin, |
|||
const T& end, |
|||
const IncrementT& step) { |
|||
int end_index = 0; |
|||
for (T i = begin; i < end; i = static_cast<T>(i + step)) |
|||
end_index++; |
|||
return end_index; |
|||
} |
|||
|
|||
// No implementation - assignment is unsupported.
|
|||
void operator=(const RangeGenerator& other); |
|||
|
|||
const T begin_; |
|||
const T end_; |
|||
const IncrementT step_; |
|||
// The index for the end() iterator. All the elements in the generated
|
|||
// sequence are indexed (0-based) to aid iterator comparison.
|
|||
const int end_index_; |
|||
}; // class RangeGenerator
|
|||
|
|||
|
|||
// Generates values from a pair of STL-style iterators. Used in the
|
|||
// ValuesIn() function. The elements are copied from the source range
|
|||
// since the source can be located on the stack, and the generator
|
|||
// is likely to persist beyond that stack frame.
|
|||
template <typename T> |
|||
class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> { |
|||
public: |
|||
template <typename ForwardIterator> |
|||
ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end) |
|||
: container_(begin, end) {} |
|||
virtual ~ValuesInIteratorRangeGenerator() {} |
|||
|
|||
virtual ParamIteratorInterface<T>* Begin() const { |
|||
return new Iterator(this, container_.begin()); |
|||
} |
|||
virtual ParamIteratorInterface<T>* End() const { |
|||
return new Iterator(this, container_.end()); |
|||
} |
|||
|
|||
private: |
|||
typedef typename ::std::vector<T> ContainerType; |
|||
|
|||
class Iterator : public ParamIteratorInterface<T> { |
|||
public: |
|||
Iterator(const ParamGeneratorInterface<T>* base, |
|||
typename ContainerType::const_iterator iterator) |
|||
: base_(base), iterator_(iterator) {} |
|||
virtual ~Iterator() {} |
|||
|
|||
virtual const ParamGeneratorInterface<T>* BaseGenerator() const { |
|||
return base_; |
|||
} |
|||
virtual void Advance() { |
|||
++iterator_; |
|||
value_.reset(); |
|||
} |
|||
virtual ParamIteratorInterface<T>* Clone() const { |
|||
return new Iterator(*this); |
|||
} |
|||
// We need to use cached value referenced by iterator_ because *iterator_
|
|||
// can return a temporary object (and of type other then T), so just
|
|||
// having "return &*iterator_;" doesn't work.
|
|||
// value_ is updated here and not in Advance() because Advance()
|
|||
// can advance iterator_ beyond the end of the range, and we cannot
|
|||
// detect that fact. The client code, on the other hand, is
|
|||
// responsible for not calling Current() on an out-of-range iterator.
|
|||
virtual const T* Current() const { |
|||
if (value_.get() == NULL) |
|||
value_.reset(new T(*iterator_)); |
|||
return value_.get(); |
|||
} |
|||
virtual bool Equals(const ParamIteratorInterface<T>& other) const { |
|||
// Having the same base generator guarantees that the other
|
|||
// iterator is of the same type and we can downcast.
|
|||
GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) |
|||
<< "The program attempted to compare iterators " |
|||
<< "from different generators." << std::endl; |
|||
return iterator_ == |
|||
CheckedDowncastToActualType<const Iterator>(&other)->iterator_; |
|||
} |
|||
|
|||
private: |
|||
Iterator(const Iterator& other) |
|||
// The explicit constructor call suppresses a false warning
|
|||
// emitted by gcc when supplied with the -Wextra option.
|
|||
: ParamIteratorInterface<T>(), |
|||
base_(other.base_), |
|||
iterator_(other.iterator_) {} |
|||
|
|||
const ParamGeneratorInterface<T>* const base_; |
|||
typename ContainerType::const_iterator iterator_; |
|||
// A cached value of *iterator_. We keep it here to allow access by
|
|||
// pointer in the wrapping iterator's operator->().
|
|||
// value_ needs to be mutable to be accessed in Current().
|
|||
// Use of scoped_ptr helps manage cached value's lifetime,
|
|||
// which is bound by the lifespan of the iterator itself.
|
|||
mutable scoped_ptr<const T> value_; |
|||
}; // class ValuesInIteratorRangeGenerator::Iterator
|
|||
|
|||
// No implementation - assignment is unsupported.
|
|||
void operator=(const ValuesInIteratorRangeGenerator& other); |
|||
|
|||
const ContainerType container_; |
|||
}; // class ValuesInIteratorRangeGenerator
|
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
|||
//
|
|||
// Default parameterized test name generator, returns a string containing the
|
|||
// integer test parameter index.
|
|||
template <class ParamType> |
|||
std::string DefaultParamName(const TestParamInfo<ParamType>& info) { |
|||
Message name_stream; |
|||
name_stream << info.index; |
|||
return name_stream.GetString(); |
|||
} |
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
|||
//
|
|||
// Parameterized test name overload helpers, which help the
|
|||
// INSTANTIATE_TEST_CASE_P macro choose between the default parameterized
|
|||
// test name generator and user param name generator.
|
|||
template <class ParamType, class ParamNameGenFunctor> |
|||
ParamNameGenFunctor GetParamNameGen(ParamNameGenFunctor func) { |
|||
return func; |
|||
} |
|||
|
|||
template <class ParamType> |
|||
struct ParamNameGenFunc { |
|||
typedef std::string Type(const TestParamInfo<ParamType>&); |
|||
}; |
|||
|
|||
template <class ParamType> |
|||
typename ParamNameGenFunc<ParamType>::Type *GetParamNameGen() { |
|||
return DefaultParamName; |
|||
} |
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
|||
//
|
|||
// Stores a parameter value and later creates tests parameterized with that
|
|||
// value.
|
|||
template <class TestClass> |
|||
class ParameterizedTestFactory : public TestFactoryBase { |
|||
public: |
|||
typedef typename TestClass::ParamType ParamType; |
|||
explicit ParameterizedTestFactory(ParamType parameter) : |
|||
parameter_(parameter) {} |
|||
virtual Test* CreateTest() { |
|||
TestClass::SetParam(¶meter_); |
|||
return new TestClass(); |
|||
} |
|||
|
|||
private: |
|||
const ParamType parameter_; |
|||
|
|||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory); |
|||
}; |
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
|||
//
|
|||
// TestMetaFactoryBase is a base class for meta-factories that create
|
|||
// test factories for passing into MakeAndRegisterTestInfo function.
|
|||
template <class ParamType> |
|||
class TestMetaFactoryBase { |
|||
public: |
|||
virtual ~TestMetaFactoryBase() {} |
|||
|
|||
virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0; |
|||
}; |
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
|||
//
|
|||
// TestMetaFactory creates test factories for passing into
|
|||
// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
|
|||
// ownership of test factory pointer, same factory object cannot be passed
|
|||
// into that method twice. But ParameterizedTestCaseInfo is going to call
|
|||
// it for each Test/Parameter value combination. Thus it needs meta factory
|
|||
// creator class.
|
|||
template <class TestCase> |
|||
class TestMetaFactory |
|||
: public TestMetaFactoryBase<typename TestCase::ParamType> { |
|||
public: |
|||
typedef typename TestCase::ParamType ParamType; |
|||
|
|||
TestMetaFactory() {} |
|||
|
|||
virtual TestFactoryBase* CreateTestFactory(ParamType parameter) { |
|||
return new ParameterizedTestFactory<TestCase>(parameter); |
|||
} |
|||
|
|||
private: |
|||
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory); |
|||
}; |
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
|||
//
|
|||
// ParameterizedTestCaseInfoBase is a generic interface
|
|||
// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
|
|||
// accumulates test information provided by TEST_P macro invocations
|
|||
// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
|
|||
// and uses that information to register all resulting test instances
|
|||
// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
|
|||
// a collection of pointers to the ParameterizedTestCaseInfo objects
|
|||
// and calls RegisterTests() on each of them when asked.
|
|||
class ParameterizedTestCaseInfoBase { |
|||
public: |
|||
virtual ~ParameterizedTestCaseInfoBase() {} |
|||
|
|||
// Base part of test case name for display purposes.
|
|||
virtual const std::string& GetTestCaseName() const = 0; |
|||
// Test case id to verify identity.
|
|||
virtual TypeId GetTestCaseTypeId() const = 0; |
|||
// UnitTest class invokes this method to register tests in this
|
|||
// test case right before running them in RUN_ALL_TESTS macro.
|
|||
// This method should not be called more then once on any single
|
|||
// instance of a ParameterizedTestCaseInfoBase derived class.
|
|||
virtual void RegisterTests() = 0; |
|||
|
|||
protected: |
|||
ParameterizedTestCaseInfoBase() {} |
|||
|
|||
private: |
|||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase); |
|||
}; |
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
|||
//
|
|||
// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
|
|||
// macro invocations for a particular test case and generators
|
|||
// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
|
|||
// test case. It registers tests with all values generated by all
|
|||
// generators when asked.
|
|||
template <class TestCase> |
|||
class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase { |
|||
public: |
|||
// ParamType and GeneratorCreationFunc are private types but are required
|
|||
// for declarations of public methods AddTestPattern() and
|
|||
// AddTestCaseInstantiation().
|
|||
typedef typename TestCase::ParamType ParamType; |
|||
// A function that returns an instance of appropriate generator type.
|
|||
typedef ParamGenerator<ParamType>(GeneratorCreationFunc)(); |
|||
typedef typename ParamNameGenFunc<ParamType>::Type ParamNameGeneratorFunc; |
|||
|
|||
explicit ParameterizedTestCaseInfo( |
|||
const char* name, CodeLocation code_location) |
|||
: test_case_name_(name), code_location_(code_location) {} |
|||
|
|||
// Test case base name for display purposes.
|
|||
virtual const std::string& GetTestCaseName() const { return test_case_name_; } |
|||
// Test case id to verify identity.
|
|||
virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); } |
|||
// TEST_P macro uses AddTestPattern() to record information
|
|||
// about a single test in a LocalTestInfo structure.
|
|||
// test_case_name is the base name of the test case (without invocation
|
|||
// prefix). test_base_name is the name of an individual test without
|
|||
// parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
|
|||
// test case base name and DoBar is test base name.
|
|||
void AddTestPattern(const char* test_case_name, |
|||
const char* test_base_name, |
|||
TestMetaFactoryBase<ParamType>* meta_factory) { |
|||
tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name, |
|||
test_base_name, |
|||
meta_factory))); |
|||
} |
|||
// INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
|
|||
// about a generator.
|
|||
int AddTestCaseInstantiation(const std::string& instantiation_name, |
|||
GeneratorCreationFunc* func, |
|||
ParamNameGeneratorFunc* name_func, |
|||
const char* file, int line) { |
|||
instantiations_.push_back( |
|||
InstantiationInfo(instantiation_name, func, name_func, file, line)); |
|||
return 0; // Return value used only to run this method in namespace scope.
|
|||
} |
|||
// UnitTest class invokes this method to register tests in this test case
|
|||
// test cases right before running tests in RUN_ALL_TESTS macro.
|
|||
// This method should not be called more then once on any single
|
|||
// instance of a ParameterizedTestCaseInfoBase derived class.
|
|||
// UnitTest has a guard to prevent from calling this method more then once.
|
|||
virtual void RegisterTests() { |
|||
for (typename TestInfoContainer::iterator test_it = tests_.begin(); |
|||
test_it != tests_.end(); ++test_it) { |
|||
linked_ptr<TestInfo> test_info = *test_it; |
|||
for (typename InstantiationContainer::iterator gen_it = |
|||
instantiations_.begin(); gen_it != instantiations_.end(); |
|||
++gen_it) { |
|||
const std::string& instantiation_name = gen_it->name; |
|||
ParamGenerator<ParamType> generator((*gen_it->generator)()); |
|||
ParamNameGeneratorFunc* name_func = gen_it->name_func; |
|||
const char* file = gen_it->file; |
|||
int line = gen_it->line; |
|||
|
|||
std::string test_case_name; |
|||
if ( !instantiation_name.empty() ) |
|||
test_case_name = instantiation_name + "/"; |
|||
test_case_name += test_info->test_case_base_name; |
|||
|
|||
size_t i = 0; |
|||
std::set<std::string> test_param_names; |
|||
for (typename ParamGenerator<ParamType>::iterator param_it = |
|||
generator.begin(); |
|||
param_it != generator.end(); ++param_it, ++i) { |
|||
Message test_name_stream; |
|||
|
|||
std::string param_name = name_func( |
|||
TestParamInfo<ParamType>(*param_it, i)); |
|||
|
|||
GTEST_CHECK_(IsValidParamName(param_name)) |
|||
<< "Parameterized test name '" << param_name |
|||
<< "' is invalid, in " << file |
|||
<< " line " << line << std::endl; |
|||
|
|||
GTEST_CHECK_(test_param_names.count(param_name) == 0) |
|||
<< "Duplicate parameterized test name '" << param_name |
|||
<< "', in " << file << " line " << line << std::endl; |
|||
|
|||
test_param_names.insert(param_name); |
|||
|
|||
test_name_stream << test_info->test_base_name << "/" << param_name; |
|||
MakeAndRegisterTestInfo( |
|||
test_case_name.c_str(), |
|||
test_name_stream.GetString().c_str(), |
|||
NULL, // No type parameter.
|
|||
PrintToString(*param_it).c_str(), |
|||
code_location_, |
|||
GetTestCaseTypeId(), |
|||
TestCase::SetUpTestCase, |
|||
TestCase::TearDownTestCase, |
|||
test_info->test_meta_factory->CreateTestFactory(*param_it)); |
|||
} // for param_it
|
|||
} // for gen_it
|
|||
} // for test_it
|
|||
} // RegisterTests
|
|||
|
|||
private: |
|||
// LocalTestInfo structure keeps information about a single test registered
|
|||
// with TEST_P macro.
|
|||
struct TestInfo { |
|||
TestInfo(const char* a_test_case_base_name, |
|||
const char* a_test_base_name, |
|||
TestMetaFactoryBase<ParamType>* a_test_meta_factory) : |
|||
test_case_base_name(a_test_case_base_name), |
|||
test_base_name(a_test_base_name), |
|||
test_meta_factory(a_test_meta_factory) {} |
|||
|
|||
const std::string test_case_base_name; |
|||
const std::string test_base_name; |
|||
const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory; |
|||
}; |
|||
typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer; |
|||
// Records data received from INSTANTIATE_TEST_CASE_P macros:
|
|||
// <Instantiation name, Sequence generator creation function,
|
|||
// Name generator function, Source file, Source line>
|
|||
struct InstantiationInfo { |
|||
InstantiationInfo(const std::string &name_in, |
|||
GeneratorCreationFunc* generator_in, |
|||
ParamNameGeneratorFunc* name_func_in, |
|||
const char* file_in, |
|||
int line_in) |
|||
: name(name_in), |
|||
generator(generator_in), |
|||
name_func(name_func_in), |
|||
file(file_in), |
|||
line(line_in) {} |
|||
|
|||
std::string name; |
|||
GeneratorCreationFunc* generator; |
|||
ParamNameGeneratorFunc* name_func; |
|||
const char* file; |
|||
int line; |
|||
}; |
|||
typedef ::std::vector<InstantiationInfo> InstantiationContainer; |
|||
|
|||
static bool IsValidParamName(const std::string& name) { |
|||
// Check for empty string
|
|||
if (name.empty()) |
|||
return false; |
|||
|
|||
// Check for invalid characters
|
|||
for (std::string::size_type index = 0; index < name.size(); ++index) { |
|||
if (!isalnum(name[index]) && name[index] != '_') |
|||
return false; |
|||
} |
|||
|
|||
return true; |
|||
} |
|||
|
|||
const std::string test_case_name_; |
|||
CodeLocation code_location_; |
|||
TestInfoContainer tests_; |
|||
InstantiationContainer instantiations_; |
|||
|
|||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo); |
|||
}; // class ParameterizedTestCaseInfo
|
|||
|
|||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
|||
//
|
|||
// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
|
|||
// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
|
|||
// macros use it to locate their corresponding ParameterizedTestCaseInfo
|
|||
// descriptors.
|
|||
class ParameterizedTestCaseRegistry { |
|||
public: |
|||
ParameterizedTestCaseRegistry() {} |
|||
~ParameterizedTestCaseRegistry() { |
|||
for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); |
|||
it != test_case_infos_.end(); ++it) { |
|||
delete *it; |
|||
} |
|||
} |
|||
|
|||
// Looks up or creates and returns a structure containing information about
|
|||
// tests and instantiations of a particular test case.
|
|||
template <class TestCase> |
|||
ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder( |
|||
const char* test_case_name, |
|||
CodeLocation code_location) { |
|||
ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL; |
|||
for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); |
|||
it != test_case_infos_.end(); ++it) { |
|||
if ((*it)->GetTestCaseName() == test_case_name) { |
|||
if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) { |
|||
// Complain about incorrect usage of Google Test facilities
|
|||
// and terminate the program since we cannot guaranty correct
|
|||
// test case setup and tear-down in this case.
|
|||
ReportInvalidTestCaseType(test_case_name, code_location); |
|||
posix::Abort(); |
|||
} else { |
|||
// At this point we are sure that the object we found is of the same
|
|||
// type we are looking for, so we downcast it to that type
|
|||
// without further checks.
|
|||
typed_test_info = CheckedDowncastToActualType< |
|||
ParameterizedTestCaseInfo<TestCase> >(*it); |
|||
} |
|||
break; |
|||
} |
|||
} |
|||
if (typed_test_info == NULL) { |
|||
typed_test_info = new ParameterizedTestCaseInfo<TestCase>( |
|||
test_case_name, code_location); |
|||
test_case_infos_.push_back(typed_test_info); |
|||
} |
|||
return typed_test_info; |
|||
} |
|||
void RegisterTests() { |
|||
for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); |
|||
it != test_case_infos_.end(); ++it) { |
|||
(*it)->RegisterTests(); |
|||
} |
|||
} |
|||
|
|||
private: |
|||
typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer; |
|||
|
|||
TestCaseInfoContainer test_case_infos_; |
|||
|
|||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry); |
|||
}; |
|||
|
|||
} // namespace internal
|
|||
} // namespace testing
|
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
|
@ -0,0 +1,100 @@ |
|||
// Copyright 2015, Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
//
|
|||
// The Google C++ Testing and Mocking Framework (Google Test)
|
|||
//
|
|||
// This header file defines the GTEST_OS_* macro.
|
|||
// It is separate from gtest-port.h so that custom/gtest-port.h can include it.
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ |
|||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ |
|||
|
|||
// Determines the platform on which Google Test is compiled.
|
|||
#ifdef __CYGWIN__ |
|||
# define GTEST_OS_CYGWIN 1 |
|||
#elif defined __SYMBIAN32__ |
|||
# define GTEST_OS_SYMBIAN 1 |
|||
#elif defined _WIN32 |
|||
# define GTEST_OS_WINDOWS 1 |
|||
# ifdef _WIN32_WCE |
|||
# define GTEST_OS_WINDOWS_MOBILE 1 |
|||
# elif defined(__MINGW__) || defined(__MINGW32__) |
|||
# define GTEST_OS_WINDOWS_MINGW 1 |
|||
# elif defined(WINAPI_FAMILY) |
|||
# include <winapifamily.h> |
|||
# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) |
|||
# define GTEST_OS_WINDOWS_DESKTOP 1 |
|||
# elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP) |
|||
# define GTEST_OS_WINDOWS_PHONE 1 |
|||
# elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) |
|||
# define GTEST_OS_WINDOWS_RT 1 |
|||
# elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_TV_TITLE) |
|||
# define GTEST_OS_WINDOWS_PHONE 1 |
|||
# define GTEST_OS_WINDOWS_TV_TITLE 1 |
|||
# else |
|||
// WINAPI_FAMILY defined but no known partition matched.
|
|||
// Default to desktop.
|
|||
# define GTEST_OS_WINDOWS_DESKTOP 1 |
|||
# endif |
|||
# else |
|||
# define GTEST_OS_WINDOWS_DESKTOP 1 |
|||
# endif // _WIN32_WCE
|
|||
#elif defined __APPLE__ |
|||
# define GTEST_OS_MAC 1 |
|||
# if TARGET_OS_IPHONE |
|||
# define GTEST_OS_IOS 1 |
|||
# endif |
|||
#elif defined __FreeBSD__ |
|||
# define GTEST_OS_FREEBSD 1 |
|||
#elif defined __Fuchsia__ |
|||
# define GTEST_OS_FUCHSIA 1 |
|||
#elif defined __linux__ |
|||
# define GTEST_OS_LINUX 1 |
|||
# if defined __ANDROID__ |
|||
# define GTEST_OS_LINUX_ANDROID 1 |
|||
# endif |
|||
#elif defined __MVS__ |
|||
# define GTEST_OS_ZOS 1 |
|||
#elif defined(__sun) && defined(__SVR4) |
|||
# define GTEST_OS_SOLARIS 1 |
|||
#elif defined(_AIX) |
|||
# define GTEST_OS_AIX 1 |
|||
#elif defined(__hpux) |
|||
# define GTEST_OS_HPUX 1 |
|||
#elif defined __native_client__ |
|||
# define GTEST_OS_NACL 1 |
|||
#elif defined __NetBSD__ |
|||
# define GTEST_OS_NETBSD 1 |
|||
#elif defined __OpenBSD__ |
|||
# define GTEST_OS_OPENBSD 1 |
|||
#elif defined __QNX__ |
|||
# define GTEST_OS_QNX 1 |
|||
#endif // __CYGWIN__
|
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
|
File diff suppressed because it is too large
@ -0,0 +1,167 @@ |
|||
// Copyright 2005, Google Inc.
|
|||
// All rights reserved.
|
|||
//
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following disclaimer
|
|||
// in the documentation and/or other materials provided with the
|
|||
// distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived from
|
|||
// this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
//
|
|||
// The Google C++ Testing and Mocking Framework (Google Test)
|
|||
//
|
|||
// This header file declares the String class and functions used internally by
|
|||
// Google Test. They are subject to change without notice. They should not used
|
|||
// by code external to Google Test.
|
|||
//
|
|||
// This header file is #included by gtest-internal.h.
|
|||
// It should not be #included by other files.
|
|||
|
|||
// GOOGLETEST_CM0001 DO NOT DELETE
|
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ |
|||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ |
|||
|
|||
#ifdef __BORLANDC__ |
|||
// string.h is not guaranteed to provide strcpy on C++ Builder.
|
|||
# include <mem.h> |
|||
#endif |
|||
|
|||
#include <string.h> |
|||
#include <string> |
|||
|
|||
#include "gtest/internal/gtest-port.h" |
|||
|
|||
namespace testing { |
|||
namespace internal { |
|||
|
|||
// String - an abstract class holding static string utilities.
|
|||
class GTEST_API_ String { |
|||
public: |
|||
// Static utility methods
|
|||
|
|||
// Clones a 0-terminated C string, allocating memory using new. The
|
|||
// caller is responsible for deleting the return value using
|
|||
// delete[]. Returns the cloned string, or NULL if the input is
|
|||
// NULL.
|
|||
//
|
|||
// This is different from strdup() in string.h, which allocates
|
|||
// memory using malloc().
|
|||
static const char* CloneCString(const char* c_str); |
|||
|
|||
#if GTEST_OS_WINDOWS_MOBILE |
|||
// Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
|
|||
// able to pass strings to Win32 APIs on CE we need to convert them
|
|||
// to 'Unicode', UTF-16.
|
|||
|
|||
// Creates a UTF-16 wide string from the given ANSI string, allocating
|
|||
// memory using new. The caller is responsible for deleting the return
|
|||
// value using delete[]. Returns the wide string, or NULL if the
|
|||
// input is NULL.
|
|||
//
|
|||
// The wide string is created using the ANSI codepage (CP_ACP) to
|
|||
// match the behaviour of the ANSI versions of Win32 calls and the
|
|||
// C runtime.
|
|||
static LPCWSTR AnsiToUtf16(const char* c_str); |
|||
|
|||
// Creates an ANSI string from the given wide string, allocating
|
|||
// memory using new. The caller is responsible for deleting the return
|
|||
// value using delete[]. Returns the ANSI string, or NULL if the
|
|||
// input is NULL.
|
|||
//
|
|||
// The returned string is created using the ANSI codepage (CP_ACP) to
|
|||
// match the behaviour of the ANSI versions of Win32 calls and the
|
|||
// C runtime.
|
|||
static const char* Utf16ToAnsi(LPCWSTR utf16_str); |
|||
#endif |
|||
|
|||
// Compares two C strings. Returns true iff they have the same content.
|
|||
//
|
|||
// Unlike strcmp(), this function can handle NULL argument(s). A
|
|||
// NULL C string is considered different to any non-NULL C string,
|
|||
// including the empty string.
|
|||
static bool CStringEquals(const char* lhs, const char* rhs); |
|||
|
|||
// Converts a wide C string to a String using the UTF-8 encoding.
|
|||
// NULL will be converted to "(null)". If an error occurred during
|
|||
// the conversion, "(failed to convert from wide string)" is
|
|||
// returned.
|
|||
static std::string ShowWideCString(const wchar_t* wide_c_str); |
|||
|
|||
// Compares two wide C strings. Returns true iff they have the same
|
|||
// content.
|
|||
//
|
|||
// Unlike wcscmp(), this function can handle NULL argument(s). A
|
|||
// NULL C string is considered different to any non-NULL C string,
|
|||
// including the empty string.
|
|||
static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); |
|||
|
|||
// Compares two C strings, ignoring case. Returns true iff they
|
|||
// have the same content.
|
|||
//
|
|||
// Unlike strcasecmp(), this function can handle NULL argument(s).
|
|||
// A NULL C string is considered different to any non-NULL C string,
|
|||
// including the empty string.
|
|||
static bool CaseInsensitiveCStringEquals(const char* lhs, |
|||
const char* rhs); |
|||
|
|||
// Compares two wide C strings, ignoring case. Returns true iff they
|
|||
// have the same content.
|
|||
//
|
|||
// Unlike wcscasecmp(), this function can handle NULL argument(s).
|
|||
// A NULL C string is considered different to any non-NULL wide C string,
|
|||
// including the empty string.
|
|||
// NB: The implementations on different platforms slightly differ.
|
|||
// On windows, this method uses _wcsicmp which compares according to LC_CTYPE
|
|||
// environment variable. On GNU platform this method uses wcscasecmp
|
|||
// which compares according to LC_CTYPE category of the current locale.
|
|||
// On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
|
|||
// current locale.
|
|||
static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs, |
|||
const wchar_t* rhs); |
|||
|
|||
// Returns true iff the given string ends with the given suffix, ignoring
|
|||
// case. Any string is considered to end with an empty suffix.
|
|||
static bool EndsWithCaseInsensitive( |
|||
const std::string& str, const std::string& suffix); |
|||
|
|||
// Formats an int value as "%02d".
|
|||
static std::string FormatIntWidth2(int value); // "%02d" for width == 2
|
|||
|
|||
// Formats an int value as "%X".
|
|||
static std::string FormatHexInt(int value); |
|||
|
|||
// Formats a byte as "%02X".
|
|||
static std::string FormatByte(unsigned char value); |
|||
|
|||
private: |
|||
String(); // Not meant to be instantiated.
|
|||
}; // class String
|
|||
|
|||
// Gets the content of the stringstream's buffer as an std::string. Each '\0'
|
|||
// character in the buffer is replaced with "\\0".
|
|||
GTEST_API_ std::string StringStreamToString(::std::stringstream* stream); |
|||
|
|||
} // namespace internal
|
|||
} // namespace testing
|
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
|
File diff suppressed because it is too large
@ -0,0 +1,348 @@ |
|||
$$ -*- mode: c++; -*- |
|||
$var n = 10 $$ Maximum number of tuple fields we want to support. |
|||
$$ This meta comment fixes auto-indentation in Emacs. }} |
|||
// Copyright 2009 Google Inc. |
|||
// All Rights Reserved. |
|||
// |
|||
// Redistribution and use in source and binary forms, with or without |
|||
// modification, are permitted provided that the following conditions are |
|||
// met: |
|||
// |
|||
// * Redistributions of source code must retain the above copyright |
|||
// notice, this list of conditions and the following disclaimer. |
|||
// * Redistributions in binary form must reproduce the above |
|||
// copyright notice, this list of conditions and the following disclaimer |
|||
// in the documentation and/or other materials provided with the |
|||
// distribution. |
|||
// * Neither the name of Google Inc. nor the names of its |
|||
// contributors may be used to endorse or promote products derived from |
|||
// this software without specific prior written permission. |
|||
// |
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
|
|||
|
|||
// Implements a subset of TR1 tuple needed by Google Test and Google Mock. |
|||
|
|||
// GOOGLETEST_CM0001 DO NOT DELETE |
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ |
|||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ |
|||
|
|||
#include <utility> // For ::std::pair. |
|||
|
|||
// The compiler used in Symbian has a bug that prevents us from declaring the |
|||
// tuple template as a friend (it complains that tuple is redefined). This |
|||
// bypasses the bug by declaring the members that should otherwise be |
|||
// private as public. |
|||
// Sun Studio versions < 12 also have the above bug. |
|||
#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590) |
|||
# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public: |
|||
#else |
|||
# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \ |
|||
template <GTEST_$(n)_TYPENAMES_(U)> friend class tuple; \ |
|||
private: |
|||
#endif |
|||
|
|||
// Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that conflict |
|||
// with our own definitions. Therefore using our own tuple does not work on |
|||
// those compilers. |
|||
#if defined(_MSC_VER) && _MSC_VER >= 1600 /* 1600 is Visual Studio 2010 */ |
|||
# error "gtest's tuple doesn't compile on Visual Studio 2010 or later. \ |
|||
GTEST_USE_OWN_TR1_TUPLE must be set to 0 on those compilers." |
|||
#endif |
|||
|
|||
|
|||
$range i 0..n-1 |
|||
$range j 0..n |
|||
$range k 1..n |
|||
// GTEST_n_TUPLE_(T) is the type of an n-tuple. |
|||
#define GTEST_0_TUPLE_(T) tuple<> |
|||
|
|||
$for k [[ |
|||
$range m 0..k-1 |
|||
$range m2 k..n-1 |
|||
#define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]> |
|||
|
|||
]] |
|||
|
|||
// GTEST_n_TYPENAMES_(T) declares a list of n typenames. |
|||
|
|||
$for j [[ |
|||
$range m 0..j-1 |
|||
#define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]] |
|||
|
|||
|
|||
]] |
|||
|
|||
// In theory, defining stuff in the ::std namespace is undefined |
|||
// behavior. We can do this as we are playing the role of a standard |
|||
// library vendor. |
|||
namespace std { |
|||
namespace tr1 { |
|||
|
|||
template <$for i, [[typename T$i = void]]> |
|||
class tuple; |
|||
|
|||
// Anything in namespace gtest_internal is Google Test's INTERNAL |
|||
// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code. |
|||
namespace gtest_internal { |
|||
|
|||
// ByRef<T>::type is T if T is a reference; otherwise it's const T&. |
|||
template <typename T> |
|||
struct ByRef { typedef const T& type; }; // NOLINT |
|||
template <typename T> |
|||
struct ByRef<T&> { typedef T& type; }; // NOLINT |
|||
|
|||
// A handy wrapper for ByRef. |
|||
#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type |
|||
|
|||
// AddRef<T>::type is T if T is a reference; otherwise it's T&. This |
|||
// is the same as tr1::add_reference<T>::type. |
|||
template <typename T> |
|||
struct AddRef { typedef T& type; }; // NOLINT |
|||
template <typename T> |
|||
struct AddRef<T&> { typedef T& type; }; // NOLINT |
|||
|
|||
// A handy wrapper for AddRef. |
|||
#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type |
|||
|
|||
// A helper for implementing get<k>(). |
|||
template <int k> class Get; |
|||
|
|||
// A helper for implementing tuple_element<k, T>. kIndexValid is true |
|||
// iff k < the number of fields in tuple type T. |
|||
template <bool kIndexValid, int kIndex, class Tuple> |
|||
struct TupleElement; |
|||
|
|||
|
|||
$for i [[ |
|||
template <GTEST_$(n)_TYPENAMES_(T)> |
|||
struct TupleElement<true, $i, GTEST_$(n)_TUPLE_(T) > { |
|||
typedef T$i type; |
|||
}; |
|||
|
|||
|
|||
]] |
|||
} // namespace gtest_internal |
|||
|
|||
template <> |
|||
class tuple<> { |
|||
public: |
|||
tuple() {} |
|||
tuple(const tuple& /* t */) {} |
|||
tuple& operator=(const tuple& /* t */) { return *this; } |
|||
}; |
|||
|
|||
|
|||
$for k [[ |
|||
$range m 0..k-1 |
|||
template <GTEST_$(k)_TYPENAMES_(T)> |
|||
class $if k < n [[GTEST_$(k)_TUPLE_(T)]] $else [[tuple]] { |
|||
public: |
|||
template <int k> friend class gtest_internal::Get; |
|||
|
|||
tuple() : $for m, [[f$(m)_()]] {} |
|||
|
|||
explicit tuple($for m, [[GTEST_BY_REF_(T$m) f$m]]) : [[]] |
|||
$for m, [[f$(m)_(f$m)]] {} |
|||
|
|||
tuple(const tuple& t) : $for m, [[f$(m)_(t.f$(m)_)]] {} |
|||
|
|||
template <GTEST_$(k)_TYPENAMES_(U)> |
|||
tuple(const GTEST_$(k)_TUPLE_(U)& t) : $for m, [[f$(m)_(t.f$(m)_)]] {} |
|||
|
|||
$if k == 2 [[ |
|||
template <typename U0, typename U1> |
|||
tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {} |
|||
|
|||
]] |
|||
|
|||
tuple& operator=(const tuple& t) { return CopyFrom(t); } |
|||
|
|||
template <GTEST_$(k)_TYPENAMES_(U)> |
|||
tuple& operator=(const GTEST_$(k)_TUPLE_(U)& t) { |
|||
return CopyFrom(t); |
|||
} |
|||
|
|||
$if k == 2 [[ |
|||
template <typename U0, typename U1> |
|||
tuple& operator=(const ::std::pair<U0, U1>& p) { |
|||
f0_ = p.first; |
|||
f1_ = p.second; |
|||
return *this; |
|||
} |
|||
|
|||
]] |
|||
|
|||
GTEST_DECLARE_TUPLE_AS_FRIEND_ |
|||
|
|||
template <GTEST_$(k)_TYPENAMES_(U)> |
|||
tuple& CopyFrom(const GTEST_$(k)_TUPLE_(U)& t) { |
|||
|
|||
$for m [[ |
|||
f$(m)_ = t.f$(m)_; |
|||
|
|||
]] |
|||
return *this; |
|||
} |
|||
|
|||
|
|||
$for m [[ |
|||
T$m f$(m)_; |
|||
|
|||
]] |
|||
}; |
|||
|
|||
|
|||
]] |
|||
// 6.1.3.2 Tuple creation functions. |
|||
|
|||
// Known limitations: we don't support passing an |
|||
// std::tr1::reference_wrapper<T> to make_tuple(). And we don't |
|||
// implement tie(). |
|||
|
|||
inline tuple<> make_tuple() { return tuple<>(); } |
|||
|
|||
$for k [[ |
|||
$range m 0..k-1 |
|||
|
|||
template <GTEST_$(k)_TYPENAMES_(T)> |
|||
inline GTEST_$(k)_TUPLE_(T) make_tuple($for m, [[const T$m& f$m]]) { |
|||
return GTEST_$(k)_TUPLE_(T)($for m, [[f$m]]); |
|||
} |
|||
|
|||
]] |
|||
|
|||
// 6.1.3.3 Tuple helper classes. |
|||
|
|||
template <typename Tuple> struct tuple_size; |
|||
|
|||
|
|||
$for j [[ |
|||
template <GTEST_$(j)_TYPENAMES_(T)> |
|||
struct tuple_size<GTEST_$(j)_TUPLE_(T) > { |
|||
static const int value = $j; |
|||
}; |
|||
|
|||
|
|||
]] |
|||
template <int k, class Tuple> |
|||
struct tuple_element { |
|||
typedef typename gtest_internal::TupleElement< |
|||
k < (tuple_size<Tuple>::value), k, Tuple>::type type; |
|||
}; |
|||
|
|||
#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type |
|||
|
|||
// 6.1.3.4 Element access. |
|||
|
|||
namespace gtest_internal { |
|||
|
|||
|
|||
$for i [[ |
|||
template <> |
|||
class Get<$i> { |
|||
public: |
|||
template <class Tuple> |
|||
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple)) |
|||
Field(Tuple& t) { return t.f$(i)_; } // NOLINT |
|||
|
|||
template <class Tuple> |
|||
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple)) |
|||
ConstField(const Tuple& t) { return t.f$(i)_; } |
|||
}; |
|||
|
|||
|
|||
]] |
|||
} // namespace gtest_internal |
|||
|
|||
template <int k, GTEST_$(n)_TYPENAMES_(T)> |
|||
GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T))) |
|||
get(GTEST_$(n)_TUPLE_(T)& t) { |
|||
return gtest_internal::Get<k>::Field(t); |
|||
} |
|||
|
|||
template <int k, GTEST_$(n)_TYPENAMES_(T)> |
|||
GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T))) |
|||
get(const GTEST_$(n)_TUPLE_(T)& t) { |
|||
return gtest_internal::Get<k>::ConstField(t); |
|||
} |
|||
|
|||
// 6.1.3.5 Relational operators |
|||
|
|||
// We only implement == and !=, as we don't have a need for the rest yet. |
|||
|
|||
namespace gtest_internal { |
|||
|
|||
// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the |
|||
// first k fields of t1 equals the first k fields of t2. |
|||
// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if |
|||
// k1 != k2. |
|||
template <int kSize1, int kSize2> |
|||
struct SameSizeTuplePrefixComparator; |
|||
|
|||
template <> |
|||
struct SameSizeTuplePrefixComparator<0, 0> { |
|||
template <class Tuple1, class Tuple2> |
|||
static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) { |
|||
return true; |
|||
} |
|||
}; |
|||
|
|||
template <int k> |
|||
struct SameSizeTuplePrefixComparator<k, k> { |
|||
template <class Tuple1, class Tuple2> |
|||
static bool Eq(const Tuple1& t1, const Tuple2& t2) { |
|||
return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) && |
|||
::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2); |
|||
} |
|||
}; |
|||
|
|||
} // namespace gtest_internal |
|||
|
|||
template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)> |
|||
inline bool operator==(const GTEST_$(n)_TUPLE_(T)& t, |
|||
const GTEST_$(n)_TUPLE_(U)& u) { |
|||
return gtest_internal::SameSizeTuplePrefixComparator< |
|||
tuple_size<GTEST_$(n)_TUPLE_(T) >::value, |
|||
tuple_size<GTEST_$(n)_TUPLE_(U) >::value>::Eq(t, u); |
|||
} |
|||
|
|||
template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)> |
|||
inline bool operator!=(const GTEST_$(n)_TUPLE_(T)& t, |
|||
const GTEST_$(n)_TUPLE_(U)& u) { return !(t == u); } |
|||
|
|||
// 6.1.4 Pairs. |
|||
// Unimplemented. |
|||
|
|||
} // namespace tr1 |
|||
} // namespace std |
|||
|
|||
|
|||
$for j [[ |
|||
#undef GTEST_$(j)_TUPLE_ |
|||
|
|||
]] |
|||
|
|||
|
|||
$for j [[ |
|||
#undef GTEST_$(j)_TYPENAMES_ |
|||
|
|||
]] |
|||
|
|||
#undef GTEST_DECLARE_TUPLE_AS_FRIEND_ |
|||
#undef GTEST_BY_REF_ |
|||
#undef GTEST_ADD_REF_ |
|||
#undef GTEST_TUPLE_ELEMENT_ |
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ |
File diff suppressed because it is too large
@ -0,0 +1,314 @@ |
|||
$$ -*- mode: c++; -*- |
|||
$var n = 50 $$ Maximum length of type lists we want to support. |
|||
// Copyright 2008 Google Inc. |
|||
// All Rights Reserved. |
|||
// |
|||
// Redistribution and use in source and binary forms, with or without |
|||
// modification, are permitted provided that the following conditions are |
|||
// met: |
|||
// |
|||
// * Redistributions of source code must retain the above copyright |
|||
// notice, this list of conditions and the following disclaimer. |
|||
// * Redistributions in binary form must reproduce the above |
|||
// copyright notice, this list of conditions and the following disclaimer |
|||
// in the documentation and/or other materials provided with the |
|||
// distribution. |
|||
// * Neither the name of Google Inc. nor the names of its |
|||
// contributors may be used to endorse or promote products derived from |
|||
// this software without specific prior written permission. |
|||
// |
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
|
|||
|
|||
// Type utilities needed for implementing typed and type-parameterized |
|||
// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND! |
|||
// |
|||
// Currently we support at most $n types in a list, and at most $n |
|||
// type-parameterized tests in one type-parameterized test case. |
|||
// Please contact googletestframework@googlegroups.com if you need |
|||
// more. |
|||
|
|||
// GOOGLETEST_CM0001 DO NOT DELETE |
|||
|
|||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ |
|||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ |
|||
|
|||
#include "gtest/internal/gtest-port.h" |
|||
|
|||
// #ifdef __GNUC__ is too general here. It is possible to use gcc without using |
|||
// libstdc++ (which is where cxxabi.h comes from). |
|||
# if GTEST_HAS_CXXABI_H_ |
|||
# include <cxxabi.h> |
|||
# elif defined(__HP_aCC) |
|||
# include <acxx_demangle.h> |
|||
# endif // GTEST_HASH_CXXABI_H_ |
|||
|
|||
namespace testing { |
|||
namespace internal { |
|||
|
|||
// Canonicalizes a given name with respect to the Standard C++ Library. |
|||
// This handles removing the inline namespace within `std` that is |
|||
// used by various standard libraries (e.g., `std::__1`). Names outside |
|||
// of namespace std are returned unmodified. |
|||
inline std::string CanonicalizeForStdLibVersioning(std::string s) { |
|||
static const char prefix[] = "std::__"; |
|||
if (s.compare(0, strlen(prefix), prefix) == 0) { |
|||
std::string::size_type end = s.find("::", strlen(prefix)); |
|||
if (end != s.npos) { |
|||
// Erase everything between the initial `std` and the second `::`. |
|||
s.erase(strlen("std"), end - strlen("std")); |
|||
} |
|||
} |
|||
return s; |
|||
} |
|||
|
|||
// GetTypeName<T>() returns a human-readable name of type T. |
|||
// NB: This function is also used in Google Mock, so don't move it inside of |
|||
// the typed-test-only section below. |
|||
template <typename T> |
|||
std::string GetTypeName() { |
|||
# if GTEST_HAS_RTTI |
|||
|
|||
const char* const name = typeid(T).name(); |
|||
# if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC) |
|||
int status = 0; |
|||
// gcc's implementation of typeid(T).name() mangles the type name, |
|||
// so we have to demangle it. |
|||
# if GTEST_HAS_CXXABI_H_ |
|||
using abi::__cxa_demangle; |
|||
# endif // GTEST_HAS_CXXABI_H_ |
|||
char* const readable_name = __cxa_demangle(name, 0, 0, &status); |
|||
const std::string name_str(status == 0 ? readable_name : name); |
|||
free(readable_name); |
|||
return CanonicalizeForStdLibVersioning(name_str); |
|||
# else |
|||
return name; |
|||
# endif // GTEST_HAS_CXXABI_H_ || __HP_aCC |
|||
|
|||
# else |
|||
|
|||
return "<type>"; |
|||
|
|||
# endif // GTEST_HAS_RTTI |
|||
} |
|||
|
|||
#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P |
|||
|
|||
// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same |
|||
// type. This can be used as a compile-time assertion to ensure that |
|||
// two types are equal. |
|||
|
|||
template <typename T1, typename T2> |
|||
struct AssertTypeEq; |
|||
|
|||
template <typename T> |
|||
struct AssertTypeEq<T, T> { |
|||
typedef bool type; |
|||
}; |
|||
|
|||
// A unique type used as the default value for the arguments of class |
|||
// template Types. This allows us to simulate variadic templates |
|||
// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't |
|||
// support directly. |
|||
struct None {}; |
|||
|
|||
// The following family of struct and struct templates are used to |
|||
// represent type lists. In particular, TypesN<T1, T2, ..., TN> |
|||
// represents a type list with N types (T1, T2, ..., and TN) in it. |
|||
// Except for Types0, every struct in the family has two member types: |
|||
// Head for the first type in the list, and Tail for the rest of the |
|||
// list. |
|||
|
|||
// The empty type list. |
|||
struct Types0 {}; |
|||
|
|||
// Type lists of length 1, 2, 3, and so on. |
|||
|
|||
template <typename T1> |
|||
struct Types1 { |
|||
typedef T1 Head; |
|||
typedef Types0 Tail; |
|||
}; |
|||
|
|||
$range i 2..n |
|||
|
|||
$for i [[ |
|||
$range j 1..i |
|||
$range k 2..i |
|||
template <$for j, [[typename T$j]]> |
|||
struct Types$i { |
|||
typedef T1 Head; |
|||
typedef Types$(i-1)<$for k, [[T$k]]> Tail; |
|||
}; |
|||
|
|||
|
|||
]] |
|||
|
|||
} // namespace internal |
|||
|
|||
// We don't want to require the users to write TypesN<...> directly, |
|||
// as that would require them to count the length. Types<...> is much |
|||
// easier to write, but generates horrible messages when there is a |
|||
// compiler error, as gcc insists on printing out each template |
|||
// argument, even if it has the default value (this means Types<int> |
|||
// will appear as Types<int, None, None, ..., None> in the compiler |
|||
// errors). |
|||
// |
|||
// Our solution is to combine the best part of the two approaches: a |
|||
// user would write Types<T1, ..., TN>, and Google Test will translate |
|||
// that to TypesN<T1, ..., TN> internally to make error messages |
|||
// readable. The translation is done by the 'type' member of the |
|||
// Types template. |
|||
|
|||
$range i 1..n |
|||
template <$for i, [[typename T$i = internal::None]]> |
|||
struct Types { |
|||
typedef internal::Types$n<$for i, [[T$i]]> type; |
|||
}; |
|||
|
|||
template <> |
|||
struct Types<$for i, [[internal::None]]> { |
|||
typedef internal::Types0 type; |
|||
}; |
|||
|
|||
$range i 1..n-1 |
|||
$for i [[ |
|||
$range j 1..i |
|||
$range k i+1..n |
|||
template <$for j, [[typename T$j]]> |
|||
struct Types<$for j, [[T$j]]$for k[[, internal::None]]> { |
|||
typedef internal::Types$i<$for j, [[T$j]]> type; |
|||
}; |
|||
|
|||
]] |
|||
|
|||
namespace internal { |
|||
|
|||
# define GTEST_TEMPLATE_ template <typename T> class |
|||
|
|||
// The template "selector" struct TemplateSel<Tmpl> is used to |
|||
// represent Tmpl, which must be a class template with one type |
|||
// parameter, as a type. TemplateSel<Tmpl>::Bind<T>::type is defined |
|||
// as the type Tmpl<T>. This allows us to actually instantiate the |
|||
// template "selected" by TemplateSel<Tmpl>. |
|||
// |
|||
// This trick is necessary for simulating typedef for class templates, |
|||
// which C++ doesn't support directly. |
|||
template <GTEST_TEMPLATE_ Tmpl> |
|||
struct TemplateSel { |
|||
template <typename T> |
|||
struct Bind { |
|||
typedef Tmpl<T> type; |
|||
}; |
|||
}; |
|||
|
|||
# define GTEST_BIND_(TmplSel, T) \ |
|||
TmplSel::template Bind<T>::type |
|||
|
|||
// A unique struct template used as the default value for the |
|||
// arguments of class template Templates. This allows us to simulate |
|||
// variadic templates (e.g. Templates<int>, Templates<int, double>, |
|||
// and etc), which C++ doesn't support directly. |
|||
template <typename T> |
|||
struct NoneT {}; |
|||
|
|||
// The following family of struct and struct templates are used to |
|||
// represent template lists. In particular, TemplatesN<T1, T2, ..., |
|||
// TN> represents a list of N templates (T1, T2, ..., and TN). Except |
|||
// for Templates0, every struct in the family has two member types: |
|||
// Head for the selector of the first template in the list, and Tail |
|||
// for the rest of the list. |
|||
|
|||
// The empty template list. |
|||
struct Templates0 {}; |
|||
|
|||
// Template lists of length 1, 2, 3, and so on. |
|||
|
|||
template <GTEST_TEMPLATE_ T1> |
|||
struct Templates1 { |
|||
typedef TemplateSel<T1> Head; |
|||
typedef Templates0 Tail; |
|||
}; |
|||
|
|||
$range i 2..n |
|||
|
|||
$for i [[ |
|||
$range j 1..i |
|||
$range k 2..i |
|||
template <$for j, [[GTEST_TEMPLATE_ T$j]]> |
|||
struct Templates$i { |
|||
typedef TemplateSel<T1> Head; |
|||
typedef Templates$(i-1)<$for k, [[T$k]]> Tail; |
|||
}; |
|||
|
|||
|
|||
]] |
|||
|
|||
// We don't want to require the users to write TemplatesN<...> directly, |
|||
// as that would require them to count the length. Templates<...> is much |
|||
// easier to write, but generates horrible messages when there is a |
|||
// compiler error, as gcc insists on printing out each template |
|||
// argument, even if it has the default value (this means Templates<list> |
|||
// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler |
|||
// errors). |
|||
// |
|||
// Our solution is to combine the best part of the two approaches: a |
|||
// user would write Templates<T1, ..., TN>, and Google Test will translate |
|||
// that to TemplatesN<T1, ..., TN> internally to make error messages |
|||
// readable. The translation is done by the 'type' member of the |
|||
// Templates template. |
|||
|
|||
$range i 1..n |
|||
template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]> |
|||
struct Templates { |
|||
typedef Templates$n<$for i, [[T$i]]> type; |
|||
}; |
|||
|
|||
template <> |
|||
struct Templates<$for i, [[NoneT]]> { |
|||
typedef Templates0 type; |
|||
}; |
|||
|
|||
$range i 1..n-1 |
|||
$for i [[ |
|||
$range j 1..i |
|||
$range k i+1..n |
|||
template <$for j, [[GTEST_TEMPLATE_ T$j]]> |
|||
struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> { |
|||
typedef Templates$i<$for j, [[T$j]]> type; |
|||
}; |
|||
|
|||
]] |
|||
|
|||
// The TypeList template makes it possible to use either a single type |
|||
// or a Types<...> list in TYPED_TEST_CASE() and |
|||
// INSTANTIATE_TYPED_TEST_CASE_P(). |
|||
|
|||
template <typename T> |
|||
struct TypeList { |
|||
typedef Types1<T> type; |
|||
}; |
|||
|
|||
|
|||
$range i 1..n |
|||
template <$for i, [[typename T$i]]> |
|||
struct TypeList<Types<$for i, [[T$i]]> > { |
|||
typedef typename Types<$for i, [[T$i]]>::type type; |
|||
}; |
|||
|
|||
#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P |
|||
|
|||
} // namespace internal |
|||
} // namespace testing |
|||
|
|||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,12 @@ |
|||
|
|||
MIT License |
|||
|
|||
Copyright (c) Microsoft Corporation |
|||
|
|||
All rights reserved. |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@ -0,0 +1,5 @@ |
|||
//
|
|||
// pch.cpp
|
|||
//
|
|||
|
|||
#include "pch.h" |
@ -0,0 +1,7 @@ |
|||
//
|
|||
// pch.h
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
#include "gtest/gtest.h" |
@ -0,0 +1,29 @@ |
|||
#ifndef SORT |
|||
#define SORT |
|||
#include "stringProcessor.h" |
|||
void swap(char** a, char** b) |
|||
{ |
|||
char* temp = *a; |
|||
*a = *b; |
|||
*b = temp; |
|||
} |
|||
void quick_sort(char** arr, size_t length) |
|||
{ |
|||
size_t piv = 0; |
|||
if (length <= 1) |
|||
{ |
|||
return; |
|||
} |
|||
for (size_t i = 0; i < length; i++) |
|||
{ |
|||
if (strcmp(arr[i], arr[length - 1ull]) < 0) |
|||
{ |
|||
swap(arr + i, arr + piv++); |
|||
} |
|||
} |
|||
//move pivot to "middle"
|
|||
swap(arr + piv, arr + length - 1); |
|||
quick_sort(arr, piv++); |
|||
quick_sort(arr + piv, length - piv); |
|||
} |
|||
#endif // !SORT
|
@ -0,0 +1,170 @@ |
|||
#ifndef STRING_PROCESSOR |
|||
#define STRING_PROCESSOR |
|||
#include <stdint.h> |
|||
#include <stdbool.h> |
|||
#include <malloc.h> |
|||
#include <ctype.h> |
|||
#include <stdio.h> |
|||
#include "sort.h" |
|||
#define STRING_MAX 512ull |
|||
const int32_t get_str(const char const* msg, char* str, const int32_t limit) |
|||
{ |
|||
printf(msg); |
|||
char c; |
|||
size_t size = 0; |
|||
while (size < limit - 1 && (c = getchar()) != EOF && c != '\n') |
|||
{ |
|||
str[size++] = c; |
|||
} |
|||
str[size] = '\0'; |
|||
return size; |
|||
} |
|||
const size_t strlenn(const char* str) |
|||
{ |
|||
size_t cnt; |
|||
for (cnt = 0; *str; str++, cnt++) |
|||
; |
|||
return cnt; |
|||
} |
|||
void strcopy(char* fStr, char* sStr, size_t until) |
|||
{ |
|||
while (0 < until-- && (*sStr++ = *fStr++)) |
|||
; |
|||
} |
|||
int32_t strcmpp(const char* fStr, const char* sStr) |
|||
{ |
|||
while (*fStr) |
|||
{ |
|||
if (*fStr != *sStr) |
|||
{ |
|||
break; |
|||
} |
|||
fStr++; |
|||
sStr++; |
|||
} |
|||
return *(const unsigned char*)fStr - *(const unsigned char*)sStr; |
|||
} |
|||
char* strcatt(char* fStr, const char* sStr) |
|||
{ |
|||
char* ptr = fStr + strlenn(fStr); |
|||
while (*sStr != '\0') |
|||
{ |
|||
*ptr++ = *sStr++; |
|||
} |
|||
*ptr = '\0'; |
|||
return fStr; |
|||
} |
|||
bool is_string_valid(char* str) |
|||
{ |
|||
bool isThereString = false; |
|||
bool isThereColon = false; |
|||
const size_t size = strlenn(str); |
|||
for (size_t i = 0; i < size; i++) |
|||
{ |
|||
if ((str[i] == ':' || str[i] == ';' || str[i] == ',') && i == 0ull) |
|||
{ |
|||
return false; |
|||
} |
|||
if (str[i] == ':') |
|||
{ |
|||
isThereColon = true; |
|||
} |
|||
else if (isThereColon) |
|||
{ |
|||
if (str[i] == ',') |
|||
{ |
|||
if (!isalpha(str[i - 1ull]) && str[i - 1ull] != ' ') |
|||
{ |
|||
return false; |
|||
} |
|||
else |
|||
{ |
|||
isThereString = true; |
|||
} |
|||
} |
|||
if (str[i] == ';') |
|||
{ |
|||
if (!isThereString || (!isalpha(str[i - 1ull]) && str[i - 1ull] != ' ')) |
|||
{ |
|||
return false; |
|||
} |
|||
else |
|||
{ |
|||
isThereColon = false; |
|||
} |
|||
} |
|||
if (str[i] == ':') |
|||
{ |
|||
return false; |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
isThereString = false; |
|||
} |
|||
} |
|||
return true; |
|||
} |
|||
char* process_string(char* str) |
|||
{ |
|||
const size_t length = strlenn(str); |
|||
char* result = (char*)calloc(length, sizeof(char)); |
|||
for (size_t i = 0; i < length; i++) |
|||
{ |
|||
if (str[i] != ':') |
|||
{ |
|||
char temp[2] = { str[i], '\0' }; |
|||
strcatt(result, temp); |
|||
continue; |
|||
} |
|||
if (str[i + 1] != ' ') |
|||
{ |
|||
return NULL; |
|||
} |
|||
strcatt(result, ": "); |
|||
const size_t strsPreCnt = 100; |
|||
char** arr = (char**)calloc(strsPreCnt, sizeof(char*)); |
|||
for (size_t strsCnt = 0; strsCnt < strsPreCnt; strsCnt++) |
|||
{ |
|||
arr[strsCnt] = (char*)calloc(STRING_MAX, sizeof(char)); |
|||
} |
|||
for (size_t j = i + 2ull, strRealCnt = 0ull; j < length; j++) |
|||
{ |
|||
if (str[j] == ',') |
|||
{ |
|||
++strRealCnt; |
|||
++j; |
|||
} |
|||
else if (str[j] == ';') |
|||
{ |
|||
quick_sort(arr, ++strRealCnt); |
|||
for (size_t k = 0; k < strRealCnt; k++) |
|||
{ |
|||
strcatt(result, arr[k]); |
|||
if (k == strRealCnt - 1ull) |
|||
{ |
|||
strcatt(result, ";"); |
|||
} |
|||
else |
|||
{ |
|||
strcatt(result, ", "); |
|||
} |
|||
} |
|||
i = j; |
|||
break; |
|||
} |
|||
else |
|||
{ |
|||
char temp[2] = { str[j], '\0' }; |
|||
strcatt(arr[strRealCnt], temp); |
|||
} |
|||
} |
|||
for (size_t strsCnt = 0; strsCnt < strsPreCnt; strsCnt++) |
|||
{ |
|||
free(arr[strsCnt]); |
|||
} |
|||
free(arr); |
|||
} |
|||
return result; |
|||
} |
|||
#endif |
@ -0,0 +1,87 @@ |
|||
#include "pch.h" |
|||
#include "stringProcessor.h" |
|||
#include "sort.h" |
|||
|
|||
TEST(QuickSortTest, SortsArrayInAscendingOrder) |
|||
{ |
|||
// Test input array
|
|||
char* arr[] = { "banana", "apple", "cherry", "date", "elderberry" }; |
|||
size_t length = sizeof(arr) / sizeof(arr[0]); |
|||
|
|||
// Sort the array
|
|||
quick_sort(arr, length); |
|||
|
|||
// Check if the array is sorted in ascending order
|
|||
for (size_t i = 1; i < length; i++) |
|||
{ |
|||
ASSERT_TRUE(strcmp(arr[i - 1], arr[i]) <= 0); |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
TEST(QuickSortTest, SingleElementArray) { |
|||
// Test sorting an array with a single element.
|
|||
char* arr[] = { "hello" }; |
|||
quick_sort(arr, 1); |
|||
ASSERT_STREQ(arr[0], "hello"); |
|||
} |
|||
|
|||
TEST(QuickSortTest, SortedArray) { |
|||
// Test sorting an array that is already sorted.
|
|||
char* arr[] = { "alpha", "beta", "gamma" }; |
|||
quick_sort(arr, 3); |
|||
ASSERT_STREQ(arr[0], "alpha"); |
|||
ASSERT_STREQ(arr[1], "beta"); |
|||
ASSERT_STREQ(arr[2], "gamma"); |
|||
} |
|||
|
|||
TEST(QuickSortTest, ReverseSortedArray) { |
|||
// Test sorting an array that is reverse sorted.
|
|||
char* arr[] = { "gamma", "beta", "alpha" }; |
|||
quick_sort(arr, 3); |
|||
ASSERT_STREQ(arr[0], "alpha"); |
|||
ASSERT_STREQ(arr[1], "beta"); |
|||
ASSERT_STREQ(arr[2], "gamma"); |
|||
} |
|||
|
|||
TEST(QuickSortTest, RandomArray) { |
|||
// Test sorting an array with random elements.
|
|||
char* arr[] = { "hello", "world", "foo", "bar", "baz", "qux", "quux", "corge" }; |
|||
quick_sort(arr, 8); |
|||
ASSERT_STREQ(arr[0], "bar"); |
|||
ASSERT_STREQ(arr[1], "baz"); |
|||
ASSERT_STREQ(arr[2], "corge"); |
|||
ASSERT_STREQ(arr[3], "foo"); |
|||
ASSERT_STREQ(arr[4], "hello"); |
|||
ASSERT_STREQ(arr[5], "quux"); |
|||
ASSERT_STREQ(arr[6], "qux"); |
|||
ASSERT_STREQ(arr[7], "world"); |
|||
} |
|||
|
|||
|
|||
TEST(StringProcessorTest, ValidString_ReturnsTrue) |
|||
{ |
|||
char str[] = "Valid string: apple, banana; cherry"; |
|||
bool isValid = is_string_valid(str); |
|||
EXPECT_TRUE(isValid); |
|||
} |
|||
|
|||
TEST(StringProcessorTest, InvalidString_ReturnsFalse) |
|||
{ |
|||
char str[] = "Invalid string: apple,; banana; cherry"; |
|||
bool isValid = is_string_valid(str); |
|||
EXPECT_FALSE(isValid); |
|||
} |
|||
// Test swap function
|
|||
TEST(SwapTest, SwapsValuesCorrectly) |
|||
{ |
|||
char* a = "apple"; |
|||
char* b = "banana"; |
|||
|
|||
swap(&a, &b); |
|||
|
|||
EXPECT_STREQ(a, "banana"); |
|||
EXPECT_STREQ(b, "apple"); |
|||
} |
|||
|
@ -0,0 +1,17 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<testsuites tests="8" failures="0" disabled="0" errors="0" timestamp="2023-05-17T18:15:10" time="0.275" name="AllTests"> |
|||
<testsuite name="QuickSortTest" tests="5" failures="0" disabled="0" errors="0" time="0.003"> |
|||
<testcase name="SortsArrayInAscendingOrder" status="run" time="0" classname="QuickSortTest" /> |
|||
<testcase name="SingleElementArray" status="run" time="0" classname="QuickSortTest" /> |
|||
<testcase name="SortedArray" status="run" time="0" classname="QuickSortTest" /> |
|||
<testcase name="ReverseSortedArray" status="run" time="0" classname="QuickSortTest" /> |
|||
<testcase name="RandomArray" status="run" time="0" classname="QuickSortTest" /> |
|||
</testsuite> |
|||
<testsuite name="StringProcessorTest" tests="2" failures="0" disabled="0" errors="0" time="0.001"> |
|||
<testcase name="ValidString_ReturnsTrue" status="run" time="0" classname="StringProcessorTest" /> |
|||
<testcase name="InvalidString_ReturnsFalse" status="run" time="0" classname="StringProcessorTest" /> |
|||
</testsuite> |
|||
<testsuite name="SwapTest" tests="1" failures="0" disabled="0" errors="0" time="0"> |
|||
<testcase name="SwapsValuesCorrectly" status="run" time="0" classname="SwapTest" /> |
|||
</testsuite> |
|||
</testsuites> |
@ -0,0 +1,31 @@ |
|||
|
|||
Microsoft Visual Studio Solution File, Format Version 12.00 |
|||
# Visual Studio Version 17 |
|||
VisualStudioVersion = 17.5.33627.172 |
|||
MinimumVisualStudioVersion = 10.0.40219.1 |
|||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_repos", "test_repos.vcxproj", "{B1E7B93F-9D0F-4755-AA64-0782CB4ECBDE}" |
|||
EndProject |
|||
Global |
|||
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
|||
Debug|x64 = Debug|x64 |
|||
Debug|x86 = Debug|x86 |
|||
Release|x64 = Release|x64 |
|||
Release|x86 = Release|x86 |
|||
EndGlobalSection |
|||
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
|||
{B1E7B93F-9D0F-4755-AA64-0782CB4ECBDE}.Debug|x64.ActiveCfg = Debug|x64 |
|||
{B1E7B93F-9D0F-4755-AA64-0782CB4ECBDE}.Debug|x64.Build.0 = Debug|x64 |
|||
{B1E7B93F-9D0F-4755-AA64-0782CB4ECBDE}.Debug|x86.ActiveCfg = Debug|Win32 |
|||
{B1E7B93F-9D0F-4755-AA64-0782CB4ECBDE}.Debug|x86.Build.0 = Debug|Win32 |
|||
{B1E7B93F-9D0F-4755-AA64-0782CB4ECBDE}.Release|x64.ActiveCfg = Release|x64 |
|||
{B1E7B93F-9D0F-4755-AA64-0782CB4ECBDE}.Release|x64.Build.0 = Release|x64 |
|||
{B1E7B93F-9D0F-4755-AA64-0782CB4ECBDE}.Release|x86.ActiveCfg = Release|Win32 |
|||
{B1E7B93F-9D0F-4755-AA64-0782CB4ECBDE}.Release|x86.Build.0 = Release|Win32 |
|||
EndGlobalSection |
|||
GlobalSection(SolutionProperties) = preSolution |
|||
HideSolutionNode = FALSE |
|||
EndGlobalSection |
|||
GlobalSection(ExtensibilityGlobals) = postSolution |
|||
SolutionGuid = {7B48F165-5542-4FF8-B976-91884FCF3641} |
|||
EndGlobalSection |
|||
EndGlobal |
@ -0,0 +1,125 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
|||
<ItemGroup Label="ProjectConfigurations"> |
|||
<ProjectConfiguration Include="Debug|Win32"> |
|||
<Configuration>Debug</Configuration> |
|||
<Platform>Win32</Platform> |
|||
</ProjectConfiguration> |
|||
<ProjectConfiguration Include="Release|Win32"> |
|||
<Configuration>Release</Configuration> |
|||
<Platform>Win32</Platform> |
|||
</ProjectConfiguration> |
|||
<ProjectConfiguration Include="Debug|x64"> |
|||
<Configuration>Debug</Configuration> |
|||
<Platform>x64</Platform> |
|||
</ProjectConfiguration> |
|||
<ProjectConfiguration Include="Release|x64"> |
|||
<Configuration>Release</Configuration> |
|||
<Platform>x64</Platform> |
|||
</ProjectConfiguration> |
|||
</ItemGroup> |
|||
<PropertyGroup Label="Globals"> |
|||
<ProjectGuid>{b1e7b93f-9d0f-4755-aa64-0782cb4ecbde}</ProjectGuid> |
|||
<Keyword>Win32Proj</Keyword> |
|||
<WindowsTargetPlatformVersion>10.0.22000.0</WindowsTargetPlatformVersion> |
|||
<ConfigurationType>Application</ConfigurationType> |
|||
<PlatformToolset>v143</PlatformToolset> |
|||
<CharacterSet>Unicode</CharacterSet> |
|||
</PropertyGroup> |
|||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> |
|||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> |
|||
<ImportGroup Label="ExtensionSettings" /> |
|||
<ImportGroup Label="Shared" /> |
|||
<ImportGroup Label="PropertySheets" /> |
|||
<PropertyGroup Label="UserMacros" /> |
|||
<ItemGroup> |
|||
<ClInclude Include="pch.h" /> |
|||
<ClInclude Include="sort.h" /> |
|||
<ClInclude Include="stringProcessor.h" /> |
|||
</ItemGroup> |
|||
<ItemGroup> |
|||
<ClCompile Include="test.cpp" /> |
|||
<ClCompile Include="pch.cpp"> |
|||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> |
|||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> |
|||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> |
|||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader> |
|||
</ClCompile> |
|||
</ItemGroup> |
|||
<ItemGroup> |
|||
<None Include="packages.config" /> |
|||
</ItemGroup> |
|||
<ItemDefinitionGroup /> |
|||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> |
|||
<ImportGroup Label="ExtensionTargets"> |
|||
<Import Project="packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.1.7\build\native\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.targets" Condition="Exists('packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.1.7\build\native\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.targets')" /> |
|||
</ImportGroup> |
|||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
|||
<ClCompile> |
|||
<PrecompiledHeader>Use</PrecompiledHeader> |
|||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> |
|||
<Optimization>Disabled</Optimization> |
|||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
|||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> |
|||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> |
|||
<WarningLevel>Level3</WarningLevel> |
|||
</ClCompile> |
|||
<Link> |
|||
<GenerateDebugInformation>true</GenerateDebugInformation> |
|||
<SubSystem>Console</SubSystem> |
|||
</Link> |
|||
</ItemDefinitionGroup> |
|||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
|||
<ClCompile> |
|||
<PrecompiledHeader>Use</PrecompiledHeader> |
|||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> |
|||
<Optimization>Disabled</Optimization> |
|||
<PreprocessorDefinitions>X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
|||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> |
|||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> |
|||
<WarningLevel>Level3</WarningLevel> |
|||
</ClCompile> |
|||
<Link> |
|||
<GenerateDebugInformation>true</GenerateDebugInformation> |
|||
<SubSystem>Console</SubSystem> |
|||
</Link> |
|||
</ItemDefinitionGroup> |
|||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
|||
<ClCompile> |
|||
<PrecompiledHeader>Use</PrecompiledHeader> |
|||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> |
|||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
|||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> |
|||
<WarningLevel>Level3</WarningLevel> |
|||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> |
|||
</ClCompile> |
|||
<Link> |
|||
<GenerateDebugInformation>true</GenerateDebugInformation> |
|||
<SubSystem>Console</SubSystem> |
|||
<OptimizeReferences>true</OptimizeReferences> |
|||
<EnableCOMDATFolding>true</EnableCOMDATFolding> |
|||
</Link> |
|||
</ItemDefinitionGroup> |
|||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
|||
<ClCompile> |
|||
<PrecompiledHeader>Use</PrecompiledHeader> |
|||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> |
|||
<PreprocessorDefinitions>X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
|||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> |
|||
<WarningLevel>Level3</WarningLevel> |
|||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> |
|||
</ClCompile> |
|||
<Link> |
|||
<GenerateDebugInformation>true</GenerateDebugInformation> |
|||
<SubSystem>Console</SubSystem> |
|||
<OptimizeReferences>true</OptimizeReferences> |
|||
<EnableCOMDATFolding>true</EnableCOMDATFolding> |
|||
</Link> |
|||
</ItemDefinitionGroup> |
|||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> |
|||
<PropertyGroup> |
|||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> |
|||
</PropertyGroup> |
|||
<Error Condition="!Exists('packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.1.7\build\native\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.1.7\build\native\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.targets'))" /> |
|||
</Target> |
|||
</Project> |
@ -0,0 +1,7 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
|||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
|||
<LocalDebuggerCommandArguments>--gtest_output=xml:test_report.xml</LocalDebuggerCommandArguments> |
|||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> |
|||
</PropertyGroup> |
|||
</Project> |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,20 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<GtaTestDurations xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> |
|||
<Executable>D:\Diploma\test_repos\x64\Debug\test_repos.exe</Executable> |
|||
<TestDurations> |
|||
<TestDuration Test="StringProcessorTest.GetString" Duration="1" /> |
|||
<TestDuration Test="StringProcessorTest.IsValidString" Duration="1" /> |
|||
<TestDuration Test="StringProcessorTest.ProcessString" Duration="1" /> |
|||
<TestDuration Test="StringProcessorTest.StringFunctions" Duration="0" /> |
|||
<TestDuration Test="QuickSortTest.SortsArrayInAscendingOrder" Duration="1" /> |
|||
<TestDuration Test="QuickSortTest.SingleElementArray" Duration="1" /> |
|||
<TestDuration Test="QuickSortTest.SortedArray" Duration="1" /> |
|||
<TestDuration Test="QuickSortTest.ReverseSortedArray" Duration="1" /> |
|||
<TestDuration Test="QuickSortTest.RandomArray" Duration="1" /> |
|||
<TestDuration Test="StringProcessorTest.ValidString_ReturnsTrue" Duration="1" /> |
|||
<TestDuration Test="StringProcessorTest.InvalidString_ReturnsFalse" Duration="1" /> |
|||
<TestDuration Test="SwapTest.SwapsValuesCorrectly" Duration="1" /> |
|||
<TestDuration Test="IsStringValidTest.ValidatesStringCorrectly" Duration="1" /> |
|||
<TestDuration Test="ProcessStringTest.ProcessesStringCorrectly" Duration="1" /> |
|||
</TestDurations> |
|||
</GtaTestDurations> |
@ -0,0 +1,11 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<Project> |
|||
<ProjectOutputs> |
|||
<ProjectOutput> |
|||
<FullPath>D:\Diploma\test_repos\x64\Debug\test_repos.exe</FullPath> |
|||
</ProjectOutput> |
|||
</ProjectOutputs> |
|||
<ContentFiles /> |
|||
<SatelliteDlls /> |
|||
<NonRecipeFileRefs /> |
|||
</Project> |
Binary file not shown.
@ -0,0 +1,5 @@ |
|||
pch.cpp |
|||
test.cpp |
|||
D:\Diploma\test_repos\stringProcessor.h(10,34): warning C4114: Множественное использование одного и того же квалификатора типа. |
|||
D:\Diploma\test_repos\stringProcessor.h(20,16): warning C4267: return: преобразование из "size_t" в "const int32_t"; возможна потеря данных |
|||
test_repos.vcxproj -> D:\Diploma\test_repos\x64\Debug\test_repos.exe |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue