mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-06 11:16:51 +02:00
Initial add of PowerRename from SmartRename repo (#499)
* Initial add of PowerRename from SmartRename repo
This commit is contained in:
34
src/modules/powerrename/unittests/MockPowerRenameItem.cpp
Normal file
34
src/modules/powerrename/unittests/MockPowerRenameItem.cpp
Normal file
@@ -0,0 +1,34 @@
|
||||
#include "stdafx.h"
|
||||
#include "MockPowerRenameItem.h"
|
||||
|
||||
HRESULT CMockPowerRenameItem::CreateInstance(_In_opt_ PCWSTR path, _In_opt_ PCWSTR originalName, _In_ UINT depth, _In_ bool isFolder, _Outptr_ IPowerRenameItem** ppItem)
|
||||
{
|
||||
*ppItem = nullptr;
|
||||
CMockPowerRenameItem* newItem = new CMockPowerRenameItem();
|
||||
HRESULT hr = newItem ? S_OK : E_OUTOFMEMORY;
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
newItem->Init(path, originalName, depth, isFolder);
|
||||
hr = newItem->QueryInterface(IID_PPV_ARGS(ppItem));
|
||||
newItem->Release();
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
void CMockPowerRenameItem::Init(_In_opt_ PCWSTR path, _In_opt_ PCWSTR originalName, _In_ UINT depth, _In_ bool isFolder)
|
||||
{
|
||||
if (path != nullptr)
|
||||
{
|
||||
SHStrDup(path, &m_path);
|
||||
}
|
||||
|
||||
if (originalName != nullptr)
|
||||
{
|
||||
SHStrDup(originalName, &m_originalName);
|
||||
}
|
||||
|
||||
m_depth = depth;
|
||||
m_isFolder = isFolder;
|
||||
}
|
||||
|
||||
12
src/modules/powerrename/unittests/MockPowerRenameItem.h
Normal file
12
src/modules/powerrename/unittests/MockPowerRenameItem.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
#include "stdafx.h"
|
||||
#include <PowerRenameItem.h>
|
||||
#include "srwlock.h"
|
||||
|
||||
class CMockPowerRenameItem :
|
||||
public CPowerRenameItem
|
||||
{
|
||||
public:
|
||||
static HRESULT CreateInstance(_In_opt_ PCWSTR path, _In_opt_ PCWSTR originalName, _In_ UINT depth, _In_ bool isFolder, _Outptr_ IPowerRenameItem** ppItem);
|
||||
void Init(_In_opt_ PCWSTR path, _In_opt_ PCWSTR originalName, _In_ UINT depth, _In_ bool isFolder);
|
||||
};
|
||||
@@ -0,0 +1,92 @@
|
||||
#include "stdafx.h"
|
||||
#include "MockPowerRenameManagerEvents.h"
|
||||
|
||||
// IUnknown
|
||||
IFACEMETHODIMP CMockPowerRenameManagerEvents::QueryInterface(__in REFIID riid, __deref_out void** ppv)
|
||||
{
|
||||
static const QITAB qit[] =
|
||||
{
|
||||
QITABENT(CMockPowerRenameManagerEvents, IPowerRenameManagerEvents),
|
||||
{ 0 },
|
||||
};
|
||||
return QISearch(this, qit, riid, ppv);
|
||||
}
|
||||
|
||||
IFACEMETHODIMP_(ULONG) CMockPowerRenameManagerEvents::AddRef()
|
||||
{
|
||||
return InterlockedIncrement(&m_refCount);
|
||||
}
|
||||
|
||||
IFACEMETHODIMP_(ULONG) CMockPowerRenameManagerEvents::Release()
|
||||
{
|
||||
long refCount = InterlockedDecrement(&m_refCount);
|
||||
if (refCount == 0)
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
return refCount;
|
||||
}
|
||||
|
||||
// IPowerRenameManagerEvents
|
||||
IFACEMETHODIMP CMockPowerRenameManagerEvents::OnItemAdded(_In_ IPowerRenameItem* pItem)
|
||||
{
|
||||
m_itemAdded = pItem;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP CMockPowerRenameManagerEvents::OnUpdate(_In_ IPowerRenameItem* pItem)
|
||||
{
|
||||
m_itemUpdated = pItem;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP CMockPowerRenameManagerEvents::OnError(_In_ IPowerRenameItem* pItem)
|
||||
{
|
||||
m_itemError = pItem;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP CMockPowerRenameManagerEvents::OnRegExStarted(_In_ DWORD threadId)
|
||||
{
|
||||
m_regExStarted = true;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP CMockPowerRenameManagerEvents::OnRegExCanceled(_In_ DWORD threadId)
|
||||
{
|
||||
m_regExCanceled = true;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP CMockPowerRenameManagerEvents::OnRegExCompleted(_In_ DWORD threadId)
|
||||
{
|
||||
m_regExCompleted = true;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP CMockPowerRenameManagerEvents::OnRenameStarted()
|
||||
{
|
||||
m_renameStarted = true;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP CMockPowerRenameManagerEvents::OnRenameCompleted()
|
||||
{
|
||||
m_renameCompleted = true;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT CMockPowerRenameManagerEvents::s_CreateInstance(_In_ IPowerRenameManager* psrm, _Outptr_ IPowerRenameUI** ppsrui)
|
||||
{
|
||||
*ppsrui = nullptr;
|
||||
CMockPowerRenameManagerEvents* events = new CMockPowerRenameManagerEvents();
|
||||
HRESULT hr = events != nullptr ? S_OK : E_OUTOFMEMORY;
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = events->QueryInterface(IID_PPV_ARGS(ppsrui));
|
||||
events->Release();
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
#pragma once
|
||||
#include <PowerRenameInterfaces.h>
|
||||
|
||||
class CMockPowerRenameManagerEvents :
|
||||
public IPowerRenameManagerEvents
|
||||
{
|
||||
public:
|
||||
CMockPowerRenameManagerEvents() :
|
||||
m_refCount(1)
|
||||
{
|
||||
}
|
||||
|
||||
// IUnknown
|
||||
IFACEMETHODIMP QueryInterface(__in REFIID riid, __deref_out void** ppv);
|
||||
IFACEMETHODIMP_(ULONG) AddRef();
|
||||
IFACEMETHODIMP_(ULONG) Release();
|
||||
|
||||
// IPowerRenameManagerEvents
|
||||
IFACEMETHODIMP OnItemAdded(_In_ IPowerRenameItem* renameItem);
|
||||
IFACEMETHODIMP OnUpdate(_In_ IPowerRenameItem* renameItem);
|
||||
IFACEMETHODIMP OnError(_In_ IPowerRenameItem* renameItem);
|
||||
IFACEMETHODIMP OnRegExStarted(_In_ DWORD threadId);
|
||||
IFACEMETHODIMP OnRegExCanceled(_In_ DWORD threadId);
|
||||
IFACEMETHODIMP OnRegExCompleted(_In_ DWORD threadId);
|
||||
IFACEMETHODIMP OnRenameStarted();
|
||||
IFACEMETHODIMP OnRenameCompleted();
|
||||
|
||||
static HRESULT s_CreateInstance(_In_ IPowerRenameManager* psrm, _Outptr_ IPowerRenameUI** ppsrui);
|
||||
|
||||
~CMockPowerRenameManagerEvents()
|
||||
{
|
||||
}
|
||||
|
||||
CComPtr<IPowerRenameItem> m_itemAdded;
|
||||
CComPtr<IPowerRenameItem> m_itemUpdated;
|
||||
CComPtr<IPowerRenameItem> m_itemError;
|
||||
bool m_regExStarted = false;
|
||||
bool m_regExCanceled = false;
|
||||
bool m_regExCompleted = false;
|
||||
bool m_renameStarted = false;
|
||||
bool m_renameCompleted = false;
|
||||
long m_refCount = 0;
|
||||
};
|
||||
@@ -0,0 +1,69 @@
|
||||
#include "stdafx.h"
|
||||
#include "MockPowerRenameRegExEvents.h"
|
||||
|
||||
IFACEMETHODIMP_(ULONG) CMockPowerRenameRegExEvents::AddRef()
|
||||
{
|
||||
return InterlockedIncrement(&m_refCount);
|
||||
}
|
||||
|
||||
IFACEMETHODIMP_(ULONG) CMockPowerRenameRegExEvents::Release()
|
||||
{
|
||||
long refCount = InterlockedDecrement(&m_refCount);
|
||||
|
||||
if (refCount == 0)
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
return refCount;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP CMockPowerRenameRegExEvents::QueryInterface(_In_ REFIID riid, _Outptr_ void** ppv)
|
||||
{
|
||||
static const QITAB qit[] = {
|
||||
QITABENT(CMockPowerRenameRegExEvents, IPowerRenameRegExEvents),
|
||||
{ 0 }
|
||||
};
|
||||
return QISearch(this, qit, riid, ppv);
|
||||
}
|
||||
|
||||
IFACEMETHODIMP CMockPowerRenameRegExEvents::OnSearchTermChanged(_In_ PCWSTR searchTerm)
|
||||
{
|
||||
CoTaskMemFree(m_searchTerm);
|
||||
m_searchTerm = nullptr;
|
||||
if (searchTerm != nullptr)
|
||||
{
|
||||
SHStrDup(searchTerm, &m_searchTerm);
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP CMockPowerRenameRegExEvents::OnReplaceTermChanged(_In_ PCWSTR replaceTerm)
|
||||
{
|
||||
CoTaskMemFree(m_replaceTerm);
|
||||
m_replaceTerm = nullptr;
|
||||
if (replaceTerm != nullptr)
|
||||
{
|
||||
SHStrDup(replaceTerm, &m_replaceTerm);
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP CMockPowerRenameRegExEvents::OnFlagsChanged(_In_ DWORD flags)
|
||||
{
|
||||
m_flags = flags;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT CMockPowerRenameRegExEvents::s_CreateInstance(_Outptr_ IPowerRenameRegExEvents** ppsrree)
|
||||
{
|
||||
*ppsrree = nullptr;
|
||||
CMockPowerRenameRegExEvents* psrree = new CMockPowerRenameRegExEvents();
|
||||
HRESULT hr = psrree ? S_OK : E_OUTOFMEMORY;
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = psrree->QueryInterface(IID_PPV_ARGS(ppsrree));
|
||||
psrree->Release();
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
#pragma once
|
||||
#include <vector>
|
||||
#include "srwlock.h"
|
||||
|
||||
class CMockPowerRenameRegExEvents:
|
||||
public IPowerRenameRegExEvents
|
||||
{
|
||||
public:
|
||||
// IUnknown
|
||||
IFACEMETHODIMP QueryInterface(_In_ REFIID iid, _Outptr_ void** resultInterface);
|
||||
IFACEMETHODIMP_(ULONG) AddRef();
|
||||
IFACEMETHODIMP_(ULONG) Release();
|
||||
|
||||
// IPowerRenameRegExEvents
|
||||
IFACEMETHODIMP OnSearchTermChanged(_In_ PCWSTR searchTerm);
|
||||
IFACEMETHODIMP OnReplaceTermChanged(_In_ PCWSTR replaceTerm);
|
||||
IFACEMETHODIMP OnFlagsChanged(_In_ DWORD flags);
|
||||
|
||||
static HRESULT s_CreateInstance(_Outptr_ IPowerRenameRegExEvents** ppsrree);
|
||||
|
||||
CMockPowerRenameRegExEvents() :
|
||||
m_refCount(1)
|
||||
{
|
||||
}
|
||||
|
||||
~CMockPowerRenameRegExEvents()
|
||||
{
|
||||
CoTaskMemFree(m_searchTerm);
|
||||
CoTaskMemFree(m_replaceTerm);
|
||||
}
|
||||
|
||||
PWSTR m_searchTerm = nullptr;
|
||||
PWSTR m_replaceTerm = nullptr;
|
||||
DWORD m_flags = 0;
|
||||
long m_refCount;
|
||||
};
|
||||
@@ -0,0 +1,198 @@
|
||||
<?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>{2151F984-E006-4A9F-92EF-C6DDE3DC8413}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>PowerRenameLibUnitTests</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
<ProjectName>PowerRenameUnitTests</ProjectName>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>..\lib\;$(IncludePath)</IncludePath>
|
||||
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>..\lib\;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>..\lib\;$(IncludePath)</IncludePath>
|
||||
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>..\lib\;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<UseFullPaths>true</UseFullPaths>
|
||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>$(OutDir)PowerRenameLib.lib;$(OutDir)PowerRenameUI.lib;comctl32.lib;pathcch.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;Pathcch.lib;$(OutDir)..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;$(OutDir)PowerRenameLib.lib;$(OutDir)PowerRenameLib.lib;%(AdditionalDependencies);</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<UseFullPaths>true</UseFullPaths>
|
||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>$(OutDir)PowerRenameLib.lib;$(OutDir)PowerRenameUI.lib;comctl32.lib;pathcch.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;Pathcch.lib;$(OutDir)..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;$(OutDir)PowerRenameLib.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<UseFullPaths>true</UseFullPaths>
|
||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>$(OutDir)PowerRenameLib.lib;$(OutDir)PowerRenameUI.lib;comctl32.lib;pathcch.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;Pathcch.lib;$(OutDir)..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<UseFullPaths>true</UseFullPaths>
|
||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>$(OutDir)PowerRenameLib.lib;$(OutDir)PowerRenameUI.lib;comctl32.lib;pathcch.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;Pathcch.lib;$(OutDir)..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="MockPowerRenameItem.h" />
|
||||
<ClInclude Include="MockPowerRenameManagerEvents.h" />
|
||||
<ClInclude Include="MockPowerRenameRegExEvents.h" />
|
||||
<ClInclude Include="stdafx.h" />
|
||||
<ClInclude Include="targetver.h" />
|
||||
<ClInclude Include="TestFileHelper.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="MockPowerRenameItem.cpp" />
|
||||
<ClCompile Include="MockPowerRenameManagerEvents.cpp" />
|
||||
<ClCompile Include="MockPowerRenameRegExEvents.cpp" />
|
||||
<ClCompile Include="PowerRenameManagerTests.cpp" />
|
||||
<ClCompile Include="stdafx.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="PowerRenameRegExTests.cpp" />
|
||||
<ClCompile Include="TestFileHelper.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
241
src/modules/powerrename/unittests/PowerRenameManagerTests.cpp
Normal file
241
src/modules/powerrename/unittests/PowerRenameManagerTests.cpp
Normal file
@@ -0,0 +1,241 @@
|
||||
#include "stdafx.h"
|
||||
#include "CppUnitTest.h"
|
||||
#include <PowerRenameInterfaces.h>
|
||||
#include <PowerRenameManager.h>
|
||||
#include <PowerRenameItem.h>
|
||||
#include "MockPowerRenameItem.h"
|
||||
#include "MockPowerRenameManagerEvents.h"
|
||||
#include "TestFileHelper.h"
|
||||
|
||||
#define DEFAULT_FLAGS MatchAllOccurences
|
||||
|
||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
||||
|
||||
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
|
||||
|
||||
#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
|
||||
|
||||
HINSTANCE g_hInst = HINST_THISCOMPONENT;
|
||||
|
||||
namespace PowerRenameManagerTests
|
||||
{
|
||||
TEST_CLASS(SimpleTests)
|
||||
{
|
||||
public:
|
||||
|
||||
struct rename_pairs
|
||||
{
|
||||
std::wstring originalName;
|
||||
std::wstring newName;
|
||||
bool isFile;
|
||||
bool shouldRename;
|
||||
int depth;
|
||||
};
|
||||
|
||||
void RenameHelper(_In_ rename_pairs* renamePairs, _In_ int numPairs, _In_ std::wstring searchTerm, _In_ std::wstring replaceTerm, _In_ DWORD flags)
|
||||
{
|
||||
// Create a single item (in a temp directory) and verify rename works as expected
|
||||
CTestFileHelper testFileHelper;
|
||||
for (int i = 0; i < numPairs; i++)
|
||||
{
|
||||
if (renamePairs[i].isFile)
|
||||
{
|
||||
Assert::IsTrue(testFileHelper.AddFile(renamePairs[i].originalName));
|
||||
}
|
||||
else
|
||||
{
|
||||
Assert::IsTrue(testFileHelper.AddFolder(renamePairs[i].originalName));
|
||||
}
|
||||
}
|
||||
|
||||
CComPtr<IPowerRenameManager> mgr;
|
||||
Assert::IsTrue(CPowerRenameManager::s_CreateInstance(&mgr) == S_OK);
|
||||
CMockPowerRenameManagerEvents* mockMgrEvents = new CMockPowerRenameManagerEvents();
|
||||
CComPtr<IPowerRenameManagerEvents> mgrEvents;
|
||||
Assert::IsTrue(mockMgrEvents->QueryInterface(IID_PPV_ARGS(&mgrEvents)) == S_OK);
|
||||
DWORD cookie = 0;
|
||||
Assert::IsTrue(mgr->Advise(mgrEvents, &cookie) == S_OK);
|
||||
|
||||
for (int i = 0; i < numPairs; i++)
|
||||
{
|
||||
CComPtr<IPowerRenameItem> item;
|
||||
CMockPowerRenameItem::CreateInstance(testFileHelper.GetFullPath(
|
||||
renamePairs[i].originalName).c_str(),
|
||||
renamePairs[i].originalName.c_str(),
|
||||
renamePairs[i].depth,
|
||||
!renamePairs[i].isFile,
|
||||
&item);
|
||||
|
||||
int itemId = 0;
|
||||
Assert::IsTrue(item->get_id(&itemId) == S_OK);
|
||||
mgr->AddItem(item);
|
||||
|
||||
// Verify the item we added is the same from the event
|
||||
Assert::IsTrue(mockMgrEvents->m_itemAdded != nullptr && mockMgrEvents->m_itemAdded == item);
|
||||
int eventItemId = 0;
|
||||
Assert::IsTrue(mockMgrEvents->m_itemAdded->get_id(&eventItemId) == S_OK);
|
||||
Assert::IsTrue(itemId == eventItemId);
|
||||
}
|
||||
|
||||
// TODO: Setup match and replace parameters
|
||||
CComPtr<IPowerRenameRegEx> renRegEx;
|
||||
Assert::IsTrue(mgr->get_smartRenameRegEx(&renRegEx) == S_OK);
|
||||
renRegEx->put_flags(flags);
|
||||
renRegEx->put_searchTerm(searchTerm.c_str());
|
||||
renRegEx->put_replaceTerm(replaceTerm.c_str());
|
||||
|
||||
Sleep(1000);
|
||||
|
||||
// Perform the rename
|
||||
Assert::IsTrue(mgr->Rename(0) == S_OK);
|
||||
|
||||
Sleep(1000);
|
||||
|
||||
// Verify the rename occurred
|
||||
for (int i = 0; i < numPairs; i++)
|
||||
{
|
||||
Assert::IsTrue(testFileHelper.PathExists(renamePairs[i].originalName) == !renamePairs[i].shouldRename);
|
||||
Assert::IsTrue(testFileHelper.PathExists(renamePairs[i].newName) == renamePairs[i].shouldRename);
|
||||
}
|
||||
|
||||
Assert::IsTrue(mgr->Shutdown() == S_OK);
|
||||
|
||||
mockMgrEvents->Release();
|
||||
}
|
||||
TEST_METHOD(CreateTest)
|
||||
{
|
||||
CComPtr<IPowerRenameManager> mgr;
|
||||
Assert::IsTrue(CPowerRenameManager::s_CreateInstance(&mgr) == S_OK);
|
||||
}
|
||||
|
||||
TEST_METHOD(CreateAndShutdownTest)
|
||||
{
|
||||
CComPtr<IPowerRenameManager> mgr;
|
||||
Assert::IsTrue(CPowerRenameManager::s_CreateInstance(&mgr) == S_OK);
|
||||
Assert::IsTrue(mgr->Shutdown() == S_OK);
|
||||
}
|
||||
|
||||
TEST_METHOD(AddItemTest)
|
||||
{
|
||||
CComPtr<IPowerRenameManager> mgr;
|
||||
Assert::IsTrue(CPowerRenameManager::s_CreateInstance(&mgr) == S_OK);
|
||||
CComPtr<IPowerRenameItem> item;
|
||||
CMockPowerRenameItem::CreateInstance(L"foo", L"foo", 0, false, &item);
|
||||
mgr->AddItem(item);
|
||||
Assert::IsTrue(mgr->Shutdown() == S_OK);
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifySmartManagerEvents)
|
||||
{
|
||||
CComPtr<IPowerRenameManager> mgr;
|
||||
Assert::IsTrue(CPowerRenameManager::s_CreateInstance(&mgr) == S_OK);
|
||||
CMockPowerRenameManagerEvents* mockMgrEvents = new CMockPowerRenameManagerEvents();
|
||||
CComPtr<IPowerRenameManagerEvents> mgrEvents;
|
||||
Assert::IsTrue(mockMgrEvents->QueryInterface(IID_PPV_ARGS(&mgrEvents)) == S_OK);
|
||||
DWORD cookie = 0;
|
||||
Assert::IsTrue(mgr->Advise(mgrEvents, &cookie) == S_OK);
|
||||
CComPtr<IPowerRenameItem> item;
|
||||
CMockPowerRenameItem::CreateInstance(L"foo", L"foo", 0, false, &item);
|
||||
int itemId = 0;
|
||||
Assert::IsTrue(item->get_id(&itemId) == S_OK);
|
||||
mgr->AddItem(item);
|
||||
|
||||
// Verify the item we added is the same from the event
|
||||
Assert::IsTrue(mockMgrEvents->m_itemAdded != nullptr && mockMgrEvents->m_itemAdded == item);
|
||||
int eventItemId = 0;
|
||||
Assert::IsTrue(mockMgrEvents->m_itemAdded->get_id(&eventItemId) == S_OK);
|
||||
Assert::IsTrue(itemId == eventItemId);
|
||||
Assert::IsTrue(mgr->Shutdown() == S_OK);
|
||||
|
||||
mockMgrEvents->Release();
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifySingleRename)
|
||||
{
|
||||
// Create a single item and verify rename works as expected
|
||||
rename_pairs renamePairs[] =
|
||||
{
|
||||
{L"foo.txt", L"bar.txt", true, true}
|
||||
};
|
||||
|
||||
RenameHelper(renamePairs, ARRAYSIZE(renamePairs), L"foo", L"bar", DEFAULT_FLAGS);
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyMultiRename)
|
||||
{
|
||||
// Create a single item and verify rename works as expected
|
||||
rename_pairs renamePairs[] =
|
||||
{
|
||||
{L"foo1.txt", L"bar1.txt", true, true, 0},
|
||||
{L"foo2.txt", L"bar2.txt", true, true, 0},
|
||||
{L"foo3.txt", L"bar3.txt", true, true, 0},
|
||||
{L"foo4.txt", L"bar4.txt", true, true, 0},
|
||||
{L"foo5.txt", L"bar5.txt", true, true, 0},
|
||||
{L"baa.txt", L"baa_norename.txt", true, false, 0}
|
||||
};
|
||||
|
||||
RenameHelper(renamePairs, ARRAYSIZE(renamePairs), L"foo", L"bar", DEFAULT_FLAGS);
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyFilesOnlyRename)
|
||||
{
|
||||
// Verify only files are renamed when folders match too
|
||||
rename_pairs renamePairs[] =
|
||||
{
|
||||
{L"foo.txt", L"bar.txt", true, true, 0},
|
||||
{L"foo", L"foo_norename", false, false, 0}
|
||||
};
|
||||
|
||||
RenameHelper(renamePairs, ARRAYSIZE(renamePairs), L"foo", L"bar", DEFAULT_FLAGS | ExcludeFolders);
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyFoldersOnlyRename)
|
||||
{
|
||||
// Verify only folders are renamed when files match too
|
||||
rename_pairs renamePairs[] =
|
||||
{
|
||||
{L"foo.txt", L"foo_norename.txt", true, false, 0},
|
||||
{L"foo", L"bar", false, true, 0}
|
||||
};
|
||||
|
||||
RenameHelper(renamePairs, ARRAYSIZE(renamePairs), L"foo", L"bar", DEFAULT_FLAGS | ExcludeFiles);
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyFileNameOnlyRename)
|
||||
{
|
||||
// Verify only file name is renamed, not extension
|
||||
rename_pairs renamePairs[] =
|
||||
{
|
||||
{L"foo.foo", L"bar.foo", true, true, 0},
|
||||
{L"test.foo", L"test.foo_norename", true, false, 0}
|
||||
};
|
||||
|
||||
RenameHelper(renamePairs, ARRAYSIZE(renamePairs), L"foo", L"bar", DEFAULT_FLAGS | NameOnly);
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyFileExtensionOnlyRename)
|
||||
{
|
||||
// Verify only file extension is renamed, not name
|
||||
rename_pairs renamePairs[] =
|
||||
{
|
||||
{L"foo.foo", L"foo.bar", true, true, 0},
|
||||
{L"test.foo", L"test.bar", true, true, 0}
|
||||
};
|
||||
|
||||
RenameHelper(renamePairs, ARRAYSIZE(renamePairs), L"foo", L"bar", DEFAULT_FLAGS | ExtensionOnly);
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifySubFoldersRename)
|
||||
{
|
||||
// Verify subfolders do not get renamed
|
||||
rename_pairs renamePairs[] =
|
||||
{
|
||||
{L"foo1", L"bar1", false, true, 0},
|
||||
{L"foo2", L"foo2_norename", false, false, 1}
|
||||
};
|
||||
|
||||
RenameHelper(renamePairs, ARRAYSIZE(renamePairs), L"foo", L"bar", DEFAULT_FLAGS | ExcludeSubfolders);
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
331
src/modules/powerrename/unittests/PowerRenameRegExTests.cpp
Normal file
331
src/modules/powerrename/unittests/PowerRenameRegExTests.cpp
Normal file
@@ -0,0 +1,331 @@
|
||||
#include "stdafx.h"
|
||||
#include "CppUnitTest.h"
|
||||
#include <PowerRenameInterfaces.h>
|
||||
#include <PowerRenameRegEx.h>
|
||||
#include "MockPowerRenameRegExEvents.h"
|
||||
|
||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
||||
|
||||
namespace PowerRenameRegExTests
|
||||
{
|
||||
struct SearchReplaceExpected
|
||||
{
|
||||
PCWSTR search;
|
||||
PCWSTR replace;
|
||||
PCWSTR test;
|
||||
PCWSTR expected;
|
||||
};
|
||||
|
||||
TEST_CLASS(SimpleTests)
|
||||
{
|
||||
public:
|
||||
TEST_METHOD(GeneralReplaceTest)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(L"foo") == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_replaceTerm(L"big") == S_OK);
|
||||
Assert::IsTrue(renameRegEx->Replace(L"foobar", &result) == S_OK);
|
||||
Assert::IsTrue(wcscmp(result, L"bigbar") == 0);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
|
||||
TEST_METHOD(ReplaceNoMatch)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(L"notfound") == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_replaceTerm(L"big") == S_OK);
|
||||
Assert::IsTrue(renameRegEx->Replace(L"foobar", &result) == S_OK);
|
||||
Assert::IsTrue(wcscmp(result, L"foobar") == 0);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
|
||||
TEST_METHOD(ReplaceNoSearchOrReplaceTerm)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->Replace(L"foobar", &result) != S_OK);
|
||||
Assert::IsTrue(result == nullptr);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
|
||||
TEST_METHOD(ReplaceNoReplaceTerm)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(L"foo") == S_OK);
|
||||
Assert::IsTrue(renameRegEx->Replace(L"foobar", &result) == S_OK);
|
||||
Assert::IsTrue(wcscmp(result, L"bar") == 0);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
|
||||
TEST_METHOD(ReplaceEmptyStringReplaceTerm)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(L"foo") == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_replaceTerm(L"") == S_OK);
|
||||
Assert::IsTrue(renameRegEx->Replace(L"foobar", &result) == S_OK);
|
||||
Assert::IsTrue(wcscmp(result, L"bar") == 0);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyDefaultFlags)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
DWORD flags = 0;
|
||||
Assert::IsTrue(renameRegEx->get_flags(&flags) == S_OK);
|
||||
Assert::IsTrue(flags == MatchAllOccurences);
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyCaseSensitiveSearch)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
DWORD flags = CaseSensitive;
|
||||
Assert::IsTrue(renameRegEx->put_flags(flags) == S_OK);
|
||||
|
||||
SearchReplaceExpected sreTable[] =
|
||||
{
|
||||
{ L"Foo", L"Foo", L"FooBar", L"FooBar" },
|
||||
{ L"Foo", L"boo", L"FooBar", L"booBar" },
|
||||
{ L"Foo", L"boo", L"foobar", L"foobar" },
|
||||
{ L"123", L"654", L"123456", L"654456" },
|
||||
};
|
||||
|
||||
for (int i = 0; i < ARRAYSIZE(sreTable); i++)
|
||||
{
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(sreTable[i].search) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_replaceTerm(sreTable[i].replace) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->Replace(sreTable[i].test, &result) == S_OK);
|
||||
Assert::IsTrue(wcscmp(result, sreTable[i].expected) == 0);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyReplaceFirstOnly)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
DWORD flags = 0;
|
||||
Assert::IsTrue(renameRegEx->put_flags(flags) == S_OK);
|
||||
|
||||
SearchReplaceExpected sreTable[] =
|
||||
{
|
||||
{ L"B", L"BB", L"ABA", L"ABBA" },
|
||||
{ L"B", L"A", L"ABBBA", L"AABBA" },
|
||||
{ L"B", L"BBB", L"ABABAB", L"ABBBABAB" },
|
||||
};
|
||||
|
||||
for (int i = 0; i < ARRAYSIZE(sreTable); i++)
|
||||
{
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(sreTable[i].search) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_replaceTerm(sreTable[i].replace) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->Replace(sreTable[i].test, &result) == S_OK);
|
||||
Assert::IsTrue(wcscmp(result, sreTable[i].expected) == 0);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyReplaceAll)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
DWORD flags = MatchAllOccurences;
|
||||
Assert::IsTrue(renameRegEx->put_flags(flags) == S_OK);
|
||||
|
||||
SearchReplaceExpected sreTable[] =
|
||||
{
|
||||
{ L"B", L"BB", L"ABA", L"ABBA" },
|
||||
{ L"B", L"A", L"ABBBA", L"AAAAA" },
|
||||
{ L"B", L"BBB", L"ABABAB", L"ABBBABBBABBB" },
|
||||
};
|
||||
|
||||
for (int i = 0; i < ARRAYSIZE(sreTable); i++)
|
||||
{
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(sreTable[i].search) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_replaceTerm(sreTable[i].replace) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->Replace(sreTable[i].test, &result) == S_OK);
|
||||
Assert::IsTrue(wcscmp(result, sreTable[i].expected) == 0);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyReplaceAllCaseInsensitive)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
DWORD flags = MatchAllOccurences | CaseSensitive;
|
||||
Assert::IsTrue(renameRegEx->put_flags(flags) == S_OK);
|
||||
|
||||
SearchReplaceExpected sreTable[] =
|
||||
{
|
||||
{ L"B", L"BB", L"ABA", L"ABBA" },
|
||||
{ L"B", L"A", L"ABBBA", L"AAAAA" },
|
||||
{ L"B", L"BBB", L"ABABAB", L"ABBBABBBABBB" },
|
||||
{ L"b", L"BBB", L"AbABAb", L"ABBBABABBB" },
|
||||
};
|
||||
|
||||
for (int i = 0; i < ARRAYSIZE(sreTable); i++)
|
||||
{
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(sreTable[i].search) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_replaceTerm(sreTable[i].replace) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->Replace(sreTable[i].test, &result) == S_OK);
|
||||
Assert::IsTrue(wcscmp(result, sreTable[i].expected) == 0);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyReplaceFirstOnlyUseRegEx)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
DWORD flags = UseRegularExpressions;
|
||||
Assert::IsTrue(renameRegEx->put_flags(flags) == S_OK);
|
||||
|
||||
SearchReplaceExpected sreTable[] =
|
||||
{
|
||||
{ L"B", L"BB", L"ABA", L"ABBA" },
|
||||
{ L"B", L"A", L"ABBBA", L"AABBA" },
|
||||
{ L"B", L"BBB", L"ABABAB", L"ABBBABAB" },
|
||||
};
|
||||
|
||||
for (int i = 0; i < ARRAYSIZE(sreTable); i++)
|
||||
{
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(sreTable[i].search) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_replaceTerm(sreTable[i].replace) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->Replace(sreTable[i].test, &result) == S_OK);
|
||||
Assert::IsTrue(wcscmp(result, sreTable[i].expected) == 0);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyReplaceAllUseRegEx)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
DWORD flags = MatchAllOccurences | UseRegularExpressions;
|
||||
Assert::IsTrue(renameRegEx->put_flags(flags) == S_OK);
|
||||
|
||||
SearchReplaceExpected sreTable[] =
|
||||
{
|
||||
{ L"B", L"BB", L"ABA", L"ABBA" },
|
||||
{ L"B", L"A", L"ABBBA", L"AAAAA" },
|
||||
{ L"B", L"BBB", L"ABABAB", L"ABBBABBBABBB" },
|
||||
};
|
||||
|
||||
for (int i = 0; i < ARRAYSIZE(sreTable); i++)
|
||||
{
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(sreTable[i].search) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_replaceTerm(sreTable[i].replace) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->Replace(sreTable[i].test, &result) == S_OK);
|
||||
Assert::IsTrue(wcscmp(result, sreTable[i].expected) == 0);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyReplaceAllUseRegExCaseSensitive)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
DWORD flags = MatchAllOccurences | UseRegularExpressions | CaseSensitive;
|
||||
Assert::IsTrue(renameRegEx->put_flags(flags) == S_OK);
|
||||
|
||||
SearchReplaceExpected sreTable[] =
|
||||
{
|
||||
{ L"B", L"BB", L"ABA", L"ABBA" },
|
||||
{ L"B", L"A", L"ABBBA", L"AAAAA" },
|
||||
{ L"b", L"BBB", L"AbABAb", L"ABBBABABBB" },
|
||||
};
|
||||
|
||||
for (int i = 0; i < ARRAYSIZE(sreTable); i++)
|
||||
{
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(sreTable[i].search) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_replaceTerm(sreTable[i].replace) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->Replace(sreTable[i].test, &result) == S_OK);
|
||||
Assert::IsTrue(wcscmp(result, sreTable[i].expected) == 0);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyMatchAllWildcardUseRegEx)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
DWORD flags = MatchAllOccurences | UseRegularExpressions;
|
||||
Assert::IsTrue(renameRegEx->put_flags(flags) == S_OK);
|
||||
|
||||
SearchReplaceExpected sreTable[] =
|
||||
{
|
||||
{ L".*", L"Foo", L"AAAAAA", L"Foo" },
|
||||
};
|
||||
|
||||
for (int i = 0; i < ARRAYSIZE(sreTable); i++)
|
||||
{
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(sreTable[i].search) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_replaceTerm(sreTable[i].replace) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->Replace(sreTable[i].test, &result) == S_OK);
|
||||
Assert::IsTrue(wcscmp(result, sreTable[i].expected) == 0);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyReplaceFirstWildcardUseRegEx)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
DWORD flags = UseRegularExpressions;
|
||||
Assert::IsTrue(renameRegEx->put_flags(flags) == S_OK);
|
||||
|
||||
SearchReplaceExpected sreTable[] =
|
||||
{
|
||||
{ L".*", L"Foo", L"AAAAAA", L"FooAAAA" },
|
||||
};
|
||||
|
||||
for (int i = 0; i < ARRAYSIZE(sreTable); i++)
|
||||
{
|
||||
PWSTR result = nullptr;
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(sreTable[i].search) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_replaceTerm(sreTable[i].replace) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->Replace(sreTable[i].test, &result) == S_OK);
|
||||
Assert::IsTrue(wcscmp(result, sreTable[i].expected) == 0);
|
||||
CoTaskMemFree(result);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(VerifyEventsFire)
|
||||
{
|
||||
CComPtr<IPowerRenameRegEx> renameRegEx;
|
||||
Assert::IsTrue(CPowerRenameRegEx::s_CreateInstance(&renameRegEx) == S_OK);
|
||||
CMockPowerRenameRegExEvents* mockEvents = new CMockPowerRenameRegExEvents();
|
||||
CComPtr<IPowerRenameRegExEvents> regExEvents;
|
||||
Assert::IsTrue(mockEvents->QueryInterface(IID_PPV_ARGS(®ExEvents)) == S_OK);
|
||||
DWORD cookie = 0;
|
||||
Assert::IsTrue(renameRegEx->Advise(regExEvents, &cookie) == S_OK);
|
||||
DWORD flags = MatchAllOccurences | UseRegularExpressions | CaseSensitive;
|
||||
Assert::IsTrue(renameRegEx->put_flags(flags) == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_searchTerm(L"FOO") == S_OK);
|
||||
Assert::IsTrue(renameRegEx->put_replaceTerm(L"BAR") == S_OK);
|
||||
Assert::IsTrue(lstrcmpi(L"FOO", mockEvents->m_searchTerm) == 0);
|
||||
Assert::IsTrue(lstrcmpi(L"BAR", mockEvents->m_replaceTerm) == 0);
|
||||
Assert::IsTrue(flags == mockEvents->m_flags);
|
||||
Assert::IsTrue(renameRegEx->UnAdvise(cookie) == S_OK);
|
||||
mockEvents->Release();
|
||||
}
|
||||
};
|
||||
}
|
||||
73
src/modules/powerrename/unittests/TestFileHelper.cpp
Normal file
73
src/modules/powerrename/unittests/TestFileHelper.cpp
Normal file
@@ -0,0 +1,73 @@
|
||||
#include "stdafx.h"
|
||||
#include "TestFileHelper.h"
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <Objbase.h>
|
||||
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
|
||||
|
||||
CTestFileHelper::CTestFileHelper()
|
||||
{
|
||||
_CreateTempDirectory();
|
||||
}
|
||||
CTestFileHelper::~CTestFileHelper()
|
||||
{
|
||||
_DeleteTempDirectory();
|
||||
}
|
||||
|
||||
// Pass a relative path which will be appended to the temp directory path
|
||||
bool CTestFileHelper::AddFile(_In_ const std::wstring path)
|
||||
{
|
||||
fs::path newFilePath = _tempDirectory;
|
||||
newFilePath.append(path);
|
||||
std::ofstream ofs(newFilePath);
|
||||
ofs.close();
|
||||
return true;
|
||||
}
|
||||
|
||||
// Pass a relative path which will be appended to the temp directory path
|
||||
bool CTestFileHelper::AddFolder(_In_ const std::wstring path)
|
||||
{
|
||||
fs::path newFolderPath = _tempDirectory;
|
||||
newFolderPath.append(path);
|
||||
return fs::create_directory(fs::path(newFolderPath));
|
||||
}
|
||||
|
||||
fs::path CTestFileHelper::GetFullPath(_In_ const std::wstring path)
|
||||
{
|
||||
fs::path fullPath = _tempDirectory;
|
||||
fullPath.append(path);
|
||||
return fullPath;
|
||||
}
|
||||
|
||||
bool CTestFileHelper::PathExists(_In_ const std::wstring path)
|
||||
{
|
||||
fs::path fullPath = _tempDirectory;
|
||||
fullPath.append(path);
|
||||
return fs::exists(fullPath);
|
||||
}
|
||||
|
||||
bool CTestFileHelper::_CreateTempDirectory()
|
||||
{
|
||||
// Initialize to the temp directory
|
||||
_tempDirectory = fs::temp_directory_path();
|
||||
|
||||
// Create a unique folder name
|
||||
GUID guid = { 0 };
|
||||
CoCreateGuid(&guid);
|
||||
|
||||
wchar_t uniqueName[MAX_PATH] = { 0 };
|
||||
StringFromGUID2(guid, uniqueName, ARRAYSIZE(uniqueName));
|
||||
|
||||
_tempDirectory.append(uniqueName);
|
||||
|
||||
return fs::create_directory(_tempDirectory);
|
||||
}
|
||||
|
||||
void CTestFileHelper::_DeleteTempDirectory()
|
||||
{
|
||||
fs::remove_all(_tempDirectory);
|
||||
}
|
||||
|
||||
25
src/modules/powerrename/unittests/TestFileHelper.h
Normal file
25
src/modules/powerrename/unittests/TestFileHelper.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
|
||||
#include <filesystem>
|
||||
#include <string>
|
||||
#include <windows.h>
|
||||
|
||||
|
||||
class CTestFileHelper
|
||||
{
|
||||
public:
|
||||
CTestFileHelper();
|
||||
~CTestFileHelper();
|
||||
|
||||
bool AddFile(_In_ const std::wstring path);
|
||||
bool AddFolder(_In_ const std::wstring path);
|
||||
const std::filesystem::path GetTempDirectory() { return _tempDirectory; }
|
||||
bool PathExists(_In_ const std::wstring path);
|
||||
std::filesystem::path GetFullPath(_In_ const std::wstring path);
|
||||
|
||||
private:
|
||||
bool _CreateTempDirectory();
|
||||
void _DeleteTempDirectory();
|
||||
|
||||
std::filesystem::path _tempDirectory;
|
||||
};
|
||||
1
src/modules/powerrename/unittests/stdafx.cpp
Normal file
1
src/modules/powerrename/unittests/stdafx.cpp
Normal file
@@ -0,0 +1 @@
|
||||
#include "stdafx.h"
|
||||
9
src/modules/powerrename/unittests/stdafx.h
Normal file
9
src/modules/powerrename/unittests/stdafx.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include "targetver.h"
|
||||
|
||||
#include <atlbase.h>
|
||||
|
||||
// Headers for CppUnitTest
|
||||
#include "CppUnitTest.h"
|
||||
|
||||
10
src/modules/powerrename/unittests/targetver.h
Normal file
10
src/modules/powerrename/unittests/targetver.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
// Including SDKDDKVer.h defines the highest available Windows platform.
|
||||
|
||||
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
|
||||
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
|
||||
|
||||
#include <SDKDDKVer.h>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user