Index: src/libchcore/Tests/TestsTStringPattern.cpp
===================================================================
diff -u -N -r3401d5079f33b29a7783b65bfad5f34d89a33ba5 -r6d90b96005710c802d5f141b69528e9e87a380c9
--- src/libchcore/Tests/TestsTStringPattern.cpp	(.../TestsTStringPattern.cpp)	(revision 3401d5079f33b29a7783b65bfad5f34d89a33ba5)
+++ src/libchcore/Tests/TestsTStringPattern.cpp	(.../TestsTStringPattern.cpp)	(revision 6d90b96005710c802d5f141b69528e9e87a380c9)
@@ -10,105 +10,175 @@
 	TStringPattern patternEmpty;
 	EXPECT_STREQ(L"", patternEmpty.ToString().c_str());
 	EXPECT_STREQ(L"", patternEmpty.GetPattern().c_str());
-	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
+	EXPECT_EQ(TStringPattern::EPatternType::eType_FilenameWildcard, patternEmpty.GetPatternType());
 }
 
 TEST(TestsTStringPattern, PatternConstruction)
 {
-	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_Wildcard);
+	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_FilenameWildcard);
 	EXPECT_STREQ(L"*.*", patternEmpty.ToString().c_str());
 	EXPECT_STREQ(L"*.*", patternEmpty.GetPattern().c_str());
-	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
+	EXPECT_EQ(TStringPattern::EPatternType::eType_FilenameWildcard, patternEmpty.GetPatternType());
 }
 
 TEST(TestsTStringPattern, SetPattern)
 {
-	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_Wildcard);
+	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_FilenameWildcard);
 
-	patternEmpty.SetPattern(L"*.bat", TStringPattern::EPatternType::eType_Wildcard);
+	patternEmpty.SetPattern(L"*.bat", TStringPattern::EPatternType::eType_FilenameWildcard);
 
 	EXPECT_STREQ(L"*.bat", patternEmpty.ToString().c_str());
 	EXPECT_STREQ(L"*.bat", patternEmpty.GetPattern().c_str());
-	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
+	EXPECT_EQ(TStringPattern::EPatternType::eType_FilenameWildcard, patternEmpty.GetPatternType());
 }
 
 TEST(TestsTStringPattern, CreateFromSerializedString)
 {
-	TStringPattern patternEmpty = TStringPattern::CreateFromString(L"WC;*.*");
+	TStringPattern patternEmpty = TStringPattern::CreateFromString(L"file:*.*");
 
 	EXPECT_STREQ(L"*.*", patternEmpty.ToString().c_str());
 	EXPECT_STREQ(L"*.*", patternEmpty.GetPattern().c_str());
-	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
+	EXPECT_EQ(TStringPattern::EPatternType::eType_FilenameWildcard, patternEmpty.GetPatternType());
 }
 
 TEST(TestsTStringPattern, FromStringString)
 {
 	TStringPattern patternEmpty;
-	patternEmpty.FromString(L"WC;*.*");
+	patternEmpty.FromString(L"file:*.*");
 
-	EXPECT_STREQ(L"*.*", patternEmpty.ToString().c_str());
+	EXPECT_EQ(TStringPattern::EPatternType::eType_FilenameWildcard, patternEmpty.GetPatternType());
 	EXPECT_STREQ(L"*.*", patternEmpty.GetPattern().c_str());
-	EXPECT_EQ(TStringPattern::EPatternType::eType_Wildcard, patternEmpty.GetPatternType());
+	EXPECT_STREQ(L"*.*", patternEmpty.ToString().c_str());
 }
 
+TEST(TestsTStringPattern, Matches_DoubleWildcard)
+{
+	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_FilenameWildcard);
+
+	EXPECT_TRUE(patternEmpty.Matches(PathFromString(L"autorun")));
+	EXPECT_TRUE(patternEmpty.Matches(PathFromString(L"autorun.txt")));
+}
+
+TEST(TestsTStringPattern, Matches_SingleWildcard)
+{
+	TStringPattern patternEmpty(L"*", TStringPattern::EPatternType::eType_FilenameWildcard);
+
+	EXPECT_TRUE(patternEmpty.Matches(PathFromString(L"autorun")));
+	EXPECT_TRUE(patternEmpty.Matches(PathFromString(L"autorun.txt")));
+}
+
 TEST(TestsTStringPattern, Matches_Positive_StarDotBat)
 {
-	TStringPattern patternEmpty(L"*.bat", TStringPattern::EPatternType::eType_Wildcard);
+	TStringPattern patternEmpty(L"*.bat", TStringPattern::EPatternType::eType_FilenameWildcard);
 
 	EXPECT_TRUE(patternEmpty.Matches(PathFromString(L"autorun.bat")));
 }
 
 TEST(TestsTStringPattern, Matches_Negative_StarDotBat)
 {
-	TStringPattern patternEmpty(L"*.bat", TStringPattern::EPatternType::eType_Wildcard);
+	TStringPattern patternEmpty(L"*.bat", TStringPattern::EPatternType::eType_FilenameWildcard);
 
 	EXPECT_FALSE(patternEmpty.Matches(PathFromString(L"autorun.batx")));
 }
 
 TEST(TestsTStringPattern, Matches_Positive_StarDotStar)
 {
-	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_Wildcard);
+	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_FilenameWildcard);
 
 	EXPECT_TRUE(patternEmpty.Matches(PathFromString(L"autorun.bat")));
 }
 
