Index: src/libchcore/Tests/TestsTConfig.cpp =================================================================== diff -u -N -r09f1dd01c80a2c14e7b3c8531356a60ce5a6a801 -ra4635addad389b9e117679437a3e1b64a739ea96 --- src/libchcore/Tests/TestsTConfig.cpp (.../TestsTConfig.cpp) (revision 09f1dd01c80a2c14e7b3c8531356a60ce5a6a801) +++ src/libchcore/Tests/TestsTConfig.cpp (.../TestsTConfig.cpp) (revision a4635addad389b9e117679437a3e1b64a739ea96) @@ -1,659 +1,659 @@ -#include "stdafx.h" -#include "gtest/gtest.h" -#include "gmock/gmock.h" -#include -#include -#include -#include -#include "../TConfig.h" -#include "../TStringArray.h" -#include "../TConfigArray.h" - -using namespace chcore; - -namespace -{ - std::wstring GetTmpPath() - { - TCHAR szPath[_MAX_PATH]; - GetTempPath(_MAX_PATH, szPath); - - TCHAR szFilename[_MAX_PATH]; - GetTempFileName(szPath, _T("TempCfg"), 0, szFilename); - - return szFilename; - } -} - -// fixtures -class FileWithConfigurationFixture : public ::testing::Test -{ -protected: - virtual void SetUp() - { - m_strTempFilePath = GetTmpPath(); - - std::wofstream outFile(m_strTempFilePath.c_str(), std::wofstream::out | std::wofstream::binary); - - std::locale utf8locale(std::locale(), new std::codecvt_utf8); - outFile.imbue(utf8locale); - - std::wstring wstrData = - L"\ -\ - \ - 30000\ - \ - \ - true\ - <WINDOWS>\\media\\chord.wav\ - <WINDOWS>\\\x597D\x8FD0\\ding.wav\ - \ - \ - c:\\Windows\\System32\ - d:\\Movies\ - x:\\Music\ - s:\\projects\\ch-rw\ - \ - \ - \ - \ - <WINDOWS>\\FirstPath\ - FirstName\ - \ - \ - <WINDOWS>\\SecondPath\ - SecondName\ - \ - \ - \ -"; - - outFile << wstrData; - outFile.flush(); - } - - virtual void TearDown() - { - DeleteFile(m_strTempFilePath.c_str()); - } - - std::wstring m_strTempFilePath; -}; - -class InitializedConfigFixture : public ::testing::Test -{ -protected: - virtual void SetUp() - { - m_strInputXmlString = - L"\ -\ - \ - 30000\ - \ - \ - true\ - <WINDOWS>\\media\\chord.wav\ - <WINDOWS>\\\x597D\x8FD0\\ding.wav\ - \ - \ - c:\\Windows\\System32\ - d:\\Movies\ - x:\\Music\ - s:\\projects\\ch-rw\ - \ - \ - \ - \ - <WINDOWS>\\FirstPath\ - FirstName\ - \ - \ - <WINDOWS>\\SecondPath\ - SecondName\ - \ - \ - \ -"; - - m_cfg.ReadFromString(m_strInputXmlString); - } - - TString m_strInputXmlString; - TConfig m_cfg; -}; - -/////////////////////////////////////////////////////////////////////////// -// read from/write to file - -TEST_F(FileWithConfigurationFixture, ReadFromFile) -{ - TConfig cfg; - cfg.Read(m_strTempFilePath.c_str()); - - EXPECT_EQ(true, cfg.GetBool(_T("CHConfig.Core.Notifications.Sounds.Enable"), false)); - EXPECT_EQ(30000, cfg.GetInt(_T("CHConfig.Core.AutosaveInterval"), 0)); - EXPECT_EQ(TString(_T("\\\x597D\x8FD0\\ding.wav")), cfg.GetString(_T("CHConfig.Core.Notifications.Sounds.FinishedSoundPath"), _T(""))); -} - -TEST(TConfigTests, WriteToFile) -{ - TConfig cfg; - cfg.SetValue(_T("CHConfig.Core.Notifications.Sounds.Enable"), true); - cfg.SetValue(_T("CHConfig.Core.AutosaveInterval"), 10000); - cfg.SetValue(_T("CHConfig.Core.Notifications.Sounds.FinishedSoundPath"), _T("c:\\Users\\\x597D\x8FD0")); - - std::wstring strPath(GetTmpPath()); - cfg.SetFilePath(strPath.c_str()); - - cfg.Write(); - - std::wstring wstrData; - std::wifstream inFile(strPath.c_str(), std::wofstream::in | std::wofstream::binary); - - std::locale utf8locale(std::locale(), new std::codecvt_utf8); - inFile.imbue(utf8locale); - - std::wstringstream wstrStream; - wstrStream << inFile.rdbuf(); - - wstrData = wstrStream.str(); - - DeleteFile(strPath.c_str()); - - boost::replace_all(wstrData, _T("\r\n"), _T("\n")); - - EXPECT_EQ(_T("\n\ -10000truec:\\Users\\\x597D\x8FD0"), -wstrData); -} - -/////////////////////////////////////////////////////////////////////////// -// store in/load from string -TEST_F(InitializedConfigFixture, ReadFromString) -{ - EXPECT_EQ(true, m_cfg.GetBool(_T("CHConfig.Core.Notifications.Sounds.Enable"), false)); - EXPECT_EQ(30000, m_cfg.GetInt(_T("CHConfig.Core.AutosaveInterval"), 0)); - EXPECT_EQ(TString(_T("\\\x597D\x8FD0\\ding.wav")), m_cfg.GetString(_T("CHConfig.Core.Notifications.Sounds.FinishedSoundPath"), _T(""))); -} - -TEST(TConfigTests, WriteToString) -{ - TConfig cfg; - cfg.SetValue(_T("CHConfig.Core.Notifications.Sounds.Enable"), true); - cfg.SetValue(_T("CHConfig.Core.AutosaveInterval"), 10000); - cfg.SetValue(_T("CHConfig.Core.Notifications.Sounds.FinishedSoundPath"), _T("c:\\Users\\NewUser")); - - TString strData; - cfg.WriteToString(strData); - - EXPECT_EQ(TString(_T("\n\ -10000truec:\\Users\\NewUser")), strData); -} - -/////////////////////////////////////////////////////////////////////////// -// value get/set - -// bool - -TEST(TConfigTests, GetSetBool) -{ - TConfig cfg; - - // store data in config - cfg.SetValue(_T("Root.Node.Value1"), true); - cfg.SetValue(_T("Root.Node.Value2"), false); - - // check if stored successfully (typed get) - EXPECT_EQ(true, cfg.GetBool(_T("Root.Node.Value1"))); - EXPECT_EQ(false, cfg.GetBool(_T("Root.Node.Value2"))); - - // check if stored successfully (GetValue) - bool bValue = false; - cfg.GetValue(_T("Root.Node.Value1"), bValue); - EXPECT_EQ(true, bValue); - cfg.GetValue(_T("Root.Node.Value2"), bValue); - EXPECT_EQ(false, bValue); -} - -TEST(TConfigTests, GetSetBoolExport) -{ - TConfig cfg; - - TString strXmlData(_T("\n\ -truefalse")); - - // store in string - cfg.ReadFromString(strXmlData); - - EXPECT_EQ(true, cfg.GetBool(_T("Root.Node.Value1"))); - EXPECT_EQ(false, cfg.GetBool(_T("Root.Node.Value2"))); - - TString strWriteXmlData; - cfg.WriteToString(strWriteXmlData); - - EXPECT_EQ(strXmlData, strWriteXmlData); -} - -/////////////////////////////////////////////////////////////////////////// -TEST(TConfigTests, GetSetInt) -{ - TConfig cfg; - - // store data in config - cfg.SetValue(_T("Root.Node.Value1"), 2147483647); - cfg.SetValue(_T("Root.Node.Value2"), (-2147483647 - 1)); - - // check if stored successfully (typed get) - EXPECT_EQ(2147483647, cfg.GetInt(_T("Root.Node.Value1"))); - EXPECT_EQ((-2147483647 - 1), cfg.GetInt(_T("Root.Node.Value2"))); - - // check if stored successfully (GetValue) - int iValue = 0; - cfg.GetValue(_T("Root.Node.Value1"), iValue); - EXPECT_EQ(2147483647, iValue); - cfg.GetValue(_T("Root.Node.Value2"), iValue); - EXPECT_EQ((-2147483647 - 1), iValue); -} - -TEST(TConfigTests, GetSetIntExport) -{ - TConfig cfg; - - TString strXmlData(_T("\n\ -2147483647-2147483648")); - - // store in string - cfg.ReadFromString(strXmlData); - - EXPECT_EQ(2147483647, cfg.GetInt(_T("Root.Node.Value1"))); - EXPECT_EQ((-2147483647 - 1), cfg.GetInt(_T("Root.Node.Value2"))); - - TString strWriteXmlData; - cfg.WriteToString(strWriteXmlData); - - EXPECT_EQ(strXmlData, strWriteXmlData); -} - -/////////////////////////////////////////////////////////////////////////// -TEST(TConfigTests, GetSetUInt) -{ - TConfig cfg; - - // store data in config - cfg.SetValue(_T("Root.Node.Value1"), (unsigned int)1489); - cfg.SetValue(_T("Root.Node.Value2"), (unsigned int)4294967295); - - // check if stored successfully (typed get) - EXPECT_EQ(1489, cfg.GetUInt(_T("Root.Node.Value1"))); - EXPECT_EQ(4294967295, cfg.GetUInt(_T("Root.Node.Value2"))); - - // check if stored successfully (GetValue) - unsigned int value = 0; - cfg.GetValue(_T("Root.Node.Value1"), value); - EXPECT_EQ(1489, value); - cfg.GetValue(_T("Root.Node.Value2"), value); - EXPECT_EQ(4294967295, value); -} - -TEST(TConfigTests, GetSetUIntExport) -{ - TConfig cfg; - - TString strXmlData(_T("\n\ -14894294967295")); - - // store in string - cfg.ReadFromString(strXmlData); - - EXPECT_EQ(1489, cfg.GetUInt(_T("Root.Node.Value1"))); - EXPECT_EQ(4294967295, cfg.GetUInt(_T("Root.Node.Value2"))); - - TString strWriteXmlData; - cfg.WriteToString(strWriteXmlData); - - EXPECT_EQ(strXmlData, strWriteXmlData); -} - -/////////////////////////////////////////////////////////////////////////// -TEST(TConfigTests, GetSetLongLong) -{ - TConfig cfg; - - // store data in config - cfg.SetValue(_T("Root.Node.Value1"), (long long)9223372036854775807); - cfg.SetValue(_T("Root.Node.Value2"), (long long)(-9223372036854775807 - 1)); - - // check if stored successfully (typed get) - EXPECT_EQ((long long)9223372036854775807, cfg.GetLongLong(_T("Root.Node.Value1"))); - EXPECT_EQ((long long)(-9223372036854775807 - 1), cfg.GetLongLong(_T("Root.Node.Value2"))); - - // check if stored successfully (GetValue) - long long value = 0; - cfg.GetValue(_T("Root.Node.Value1"), value); - EXPECT_EQ((long long)9223372036854775807, value); - cfg.GetValue(_T("Root.Node.Value2"), value); - EXPECT_EQ((long long)(-9223372036854775807 - 1), value); -} - -TEST(TConfigTests, GetSetLongLongExport) -{ - TConfig cfg; - - TString strXmlData(_T("\n\ -9223372036854775807-9223372036854775808")); - - // store in string - cfg.ReadFromString(strXmlData); - - EXPECT_EQ((long long)9223372036854775807, cfg.GetLongLong(_T("Root.Node.Value1"))); - EXPECT_EQ((long long)(-9223372036854775807 - 1), cfg.GetLongLong(_T("Root.Node.Value2"))); - - TString strWriteXmlData; - cfg.WriteToString(strWriteXmlData); - - EXPECT_EQ(strXmlData, strWriteXmlData); -} - -/////////////////////////////////////////////////////////////////////////// -TEST(TConfigTests, GetSetULongLong) -{ - TConfig cfg; - - // store data in config - cfg.SetValue(_T("Root.Node.Value1"), (unsigned long long)1489); - cfg.SetValue(_T("Root.Node.Value2"), (unsigned long long)18446744073709551615); - - // check if stored successfully (typed get) - EXPECT_EQ((unsigned long long)1489, cfg.GetULongLong(_T("Root.Node.Value1"))); - EXPECT_EQ((unsigned long long)18446744073709551615, cfg.GetULongLong(_T("Root.Node.Value2"))); - - // check if stored successfully (GetValue) - unsigned long long value = 0; - cfg.GetValue(_T("Root.Node.Value1"), value); - EXPECT_EQ((unsigned long long)1489, value); - cfg.GetValue(_T("Root.Node.Value2"), value); - EXPECT_EQ((unsigned long long)18446744073709551615, value); -} - -TEST(TConfigTests, GetSetULongLongExport) -{ - TConfig cfg; - - TString strXmlData(_T("\n\ -148918446744073709551615")); - - // store in string - cfg.ReadFromString(strXmlData); - - EXPECT_EQ((unsigned long long)1489, cfg.GetULongLong(_T("Root.Node.Value1"))); - EXPECT_EQ((unsigned long long)18446744073709551615, cfg.GetULongLong(_T("Root.Node.Value2"))); - - TString strWriteXmlData; - cfg.WriteToString(strWriteXmlData); - - EXPECT_EQ(strXmlData, strWriteXmlData); -} - -/////////////////////////////////////////////////////////////////////////// -TEST(TConfigTests, GetSetDouble) -{ - TConfig cfg; - - // store data in config - cfg.SetValue(_T("Root.Node.Value1"), (double)0.0); - cfg.SetValue(_T("Root.Node.Value2"), 1.7976931348623158e+308); - - // check if stored successfully (typed get) - EXPECT_DOUBLE_EQ(0.0, cfg.GetDouble(_T("Root.Node.Value1"))); - EXPECT_DOUBLE_EQ(1.7976931348623158e+308, cfg.GetDouble(_T("Root.Node.Value2"))); - - // check if stored successfully (GetValue) - double value = 0; - cfg.GetValue(_T("Root.Node.Value1"), value); - EXPECT_DOUBLE_EQ(0.0, value); - cfg.GetValue(_T("Root.Node.Value2"), value); - EXPECT_DOUBLE_EQ(1.7976931348623158e+308, value); -} - -TEST(TConfigTests, GetSetDoubleExport) -{ - TConfig cfg; - - TString strXmlData(_T("\n\ -01.7976931348623158e+308")); - - // store in string - cfg.ReadFromString(strXmlData); - - EXPECT_DOUBLE_EQ(0.0, cfg.GetDouble(_T("Root.Node.Value1"))); - EXPECT_DOUBLE_EQ(1.7976931348623158e+308, cfg.GetDouble(_T("Root.Node.Value2"))); - - TString strWriteXmlData; - cfg.WriteToString(strWriteXmlData); - - EXPECT_EQ(strXmlData, strWriteXmlData); -} - -/////////////////////////////////////////////////////////////////////////// -TEST(TConfigTests, GetSetString) -{ - TConfig cfg; - - // store data in config - cfg.SetValue(_T("Root.Node.Value1"), _T("Some basic string")); - cfg.SetValue(_T("Root.Node.Value2"), L"!@#$%^&*()[]\\/<>,.QWERTYqwerty\x2021"); - - // check if stored successfully (typed get) - EXPECT_EQ(TString(_T("Some basic string")), cfg.GetString(_T("Root.Node.Value1"))); - EXPECT_EQ(TString(L"!@#$%^&*()[]\\/<>,.QWERTYqwerty\x2021"), cfg.GetString(_T("Root.Node.Value2"))); - - // check if stored successfully (GetValue) - TString value; - cfg.GetValue(_T("Root.Node.Value1"), value); - EXPECT_EQ(TString(_T("Some basic string")), value); - cfg.GetValue(_T("Root.Node.Value2"), value); - EXPECT_EQ(TString(L"!@#$%^&*()[]\\/<>,.QWERTYqwerty\x2021"), value); -} - -TEST(TConfigTests, GetSetStringExport) -{ - TConfig cfg; - - TString strXmlData(_T("\n\ -Some basic string!@#$%^&*()[]\\/<>,.QWERTYqwerty\x2021")); - - // store in string - cfg.ReadFromString(strXmlData); - - EXPECT_EQ(TString(_T("Some basic string")), cfg.GetString(_T("Root.Node.Value1"))); - EXPECT_EQ(TString(L"!@#$%^&*()[]\\/<>,.QWERTYqwerty\x2021"), cfg.GetString(_T("Root.Node.Value2"))); - - TString strWriteXmlData; - cfg.WriteToString(strWriteXmlData); - - EXPECT_EQ(strXmlData, strWriteXmlData); -} - -/////////////////////////////////////////////////////////////////////////// -TEST(TConfigTests, GetSetPath) -{ - TConfig cfg; - - // store data in config - cfg.SetValue(_T("Root.Node.Value1"), _T("c:\\Windows\\System32")); - cfg.SetValue(_T("Root.Node.Value2"), _T("\\\\machine\\share\\SomeFile.dat")); - - // check if stored successfully (typed get) - EXPECT_EQ(PathFromString(_T("c:\\Windows\\System32")), cfg.GetPath(_T("Root.Node.Value1"))); - EXPECT_EQ(PathFromString(_T("\\\\machine\\share\\SomeFile.dat")), cfg.GetPath(_T("Root.Node.Value2"))); - - // check if stored successfully (GetValue) - TSmartPath value; - cfg.GetValue(_T("Root.Node.Value1"), value); - EXPECT_EQ(PathFromString(_T("c:\\Windows\\System32")), value); - cfg.GetValue(_T("Root.Node.Value2"), value); - EXPECT_EQ(PathFromString(_T("\\\\machine\\share\\SomeFile.dat")), value); -} - -TEST(TConfigTests, GetSetPathExport) -{ - TConfig cfg; - - TString strXmlData(_T("\n\ -c:\\Windows\\System32\\\\machine\\share\\SomeFile.dat")); - - // store in string - cfg.ReadFromString(strXmlData); - - EXPECT_EQ(PathFromString(_T("c:\\Windows\\System32")), cfg.GetPath(_T("Root.Node.Value1"))); - EXPECT_EQ(PathFromString(_T("\\\\machine\\share\\SomeFile.dat")), cfg.GetPath(_T("Root.Node.Value2"))); - - TString strWriteXmlData; - cfg.WriteToString(strWriteXmlData); - - EXPECT_EQ(strXmlData, strWriteXmlData); -} - -/////////////////////////////////////////////////////////////////////////// -TEST(TConfigTests, GetSetStringArray) -{ - TConfig cfg; - - TStringArray arrString; - arrString.Add(_T("String1")); - arrString.Add(_T("SampleStringPath")); - arrString.Add(_T("!@#$%^&*()")); - arrString.Add(_T("")); - - // store data in config - cfg.SetValue(_T("Root.Node.Values.Node"), arrString); - - // check if stored successfully (typed get) - TStringArray arrRead; - cfg.GetValue(_T("Root.Node.Values.Node"), arrRead); - - EXPECT_EQ(arrString.GetCount(), arrRead.GetCount()); - EXPECT_EQ(arrString.GetAt(0), arrRead.GetAt(0)); - EXPECT_EQ(arrString.GetAt(1), arrRead.GetAt(1)); - EXPECT_EQ(arrString.GetAt(2), arrRead.GetAt(2)); - EXPECT_EQ(arrString.GetAt(3), arrRead.GetAt(3)); -} - -TEST_F(InitializedConfigFixture, GetSetStringArrayImport) -{ - TStringArray arrRead; - m_cfg.GetValue(_T("CHConfig.Core.Notifications.PathList.Path"), arrRead); - - EXPECT_EQ(arrRead.GetCount(), 4); - EXPECT_EQ(TString(_T("c:\\Windows\\System32")), arrRead.GetAt(0)); - EXPECT_EQ(TString(_T("d:\\Movies")), arrRead.GetAt(1)); - EXPECT_EQ(TString(_T("x:\\Music")), arrRead.GetAt(2)); - EXPECT_EQ(TString(_T("s:\\projects\\ch-rw")), arrRead.GetAt(3)); -} - -TEST(TConfigTests, GetSetStringArrayExport) -{ - TConfig cfg; - - TStringArray arrString; - arrString.Add(_T("String1")); - arrString.Add(_T("SampleStringPath")); - arrString.Add(_T("!@#$%^&*()")); - arrString.Add(_T("")); - - // store data in config - cfg.SetValue(_T("Root.Node.Values.Node"), arrString); - - // store in string - TString wstrData; - cfg.WriteToString(wstrData); - - EXPECT_EQ(TString(_T("\n\ -String1SampleStringPath!@#$%^&*()")), wstrData); -} - -/////////////////////////////////////////////////////////////////////////// -TEST_F(InitializedConfigFixture, CompositeObjectsReadWriteString) -{ - TString wstrWithDeletion; - m_cfg.WriteToString(wstrWithDeletion); - - EXPECT_EQ(TString(_T("\n\ -30000\ -FirstName<WINDOWS>\\FirstPathSecondName<WINDOWS>\\SecondPath\ -c:\\Windows\\System32d:\\Moviesx:\\Musics:\\projects\\ch-rw\ -true<WINDOWS>\\media\\chord.wav\ -<WINDOWS>\\\x597D\x8FD0\\ding.wav")), wstrWithDeletion); -} - -/////////////////////////////////////////////////////////////////////////// -TEST_F(InitializedConfigFixture, DeleteNodeTest) -{ - m_cfg.DeleteNode(_T("CHConfig.Core.Notifications")); - - TString wstrWithDeletion; - m_cfg.WriteToString(wstrWithDeletion); - - EXPECT_EQ(TString(_T("\n\ -30000FirstName<WINDOWS>\\FirstPath\ -SecondName<WINDOWS>\\SecondPath")), wstrWithDeletion); -} - -/////////////////////////////////////////////////////////////////////////// -TEST_F(InitializedConfigFixture, ExtractConfig) -{ - TConfig cfgSub; - - m_cfg.ExtractSubConfig(_T("CHConfig.Core.Notifications.Sounds"), cfgSub); - EXPECT_EQ(true, cfgSub.GetBool(_T("Enable"))); - EXPECT_EQ(TString(_T("\\media\\chord.wav")), cfgSub.GetString(_T("ErrorSoundPath"))); - EXPECT_EQ(TString(_T("\\\x597D\x8FD0\\ding.wav")), cfgSub.GetString(_T("FinishedSoundPath"))); -} - -TEST_F(InitializedConfigFixture, ExtractMultipleConfigs) -{ - TConfigArray cfgSubArray; - - m_cfg.ExtractMultiSubConfigs(_T("CHConfig.Core.CompositeObjects.Object"), cfgSubArray); - - EXPECT_EQ(2, cfgSubArray.GetCount()); - - EXPECT_EQ(TString(_T("FirstName")), cfgSubArray.GetAt(0).GetString(_T("Name"))); - EXPECT_EQ(TString(_T("\\FirstPath")), cfgSubArray.GetAt(0).GetString(_T("Path"))); - EXPECT_EQ(TString(_T("SecondName")), cfgSubArray.GetAt(1).GetString(_T("Name"))); - EXPECT_EQ(TString(_T("\\SecondPath")), cfgSubArray.GetAt(1).GetString(_T("Path"))); -} - -TEST(TConfigTests, PutSubConfig) -{ - TConfig mainCfg; - - TConfig cfgSub; - cfgSub.SetValue(_T("Node1"), true); - cfgSub.SetValue(_T("NameNode"), _T("TestNode")); - - mainCfg.PutSubConfig(_T("Root.NodeSet"), cfgSub); - - EXPECT_EQ(true, mainCfg.GetBool(_T("Root.NodeSet.Node1"))); - EXPECT_EQ(TString(_T("TestNode")), mainCfg.GetString(_T("Root.NodeSet.NameNode"))); -} - -TEST(TConfigTests, AddSubConfig) -{ - TConfig mainCfg; - - TConfig cfgSub; - cfgSub.SetValue(_T("Node1"), true); - cfgSub.SetValue(_T("NameNode"), _T("TestNode")); - - mainCfg.AddSubConfig(_T("Root.NodeSet.Node"), cfgSub); - mainCfg.AddSubConfig(_T("Root.NodeSet.Node"), cfgSub); - - TString strXml; - mainCfg.WriteToString(strXml); - - EXPECT_EQ(TString(_T("\n\ -TestNodetrueTestNodetrue")), strXml); -} +#include "stdafx.h" +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include +#include +#include +#include +#include "../TConfig.h" +#include "../TStringArray.h" +#include "../TConfigArray.h" + +using namespace chcore; + +namespace +{ + std::wstring GetTmpPath() + { + TCHAR szPath[_MAX_PATH]; + GetTempPath(_MAX_PATH, szPath); + + TCHAR szFilename[_MAX_PATH]; + GetTempFileName(szPath, _T("TempCfg"), 0, szFilename); + + return szFilename; + } +} + +// fixtures +class FileWithConfigurationFixture : public ::testing::Test +{ +protected: + virtual void SetUp() + { + m_strTempFilePath = GetTmpPath(); + + std::wofstream outFile(m_strTempFilePath.c_str(), std::wofstream::out | std::wofstream::binary); + + std::locale utf8locale(std::locale(), new std::codecvt_utf8); + outFile.imbue(utf8locale); + + std::wstring wstrData = + L"\ +\ + \ + 30000\ + \ + \ + true\ + <WINDOWS>\\media\\chord.wav\ + <WINDOWS>\\\x597D\x8FD0\\ding.wav\ + \ + \ + c:\\Windows\\System32\ + d:\\Movies\ + x:\\Music\ + s:\\projects\\ch-rw\ + \ + \ + \ + \ + <WINDOWS>\\FirstPath\ + FirstName\ + \ + \ + <WINDOWS>\\SecondPath\ + SecondName\ + \ + \ + \ +"; + + outFile << wstrData; + outFile.flush(); + } + + virtual void TearDown() + { + DeleteFile(m_strTempFilePath.c_str()); + } + + std::wstring m_strTempFilePath; +}; + +class InitializedConfigFixture : public ::testing::Test +{ +protected: + virtual void SetUp() + { + m_strInputXmlString = + L"\ +\ + \ + 30000\ + \ + \ + true\ + <WINDOWS>\\media\\chord.wav\ + <WINDOWS>\\\x597D\x8FD0\\ding.wav\ + \ + \ + c:\\Windows\\System32\ + d:\\Movies\ + x:\\Music\ + s:\\projects\\ch-rw\ + \ + \ + \ + \ + <WINDOWS>\\FirstPath\ + FirstName\ + \ + \ + <WINDOWS>\\SecondPath\ + SecondName\ + \ + \ + \ +"; + + m_cfg.ReadFromString(m_strInputXmlString); + } + + TString m_strInputXmlString; + TConfig m_cfg; +}; + +/////////////////////////////////////////////////////////////////////////// +// read from/write to file + +TEST_F(FileWithConfigurationFixture, ReadFromFile) +{ + TConfig cfg; + cfg.Read(m_strTempFilePath.c_str()); + + EXPECT_EQ(true, cfg.GetBool(_T("CHConfig.Core.Notifications.Sounds.Enable"), false)); + EXPECT_EQ(30000, cfg.GetInt(_T("CHConfig.Core.AutosaveInterval"), 0)); + EXPECT_EQ(TString(_T("\\\x597D\x8FD0\\ding.wav")), cfg.GetString(_T("CHConfig.Core.Notifications.Sounds.FinishedSoundPath"), _T(""))); +} + +TEST(TConfigTests, WriteToFile) +{ + TConfig cfg; + cfg.SetValue(_T("CHConfig.Core.Notifications.Sounds.Enable"), true); + cfg.SetValue(_T("CHConfig.Core.AutosaveInterval"), 10000); + cfg.SetValue(_T("CHConfig.Core.Notifications.Sounds.FinishedSoundPath"), _T("c:\\Users\\\x597D\x8FD0")); + + std::wstring strPath(GetTmpPath()); + cfg.SetFilePath(strPath.c_str()); + + cfg.Write(); + + std::wstring wstrData; + std::wifstream inFile(strPath.c_str(), std::wofstream::in | std::wofstream::binary); + + std::locale utf8locale(std::locale(), new std::codecvt_utf8); + inFile.imbue(utf8locale); + + std::wstringstream wstrStream; + wstrStream << inFile.rdbuf(); + + wstrData = wstrStream.str(); + + DeleteFile(strPath.c_str()); + + boost::replace_all(wstrData, _T("\r\n"), _T("\n")); + + EXPECT_EQ(_T("\n\ +10000truec:\\Users\\\x597D\x8FD0"), +wstrData); +} + +/////////////////////////////////////////////////////////////////////////// +// store in/load from string +TEST_F(InitializedConfigFixture, ReadFromString) +{ + EXPECT_EQ(true, m_cfg.GetBool(_T("CHConfig.Core.Notifications.Sounds.Enable"), false)); + EXPECT_EQ(30000, m_cfg.GetInt(_T("CHConfig.Core.AutosaveInterval"), 0)); + EXPECT_EQ(TString(_T("\\\x597D\x8FD0\\ding.wav")), m_cfg.GetString(_T("CHConfig.Core.Notifications.Sounds.FinishedSoundPath"), _T(""))); +} + +TEST(TConfigTests, WriteToString) +{ + TConfig cfg; + cfg.SetValue(_T("CHConfig.Core.Notifications.Sounds.Enable"), true); + cfg.SetValue(_T("CHConfig.Core.AutosaveInterval"), 10000); + cfg.SetValue(_T("CHConfig.Core.Notifications.Sounds.FinishedSoundPath"), _T("c:\\Users\\NewUser")); + + TString strData; + cfg.WriteToString(strData); + + EXPECT_EQ(TString(_T("\n\ +10000truec:\\Users\\NewUser")), strData); +} + +/////////////////////////////////////////////////////////////////////////// +// value get/set + +// bool + +TEST(TConfigTests, GetSetBool) +{ + TConfig cfg; + + // store data in config + cfg.SetValue(_T("Root.Node.Value1"), true); + cfg.SetValue(_T("Root.Node.Value2"), false); + + // check if stored successfully (typed get) + EXPECT_EQ(true, cfg.GetBool(_T("Root.Node.Value1"))); + EXPECT_EQ(false, cfg.GetBool(_T("Root.Node.Value2"))); + + // check if stored successfully (GetValue) + bool bValue = false; + cfg.GetValue(_T("Root.Node.Value1"), bValue); + EXPECT_EQ(true, bValue); + cfg.GetValue(_T("Root.Node.Value2"), bValue); + EXPECT_EQ(false, bValue); +} + +TEST(TConfigTests, GetSetBoolExport) +{ + TConfig cfg; + + TString strXmlData(_T("\n\ +truefalse")); + + // store in string + cfg.ReadFromString(strXmlData); + + EXPECT_EQ(true, cfg.GetBool(_T("Root.Node.Value1"))); + EXPECT_EQ(false, cfg.GetBool(_T("Root.Node.Value2"))); + + TString strWriteXmlData; + cfg.WriteToString(strWriteXmlData); + + EXPECT_EQ(strXmlData, strWriteXmlData); +} + +/////////////////////////////////////////////////////////////////////////// +TEST(TConfigTests, GetSetInt) +{ + TConfig cfg; + + // store data in config + cfg.SetValue(_T("Root.Node.Value1"), 2147483647); + cfg.SetValue(_T("Root.Node.Value2"), (-2147483647 - 1)); + + // check if stored successfully (typed get) + EXPECT_EQ(2147483647, cfg.GetInt(_T("Root.Node.Value1"))); + EXPECT_EQ((-2147483647 - 1), cfg.GetInt(_T("Root.Node.Value2"))); + + // check if stored successfully (GetValue) + int iValue = 0; + cfg.GetValue(_T("Root.Node.Value1"), iValue); + EXPECT_EQ(2147483647, iValue); + cfg.GetValue(_T("Root.Node.Value2"), iValue); + EXPECT_EQ((-2147483647 - 1), iValue); +} + +TEST(TConfigTests, GetSetIntExport) +{ + TConfig cfg; + + TString strXmlData(_T("\n\ +2147483647-2147483648")); + + // store in string + cfg.ReadFromString(strXmlData); + + EXPECT_EQ(2147483647, cfg.GetInt(_T("Root.Node.Value1"))); + EXPECT_EQ((-2147483647 - 1), cfg.GetInt(_T("Root.Node.Value2"))); + + TString strWriteXmlData; + cfg.WriteToString(strWriteXmlData); + + EXPECT_EQ(strXmlData, strWriteXmlData); +} + +/////////////////////////////////////////////////////////////////////////// +TEST(TConfigTests, GetSetUInt) +{ + TConfig cfg; + + // store data in config + cfg.SetValue(_T("Root.Node.Value1"), (unsigned int)1489); + cfg.SetValue(_T("Root.Node.Value2"), (unsigned int)4294967295); + + // check if stored successfully (typed get) + EXPECT_EQ(1489, cfg.GetUInt(_T("Root.Node.Value1"))); + EXPECT_EQ(4294967295, cfg.GetUInt(_T("Root.Node.Value2"))); + + // check if stored successfully (GetValue) + unsigned int value = 0; + cfg.GetValue(_T("Root.Node.Value1"), value); + EXPECT_EQ(1489, value); + cfg.GetValue(_T("Root.Node.Value2"), value); + EXPECT_EQ(4294967295, value); +} + +TEST(TConfigTests, GetSetUIntExport) +{ + TConfig cfg; + + TString strXmlData(_T("\n\ +14894294967295")); + + // store in string + cfg.ReadFromString(strXmlData); + + EXPECT_EQ(1489, cfg.GetUInt(_T("Root.Node.Value1"))); + EXPECT_EQ(4294967295, cfg.GetUInt(_T("Root.Node.Value2"))); + + TString strWriteXmlData; + cfg.WriteToString(strWriteXmlData); + + EXPECT_EQ(strXmlData, strWriteXmlData); +} + +/////////////////////////////////////////////////////////////////////////// +TEST(TConfigTests, GetSetLongLong) +{ + TConfig cfg; + + // store data in config + cfg.SetValue(_T("Root.Node.Value1"), (long long)9223372036854775807); + cfg.SetValue(_T("Root.Node.Value2"), (long long)(-9223372036854775807 - 1)); + + // check if stored successfully (typed get) + EXPECT_EQ((long long)9223372036854775807, cfg.GetLongLong(_T("Root.Node.Value1"))); + EXPECT_EQ((long long)(-9223372036854775807 - 1), cfg.GetLongLong(_T("Root.Node.Value2"))); + + // check if stored successfully (GetValue) + long long value = 0; + cfg.GetValue(_T("Root.Node.Value1"), value); + EXPECT_EQ((long long)9223372036854775807, value); + cfg.GetValue(_T("Root.Node.Value2"), value); + EXPECT_EQ((long long)(-9223372036854775807 - 1), value); +} + +TEST(TConfigTests, GetSetLongLongExport) +{ + TConfig cfg; + + TString strXmlData(_T("\n\ +9223372036854775807-9223372036854775808")); + + // store in string + cfg.ReadFromString(strXmlData); + + EXPECT_EQ((long long)9223372036854775807, cfg.GetLongLong(_T("Root.Node.Value1"))); + EXPECT_EQ((long long)(-9223372036854775807 - 1), cfg.GetLongLong(_T("Root.Node.Value2"))); + + TString strWriteXmlData; + cfg.WriteToString(strWriteXmlData); + + EXPECT_EQ(strXmlData, strWriteXmlData); +} + +/////////////////////////////////////////////////////////////////////////// +TEST(TConfigTests, GetSetULongLong) +{ + TConfig cfg; + + // store data in config + cfg.SetValue(_T("Root.Node.Value1"), (unsigned long long)1489); + cfg.SetValue(_T("Root.Node.Value2"), (unsigned long long)18446744073709551615); + + // check if stored successfully (typed get) + EXPECT_EQ((unsigned long long)1489, cfg.GetULongLong(_T("Root.Node.Value1"))); + EXPECT_EQ((unsigned long long)18446744073709551615, cfg.GetULongLong(_T("Root.Node.Value2"))); + + // check if stored successfully (GetValue) + unsigned long long value = 0; + cfg.GetValue(_T("Root.Node.Value1"), value); + EXPECT_EQ((unsigned long long)1489, value); + cfg.GetValue(_T("Root.Node.Value2"), value); + EXPECT_EQ((unsigned long long)18446744073709551615, value); +} + +TEST(TConfigTests, GetSetULongLongExport) +{ + TConfig cfg; + + TString strXmlData(_T("\n\ +148918446744073709551615")); + + // store in string + cfg.ReadFromString(strXmlData); + + EXPECT_EQ((unsigned long long)1489, cfg.GetULongLong(_T("Root.Node.Value1"))); + EXPECT_EQ((unsigned long long)18446744073709551615, cfg.GetULongLong(_T("Root.Node.Value2"))); + + TString strWriteXmlData; + cfg.WriteToString(strWriteXmlData); + + EXPECT_EQ(strXmlData, strWriteXmlData); +} + +/////////////////////////////////////////////////////////////////////////// +TEST(TConfigTests, GetSetDouble) +{ + TConfig cfg; + + // store data in config + cfg.SetValue(_T("Root.Node.Value1"), (double)0.0); + cfg.SetValue(_T("Root.Node.Value2"), 1.7976931348623158e+308); + + // check if stored successfully (typed get) + EXPECT_DOUBLE_EQ(0.0, cfg.GetDouble(_T("Root.Node.Value1"))); + EXPECT_DOUBLE_EQ(1.7976931348623158e+308, cfg.GetDouble(_T("Root.Node.Value2"))); + + // check if stored successfully (GetValue) + double value = 0; + cfg.GetValue(_T("Root.Node.Value1"), value); + EXPECT_DOUBLE_EQ(0.0, value); + cfg.GetValue(_T("Root.Node.Value2"), value); + EXPECT_DOUBLE_EQ(1.7976931348623158e+308, value); +} + +TEST(TConfigTests, GetSetDoubleExport) +{ + TConfig cfg; + + TString strXmlData(_T("\n\ +01.7976931348623158e+308")); + + // store in string + cfg.ReadFromString(strXmlData); + + EXPECT_DOUBLE_EQ(0.0, cfg.GetDouble(_T("Root.Node.Value1"))); + EXPECT_DOUBLE_EQ(1.7976931348623158e+308, cfg.GetDouble(_T("Root.Node.Value2"))); + + TString strWriteXmlData; + cfg.WriteToString(strWriteXmlData); + + EXPECT_EQ(strXmlData, strWriteXmlData); +} + +/////////////////////////////////////////////////////////////////////////// +TEST(TConfigTests, GetSetString) +{ + TConfig cfg; + + // store data in config + cfg.SetValue(_T("Root.Node.Value1"), _T("Some basic string")); + cfg.SetValue(_T("Root.Node.Value2"), L"!@#$%^&*()[]\\/<>,.QWERTYqwerty\x2021"); + + // check if stored successfully (typed get) + EXPECT_EQ(TString(_T("Some basic string")), cfg.GetString(_T("Root.Node.Value1"))); + EXPECT_EQ(TString(L"!@#$%^&*()[]\\/<>,.QWERTYqwerty\x2021"), cfg.GetString(_T("Root.Node.Value2"))); + + // check if stored successfully (GetValue) + TString value; + cfg.GetValue(_T("Root.Node.Value1"), value); + EXPECT_EQ(TString(_T("Some basic string")), value); + cfg.GetValue(_T("Root.Node.Value2"), value); + EXPECT_EQ(TString(L"!@#$%^&*()[]\\/<>,.QWERTYqwerty\x2021"), value); +} + +TEST(TConfigTests, GetSetStringExport) +{ + TConfig cfg; + + TString strXmlData(_T("\n\ +Some basic string!@#$%^&*()[]\\/<>,.QWERTYqwerty\x2021")); + + // store in string + cfg.ReadFromString(strXmlData); + + EXPECT_EQ(TString(_T("Some basic string")), cfg.GetString(_T("Root.Node.Value1"))); + EXPECT_EQ(TString(L"!@#$%^&*()[]\\/<>,.QWERTYqwerty\x2021"), cfg.GetString(_T("Root.Node.Value2"))); + + TString strWriteXmlData; + cfg.WriteToString(strWriteXmlData); + + EXPECT_EQ(strXmlData, strWriteXmlData); +} + +/////////////////////////////////////////////////////////////////////////// +TEST(TConfigTests, GetSetPath) +{ + TConfig cfg; + + // store data in config + cfg.SetValue(_T("Root.Node.Value1"), _T("c:\\Windows\\System32")); + cfg.SetValue(_T("Root.Node.Value2"), _T("\\\\machine\\share\\SomeFile.dat")); + + // check if stored successfully (typed get) + EXPECT_EQ(PathFromString(_T("c:\\Windows\\System32")), cfg.GetPath(_T("Root.Node.Value1"))); + EXPECT_EQ(PathFromString(_T("\\\\machine\\share\\SomeFile.dat")), cfg.GetPath(_T("Root.Node.Value2"))); + + // check if stored successfully (GetValue) + TSmartPath value; + cfg.GetValue(_T("Root.Node.Value1"), value); + EXPECT_EQ(PathFromString(_T("c:\\Windows\\System32")), value); + cfg.GetValue(_T("Root.Node.Value2"), value); + EXPECT_EQ(PathFromString(_T("\\\\machine\\share\\SomeFile.dat")), value); +} + +TEST(TConfigTests, GetSetPathExport) +{ + TConfig cfg; + + TString strXmlData(_T("\n\ +c:\\Windows\\System32\\\\machine\\share\\SomeFile.dat")); + + // store in string + cfg.ReadFromString(strXmlData); + + EXPECT_EQ(PathFromString(_T("c:\\Windows\\System32")), cfg.GetPath(_T("Root.Node.Value1"))); + EXPECT_EQ(PathFromString(_T("\\\\machine\\share\\SomeFile.dat")), cfg.GetPath(_T("Root.Node.Value2"))); + + TString strWriteXmlData; + cfg.WriteToString(strWriteXmlData); + + EXPECT_EQ(strXmlData, strWriteXmlData); +} + +/////////////////////////////////////////////////////////////////////////// +TEST(TConfigTests, GetSetStringArray) +{ + TConfig cfg; + + TStringArray arrString; + arrString.Add(_T("String1")); + arrString.Add(_T("SampleStringPath")); + arrString.Add(_T("!@#$%^&*()")); + arrString.Add(_T("")); + + // store data in config + cfg.SetValue(_T("Root.Node.Values.Node"), arrString); + + // check if stored successfully (typed get) + TStringArray arrRead; + cfg.GetValue(_T("Root.Node.Values.Node"), arrRead); + + EXPECT_EQ(arrString.GetCount(), arrRead.GetCount()); + EXPECT_EQ(arrString.GetAt(0), arrRead.GetAt(0)); + EXPECT_EQ(arrString.GetAt(1), arrRead.GetAt(1)); + EXPECT_EQ(arrString.GetAt(2), arrRead.GetAt(2)); + EXPECT_EQ(arrString.GetAt(3), arrRead.GetAt(3)); +} + +TEST_F(InitializedConfigFixture, GetSetStringArrayImport) +{ + TStringArray arrRead; + m_cfg.GetValue(_T("CHConfig.Core.Notifications.PathList.Path"), arrRead); + + EXPECT_EQ(arrRead.GetCount(), 4); + EXPECT_EQ(TString(_T("c:\\Windows\\System32")), arrRead.GetAt(0)); + EXPECT_EQ(TString(_T("d:\\Movies")), arrRead.GetAt(1)); + EXPECT_EQ(TString(_T("x:\\Music")), arrRead.GetAt(2)); + EXPECT_EQ(TString(_T("s:\\projects\\ch-rw")), arrRead.GetAt(3)); +} + +TEST(TConfigTests, GetSetStringArrayExport) +{ + TConfig cfg; + + TStringArray arrString; + arrString.Add(_T("String1")); + arrString.Add(_T("SampleStringPath")); + arrString.Add(_T("!@#$%^&*()")); + arrString.Add(_T("")); + + // store data in config + cfg.SetValue(_T("Root.Node.Values.Node"), arrString); + + // store in string + TString wstrData; + cfg.WriteToString(wstrData); + + EXPECT_EQ(TString(_T("\n\ +String1SampleStringPath!@#$%^&*()")), wstrData); +} + +/////////////////////////////////////////////////////////////////////////// +TEST_F(InitializedConfigFixture, CompositeObjectsReadWriteString) +{ + TString wstrWithDeletion; + m_cfg.WriteToString(wstrWithDeletion); + + EXPECT_EQ(TString(_T("\n\ +30000\ +FirstName<WINDOWS>\\FirstPathSecondName<WINDOWS>\\SecondPath\ +c:\\Windows\\System32d:\\Moviesx:\\Musics:\\projects\\ch-rw\ +true<WINDOWS>\\media\\chord.wav\ +<WINDOWS>\\\x597D\x8FD0\\ding.wav")), wstrWithDeletion); +} + +/////////////////////////////////////////////////////////////////////////// +TEST_F(InitializedConfigFixture, DeleteNodeTest) +{ + m_cfg.DeleteNode(_T("CHConfig.Core.Notifications")); + + TString wstrWithDeletion; + m_cfg.WriteToString(wstrWithDeletion); + + EXPECT_EQ(TString(_T("\n\ +30000FirstName<WINDOWS>\\FirstPath\ +SecondName<WINDOWS>\\SecondPath")), wstrWithDeletion); +} + +/////////////////////////////////////////////////////////////////////////// +TEST_F(InitializedConfigFixture, ExtractConfig) +{ + TConfig cfgSub; + + m_cfg.ExtractSubConfig(_T("CHConfig.Core.Notifications.Sounds"), cfgSub); + EXPECT_EQ(true, cfgSub.GetBool(_T("Enable"))); + EXPECT_EQ(TString(_T("\\media\\chord.wav")), cfgSub.GetString(_T("ErrorSoundPath"))); + EXPECT_EQ(TString(_T("\\\x597D\x8FD0\\ding.wav")), cfgSub.GetString(_T("FinishedSoundPath"))); +} + +TEST_F(InitializedConfigFixture, ExtractMultipleConfigs) +{ + TConfigArray cfgSubArray; + + m_cfg.ExtractMultiSubConfigs(_T("CHConfig.Core.CompositeObjects.Object"), cfgSubArray); + + EXPECT_EQ(2, cfgSubArray.GetCount()); + + EXPECT_EQ(TString(_T("FirstName")), cfgSubArray.GetAt(0).GetString(_T("Name"))); + EXPECT_EQ(TString(_T("\\FirstPath")), cfgSubArray.GetAt(0).GetString(_T("Path"))); + EXPECT_EQ(TString(_T("SecondName")), cfgSubArray.GetAt(1).GetString(_T("Name"))); + EXPECT_EQ(TString(_T("\\SecondPath")), cfgSubArray.GetAt(1).GetString(_T("Path"))); +} + +TEST(TConfigTests, PutSubConfig) +{ + TConfig mainCfg; + + TConfig cfgSub; + cfgSub.SetValue(_T("Node1"), true); + cfgSub.SetValue(_T("NameNode"), _T("TestNode")); + + mainCfg.PutSubConfig(_T("Root.NodeSet"), cfgSub); + + EXPECT_EQ(true, mainCfg.GetBool(_T("Root.NodeSet.Node1"))); + EXPECT_EQ(TString(_T("TestNode")), mainCfg.GetString(_T("Root.NodeSet.NameNode"))); +} + +TEST(TConfigTests, AddSubConfig) +{ + TConfig mainCfg; + + TConfig cfgSub; + cfgSub.SetValue(_T("Node1"), true); + cfgSub.SetValue(_T("NameNode"), _T("TestNode")); + + mainCfg.AddSubConfig(_T("Root.NodeSet.Node"), cfgSub); + mainCfg.AddSubConfig(_T("Root.NodeSet.Node"), cfgSub); + + TString strXml; + mainCfg.WriteToString(strXml); + + EXPECT_EQ(TString(_T("\n\ +TestNodetrueTestNodetrue")), strXml); +}