Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CProfileを拡張してテストに利用できるようにする #1546

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions sakura_core/CDataProfile.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
#define SAKURA_CDATAPROFILE_401640FD_5B27_454A_B0DE_098E1C4FAEAD_H_
#pragma once

#include "basis/SakuraBasis.h"
#include "debug/Debug2.h"
#include "util/StaticType.h"
#include "CProfile.h"

Expand Down Expand Up @@ -166,8 +168,8 @@ class CDataProfile : public CProfile{
*/
template <class T> //T=={bool, int, WORD, wchar_t, char, StringBufferW, StaticString}
bool IOProfileData(
const std::wstring& strSectionName, //!< [in] セクション名
const std::wstring& strEntryKey, //!< [in] エントリ名
std::wstring_view sectionName, //!< [in] セクション名
std::wstring_view entryKey, //!< [in] エントリ名
T& tEntryValue //!< [in,out] エントリ値
) noexcept
{
Expand All @@ -177,16 +179,17 @@ class CDataProfile : public CProfile{
bool ret = false;
if( IsReadingMode() ){
//文字列読み込み
if( GetProfileDataImp( strSectionName, strEntryKey, buf ) ){
if( GetProfileData(sectionName, entryKey, buf) ){
//Tに変換
profile_to_value(buf, &tEntryValue);
ret = true;
}
}else{
//文字列に変換
value_to_profile(tEntryValue, &buf);
ret = true; //TODO: 変換成否の反映
//文字列書き込み
ret = SetProfileDataImp( strSectionName, strEntryKey, buf );
SetProfileData(sectionName, entryKey, buf);
}
return ret;
}
Expand All @@ -208,19 +211,18 @@ class CDataProfile : public CProfile{
*/
template <> inline
bool CDataProfile::IOProfileData<std::wstring>(
const std::wstring& strSectionName, //!< [in] セクション名
const std::wstring& strEntryKey, //!< [in] エントリ名
std::wstring_view sectionName, //!< [in] セクション名
std::wstring_view entryKey, //!< [in] エントリ名
std::wstring& strEntryValue //!< [in,out] エントリ値
) noexcept
{
bool ret = false;
if( IsReadingMode() ){
//文字列読み込み
ret = GetProfileDataImp( strSectionName, strEntryKey, strEntryValue );
return GetProfileData(sectionName, entryKey, strEntryValue);
}else{
//文字列書き込み
ret = SetProfileDataImp( strSectionName, strEntryKey, strEntryValue );
SetProfileData(sectionName, entryKey, strEntryValue);
return true;
}
return ret;
}
#endif /* SAKURA_CDATAPROFILE_401640FD_5B27_454A_B0DE_098E1C4FAEAD_H_ */
77 changes: 31 additions & 46 deletions sakura_core/CProfile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@
*/
#include "StdAfx.h"
#include "CProfile.h"

#include <algorithm>
#include <map>
#include <string>
#include <string_view>
#include <vector>

#include "io/CTextStream.h"
#include "charset/CUtf8.h" // Resource読み込みに使用
#include "CEol.h"
Expand Down Expand Up @@ -313,73 +320,51 @@ bool CProfile::_WriteFile(
return true;
}

// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
// Imp //
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //

/*! エントリ値をProfileから読み込む

@retval true 成功
@retval false 失敗

@date 2003-10-22 D.S.Koba 作成
*/
bool CProfile::GetProfileDataImp(
const wstring& strSectionName, //!< [in] セクション名
const wstring& strEntryKey, //!< [in] エントリ名
wstring& strEntryValue //!< [out] エントリ値
)
bool CProfile::GetProfileData(
std::wstring_view sectionName, //!< [in] セクション名
std::wstring_view entryKey, //!< [in] エントリ名
std::wstring& strEntryValue //!< [out] エントリ値
) const
{
for(auto iter = m_ProfileData.begin(); iter != m_ProfileData.end(); iter++ ) {
if( iter->strSectionName == strSectionName ) {
auto mapiter = iter->mapEntries.find( strEntryKey );
if( iter->mapEntries.end() != mapiter ) {
strEntryValue = mapiter->second;
return true;
}
// セクション名が一致するセクションを探す
if (const auto iter = std::find_if(m_ProfileData.begin(), m_ProfileData.end(), [&sectionName](const auto& section) {return section.strSectionName == sectionName; }); iter != m_ProfileData.end()) {
// キーが一致するエントリを探す
if (const auto mapiter = iter->mapEntries.find(entryKey.data()); iter->mapEntries.end() != mapiter) {
// エントリの値をコピーする
strEntryValue = mapiter->second;
return true;
}
}
return false;
}

/*! エントリをProfileへ書き込む

@retval true 成功
@retval false 失敗(処理を入れていないのでfalseは返らない)

@date 2003-10-21 D.S.Koba 作成
*/
bool CProfile::SetProfileDataImp(
const wstring& strSectionName, //!< [in] セクション名
const wstring& strEntryKey, //!< [in] エントリ名
const wstring& strEntryValue //!< [in] エントリ値
void CProfile::SetProfileData(
std::wstring_view sectionName, //!< [in] セクション名
std::wstring_view entryKey, //!< [in] エントリ名
std::wstring_view entryValue //!< [in] エントリ値
)
{
auto iter = m_ProfileData.begin();
for(; iter != m_ProfileData.end(); iter++ ) {
if( iter->strSectionName == strSectionName ) {
//既存のセクションの場合
auto mapiter = iter->mapEntries.find( strEntryKey );
if( iter->mapEntries.end() != mapiter ) {
//既存のエントリの場合は値を上書き
mapiter->second = strEntryValue;
break;
}
else {
//既存のエントリが見つからない場合は追加
iter->mapEntries.insert( PAIR_STR_STR( strEntryKey, strEntryValue ) );
break;
}
}
// セクション名が一致するセクションがない場合、空のセクションを追加する
if (const auto iter = std::find_if(m_ProfileData.begin(), m_ProfileData.end(), [&sectionName](const auto& section) {return section.strSectionName == sectionName; }); iter == m_ProfileData.end()) {
m_ProfileData.emplace_back(Section{ sectionName.data() });
}
//既存のセクションではない場合,セクション及びエントリを追加
if( iter == m_ProfileData.end() ) {
Section Buffer;
Buffer.strSectionName = strSectionName;
Buffer.mapEntries.insert( PAIR_STR_STR( strEntryKey, strEntryValue ) );
m_ProfileData.push_back( Buffer );
// セクション名が一致するセクションを探す
if (auto iter = std::find_if(m_ProfileData.begin(), m_ProfileData.end(), [&sectionName](const auto& section) {return section.strSectionName == sectionName; }); iter != m_ProfileData.end()) {
// エントリに指定された値を書き込む
auto& sectionEntries = iter->mapEntries;
sectionEntries[entryKey.data()] = entryValue;
}
return true;
}

void CProfile::DUMP( void )
Expand Down
11 changes: 5 additions & 6 deletions sakura_core/CProfile.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@

#include <Windows.h>
#include <string>
#include <string_view>
#include <vector>
#include <map>

Expand All @@ -61,26 +62,24 @@ class CProfile
};

public:
CProfile() {}
~CProfile() {}
CProfile() = default;
virtual ~CProfile() = default;
void Init( void );
bool IsReadingMode( void ) { return m_bRead; }
void SetReadingMode( void ) { m_bRead = true; }
void SetWritingMode( void ) { m_bRead = false; }
bool ReadProfile( const WCHAR* );
bool ReadProfileRes( const WCHAR*, const WCHAR*, std::vector<std::wstring>* = NULL ); // 200/5/19 Uchi
bool WriteProfile( const WCHAR*, const WCHAR* pszComment);
bool GetProfileData(std::wstring_view sectionName, std::wstring_view entryKey, std::wstring& strEntryValue) const;
void SetProfileData(std::wstring_view sectionName, std::wstring_view entryKey, std::wstring_view entryValue);

void DUMP( void );

protected:
void ReadOneline( const wstring& line );
bool _WriteFile( const wstring& strFilename, const std::vector< wstring >& vecLine);

bool GetProfileDataImp( const wstring& strSectionName, const wstring& strEntryKey, wstring& strEntryValue);

bool SetProfileDataImp( const wstring& strSectionName, const wstring& strEntryKey, const wstring& strEntryValue );

protected:
// メンバ変数
wstring m_strProfileName; //!< 最後に読み書きしたファイル名
Expand Down
44 changes: 27 additions & 17 deletions tests/unittests/test-cdlgprofilemgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
#include "env/DLLSHAREDATA.h"
#include "_main/CCommandLine.h"
#include "_main/CControlProcess.h"
#include "CDataProfile.h"
#include "util/file.h"

/*!
Expand Down Expand Up @@ -132,12 +133,16 @@ TEST_F( CDlgProfileMgrTest, TrySelectProfile_003 )
TEST_F( CDlgProfileMgrTest, TrySelectProfile_004 )
{
// プロファイル設定を作る
SProfileSettings settings;
settings.m_szDllLanguage[0] = L'\0';
settings.m_nDefaultIndex = 3;
settings.m_vProfList = { L"保存用", L"鑑賞用", L"使用用" };
settings.m_bDefaultSelect = true;
CDlgProfileMgr::WriteProfSettings( settings );
CDataProfile cProfile;
cProfile.SetWritingMode();
cProfile.SetProfileData(L"Profile", L"szDllLanguage", L"");
cProfile.SetProfileData(L"Profile", L"nDefaultIndex", L"3");
cProfile.SetProfileData(L"Profile", L"nCount", L"3");
cProfile.SetProfileData(L"Profile", L"P[1]", L"保存用");
cProfile.SetProfileData(L"Profile", L"P[2]", L"鑑賞用");
cProfile.SetProfileData(L"Profile", L"P[3]", L"使用用");
cProfile.SetProfileData(L"Profile", L"bDefaultSelect", L"1");
cProfile.WriteProfile(profileMgrIniPath.c_str(), L"Sakura Profile ini");

// プロファイルマネージャー設定にデフォルト定義があればプロファイルは確定する
CCommandLineWrapper cCommandLine;
Expand All @@ -150,12 +155,16 @@ TEST_F( CDlgProfileMgrTest, TrySelectProfile_004 )
TEST_F( CDlgProfileMgrTest, TrySelectProfile_005 )
{
// プロファイル設定を作る
SProfileSettings settings;
settings.m_szDllLanguage[0] = L'\0';
settings.m_nDefaultIndex = 4;
settings.m_vProfList = { L"保存用", L"鑑賞用", L"使用用" };
settings.m_bDefaultSelect = true;
CDlgProfileMgr::WriteProfSettings( settings );
CDataProfile cProfile;
cProfile.SetWritingMode();
cProfile.SetProfileData(L"Profile", L"szDllLanguage", L"");
cProfile.SetProfileData(L"Profile", L"nDefaultIndex", L"4");
cProfile.SetProfileData(L"Profile", L"nCount", L"3");
cProfile.SetProfileData(L"Profile", L"P[1]", L"保存用");
cProfile.SetProfileData(L"Profile", L"P[2]", L"鑑賞用");
cProfile.SetProfileData(L"Profile", L"P[3]", L"使用用");
cProfile.SetProfileData(L"Profile", L"bDefaultSelect", L"1");
cProfile.WriteProfile(profileMgrIniPath.c_str(), L"Sakura Profile ini");

// プロファイルマネージャー設定のデフォルト定義がおかしればプロファイルは確定しない
CCommandLineWrapper cCommandLine;
Expand All @@ -168,11 +177,12 @@ TEST_F( CDlgProfileMgrTest, TrySelectProfile_005 )
TEST_F( CDlgProfileMgrTest, TrySelectProfile_006 )
{
// 空のプロファイル設定を作る
SProfileSettings settings;
settings.m_szDllLanguage[0] = L'\0';
settings.m_nDefaultIndex = -1;
settings.m_bDefaultSelect = false;
CDlgProfileMgr::WriteProfSettings( settings );
CDataProfile cProfile;
cProfile.SetWritingMode();
cProfile.SetProfileData(L"Profile", L"szDllLanguage", L"");
cProfile.SetProfileData(L"Profile", L"nDefaultIndex", L"-1");
cProfile.SetProfileData(L"Profile", L"bDefaultSelect", L"0");
cProfile.WriteProfile(profileMgrIniPath.c_str(), L"Sakura Profile ini");

// プロファイルマネージャー設定が空定義ならプロファイルは確定しない
CCommandLineWrapper cCommandLine;
Expand Down
Loading