-TEST(TestsTStringPattern, Matches_Negative_StarDotStar)
-{
-	TStringPattern patternEmpty(L"*.*", TStringPattern::EPatternType::eType_Wildcard);
-
-	EXPECT_FALSE(patternEmpty.Matches(PathFromString(L"autorun")));
-}
-
 ///////////////////////////////////////////////////////////
 // Multiple asterisks
 
 TEST(TestsTStringPattern, Matches_Positive_MultiStar)
 {
-	TStringPattern patternEmpty(L"ad*bo*", TStringPattern::EPatternType::eType_Wildcard);
+	TStringPattern patternEmpty(L"ad*bo*", TStringPattern::EPatternType::eType_FilenameWildcard);
 
 	EXPECT_TRUE(patternEmpty.Matches(PathFromString(L"addon-boo.bat")));
 }
 
 TEST(TestsTStringPattern, Matches_Negative_MultiStar)
 {
-	TStringPattern patternEmpty(L"ad*bo*", TStringPattern::EPatternType::eType_Wildcard);
+	TStringPattern patternEmpty(L"ad*bo*", TStringPattern::EPatternType::eType_FilenameWildcard);
 
 	EXPECT_FALSE(patternEmpty.Matches(PathFromString(L"addon-doo.bat")));
 }
 
 ////////////////////////////////////////////////////////////
 // asterisks
-
 TEST(TestsTStringPattern, Matches_Positive_QuestionMultiPos)
 {
-	TStringPattern patternEmpty(L"a??b?r", TStringPattern::EPatternType::eType_Wildcard);
+	TStringPattern patternEmpty(L"a??b?r", TStringPattern::EPatternType::eType_FilenameWildcard);
 
 	EXPECT_TRUE(patternEmpty.Matches(PathFromString(L"arbbar")));
 }
 
 TEST(TestsTStringPattern, Matches_Negative_QuestionMultiPos)
 {
-	TStringPattern patternEmpty(L"a??b?r", TStringPattern::EPatternType::eType_Wildcard);
+	TStringPattern patternEmpty(L"a??b?r", TStringPattern::EPatternType::eType_FilenameWildcard);
 
 	EXPECT_FALSE(patternEmpty.Matches(PathFromString(L"arbxar")));
 }
+
+// full path matching
+TEST(TestsTStringPattern, FullPath_MatchFilename)
+{
+	TStringPattern patternEmpty(L"a??b?r", TStringPattern::EPatternType::eType_FilenameWildcard);
+
+	EXPECT_TRUE(patternEmpty.Matches(PathFromString(LR"(c:\windows\arbbar)")));
+}
+
+TEST(TestsTStringPattern, FullPath_NotMatchWholePath)
+{
+	TStringPattern patternEmpty(L"a??b?r", TStringPattern::EPatternType::eType_FullPathWildcard);
+
+	EXPECT_FALSE(patternEmpty.Matches(PathFromString(LR"(c:\windows\arbbar)")));
+}
+
+TEST(TestsTStringPattern, FullPath_MatchWholePath)
+{
+	TStringPattern patternEmpty(L"*a??b?r", TStringPattern::EPatternType::eType_FullPathWildcard);
+
+	EXPECT_TRUE(patternEmpty.Matches(PathFromString(LR"(c:\windows\arbbar)")));
+}
+
+TEST(TestsTStringPattern, FullPath_MatchComplexPattern)
+{
+	TStringPattern patternEmpty(LR"(c:\*\a??b?r)", TStringPattern::EPatternType::eType_FullPathWildcard);
+
+	EXPECT_TRUE(patternEmpty.Matches(PathFromString(LR"(c:\windows\arbbar)")));
+}
+
+// auto-detection
+TEST(TestsTStringPattern, FullPath_DetectWildcard)
+{
+	TStringPattern patternEmpty(L"file:a??b?r");
+
+	EXPECT_TRUE(patternEmpty.Matches(PathFromString(LR"(c:\windows\arbbar)")));
+}
+
+TEST(TestsTStringPattern, FullPath_DetectFullPathWildcard)
+{
+	TStringPattern patternEmpty(L"path:a??b?r");
+
+	EXPECT_FALSE(patternEmpty.Matches(PathFromString(LR"(c:\windows\arbbar)")));
+}
+
+///////////////////////////////////////////////
+// regex
+
+// auto-detection
+TEST(TestsTStringPattern, RegexFullPath_DetectWildcard)
+{
+	TStringPattern patternEmpty(L"rfile:ar[bar]+");
+
+	EXPECT_TRUE(patternEmpty.Matches(PathFromString(LR"(c:\windows\arbbar)")));
+}
+
+TEST(TestsTStringPattern, RegexFullPath_DetectFullPathWildcard)
+{
+	TStringPattern patternEmpty(L"rpath:c:\\\\[a-z]+\\\\a[bar]*");
+
+	EXPECT_TRUE(patternEmpty.Matches(PathFromString(LR"(c:\windows\arbbar)")));
+}