return function()local A=script.Parent local C=A.Parent local b=C.Parent local V=(require(b.Dev.JestGlobals)).expect local e=require(A.support)local E=require(C)local T,z=E.isMatch,E.makeRe describe("\115\112\101\099\105\097\108 \099\104\097\114\097\099\116\101\114\115",function()beforeAll(function()return e.resetPathSep()end)afterAll(function()return e.resetPathSep()end)afterEach(function()return e.resetPathSep()end)describe("\110\117\109\098\101\114\115",function()it("\115\104\111\117\108\100 \109\097\116\099\104 \110\117\109\098\101\114\115 \105\110 \116\104\101 \105\110\112\117\116 \115\116\114\105\110\103",function()assert(not T("\049","\042\047\042"))assert(T("\049\047\049","\042\047\042"))assert(T("\049\047\050","\042\047\042"))assert(not T("\049\047\049\047\049","\042\047\042"))assert(not T("\049\047\049\047\050","\042\047\042"))assert(not T("\049","\042\047\042\047\049"))assert(not T("\049\047\049","\042\047\042\047\049"))assert(not T("\049\047\050","\042\047\042\047\049"))assert(T("\049\047\049\047\049","\042\047\042\047\049"))assert(not T("\049\047\049\047\050","\042\047\042\047\049"))assert(not T("\049","\042\047\042\047\050"))assert(not T("\049\047\049","\042\047\042\047\050"))assert(not T("\049\047\050","\042\047\042\047\050"))assert(not T("\049\047\049\047\049","\042\047\042\047\050"))assert(T("\049\047\049\047\050","\042\047\042\047\050"))end)end)describe("\113\109\097\114\107\115",function()it("\115\104\111\117\108\100 \109\097\116\099\104 \108\105\116\101\114\097\108 \063 \105\110 \116\104\101 \105\110\112\117\116 \115\116\114\105\110\103",function()assert(T("\063","\042"))assert(T("\047\063","\047\042"))assert(T("\063\047\063","\042\047\042"))assert(T("\063\047\063\047","\042\047\042\047"))assert(T("\047\063","\047\063"))assert(T("\063\047\063","\063\047\063"))assert(T("\102\111\111\063\047\098\097\114\063","\042\047\042"))end)it("\115\104\111\117\108\100 \110\111\116 \109\097\116\099\104 \115\108\097\115\104\101\115 \119\105\116\104 \113\109\097\114\107\115",function()assert(not T("\097\097\097\047\098\098\098","\097\097\097\063\098\098\098"))end)it("\115\104\111\117\108\100 \109\097\116\099\104 \108\105\116\101\114\097\108 \063 \119\105\116\104 \113\109\097\114\107\115",function()assert(not T("\063","\063\063"))assert(not T("\063","\063\063\063"))assert(not T("\063\063","\063"))assert(not T("\063\063","\063\063\063"))assert(not T("\063\063\063","\063"))assert(not T("\063\063\063","\063\063"))assert(not T("\097\099\063","\097\098\063"))assert(T("\063","\063\042"))assert(T("\063\063","\063\042"))assert(T("\063\063\063","\063\042"))assert(T("\063\063\063\063","\063\042"))assert(T("\063","\063"))assert(T("\063\063","\063\063"))assert(T("\063\063\063","\063\063\063"))assert(T("\097\098\063","\097\098\063"))end)it("\115\104\111\117\108\100 \109\097\116\099\104 \111\116\104\101\114 \110\111\110-\115\108\097\115\104 \099\104\097\114\097\099\116\101\114\115 \119\105\116\104 \113\109\097\114\107\115",function()assert(not T("\047\097\047","\063"))assert(not T("\047\097\047","\063\063"))assert(not T("\047\097\047","\063\063\063"))assert(not T("\047\097\047\098\047","\063\063"))assert(not T("\097\097\097\047\098\098\098","\097\097\097\063\098\098\098"))assert(not T("\097\097\097\047\047\098\098\098","\097\097\097\063\098\098\098"))assert(not T("\097\097\097\092\092\098\098\098","\097\097\097\063\098\098\098"))assert(T("\097\099\098\047","\097\063\098\047"))assert(T("\097\099\100\098\047","\097\063\063\098\047"))assert(T("\047\097\099\098","\047\097\063\098"))end)it("\115\104\111\117\108\100 \109\097\116\099\104 \110\111\110-\115\108\097\115\104 \099\104\097\114\097\099\116\101\114\115 \119\104\101\110 \063 \105\115 \101\115\099\097\112\101\100",function()assert(not T("\097\099\098\047","\097\092\063\098\047"))assert(not T("\097\099\100\098\047","\097\092\063\092\063\098\047"))assert(not T("\047\097\099\098","\047\097\092\063\098"))end)it("\115\104\111\117\108\100 \109\097\116\099\104 \111\110\101 \099\104\097\114\097\099\116\101\114 \112\101\114 \113\117\101\115\116\105\111\110 \109\097\114\107",function()assert(T("\097","\063"))assert(not T("\097\097","\063"))assert(not T("\097\098","\063"))assert(not T("\097\097\097","\063"))assert(not T("\097\098\099\100\101\102\103","\063"))assert(not T("\097","\063\063"))assert(T("\097\097","\063\063"))assert(T("\097\098","\063\063"))assert(not T("\097\097\097","\063\063"))assert(not T("\097\098\099\100\101\102\103","\063\063"))assert(not T("\097","\063\063\063"))assert(not T("\097\097","\063\063\063"))assert(not T("\097\098","\063\063\063"))assert(T("\097\097\097","\063\063\063"))assert(not T("\097\098\099\100\101\102\103","\063\063\063"))assert(not T("\097\097\097","\097\063\099"))assert(T("\097\097\099","\097\063\099"))assert(T("\097\098\099","\097\063\099"))assert(not T("\097","\097\098\063"))assert(not T("\097\097","\097\098\063"))assert(not T("\097\098","\097\098\063"))assert(not T("\097\099","\097\098\063"))assert(not T("\097\098\099\100","\097\098\063"))assert(not T("\097\098\098\098","\097\098\063"))assert(T("\097\099\098","\097\063\098"))assert(not T("\097\047\098\098\047\099\047\100\100\047\101\046\109\100","\097\047\063\047\099\047\063\047\101\046\109\100"))assert(T("\097\047\098\098\047\099\047\100\100\047\101\046\109\100","\097\047\063\063\047\099\047\063\063\047\101\046\109\100"))assert(not T("\097\047\098\098\098\047\099\046\109\100","\097\047\063\063\047\099\046\109\100"))assert(T("\097\047\098\047\099\046\109\100","\097\047\063\047\099\046\109\100"))assert(T("\097\047\098\047\099\047\100\047\101\046\109\100","\097\047\063\047\099\047\063\047\101\046\109\100"))assert(not T("\097\047\098\047\099\047\100\047\101\046\109\100","\097\047\063\047\099\047\063\063\063\047\101\046\109\100"))assert(T("\097\047\098\047\099\047\122\122\122\047\101\046\109\100","\097\047\063\047\099\047\063\063\063\047\101\046\109\100"))assert(not T("\097\047\098\098\047\099\046\109\100","\097\047\063\047\099\046\109\100"))assert(T("\097\047\098\098\047\099\046\109\100","\097\047\063\063\047\099\046\109\100"))assert(T("\097\047\098\098\098\047\099\046\109\100","\097\047\063\063\063\047\099\046\109\100"))assert(T("\097\047\098\098\098\098\047\099\046\109\100","\097\047\063\063\063\063\047\099\046\109\100"))end)it("\115\104\111\117\108\100 \101\110\102\111\114\099\101 \111\110\101 \099\104\097\114\097\099\116\101\114 \112\101\114 \113\109\097\114\107 \101\118\101\110 \119\104\101\110 \112\114\101\099\101\100\101\100 \098\121 \115\116\097\114\115",function()assert(not T("\097","\042\063\063"))assert(not T("\097\097","\042\063\063\063"))assert(T("\097\097\097","\042\063\063\063"))assert(not T("\097","\042\042\042\042\042\063\063"))assert(not T("\097\097","\042\042\042\042\042\063\063\063"))assert(T("\097\097\097","\042\042\042\042\042\063\063\063"))end)it("\115\104\111\117\108\100 \115\117\112\112\111\114\116 \113\109\097\114\107\115 \097\110\100 \115\116\097\114\115",function()assert(not T("\097\097\097","\097\042\063\099"))assert(T("\097\097\099","\097\042\063\099"))assert(T("\097\098\099","\097\042\063\099"))assert(T("\097\098\099","\097\042\042\063\099"))assert(not T("\097\098\098","\097\042\042\063\099"))assert(T("\097\099\099","\097\042\042\063\099"))assert(T("\097\098\099","\097\042\042\042\042\042\063\099"))assert(T("\097","\042\042\042\042\042\063"))assert(T("\097\097","\042\042\042\042\042\063"))assert(T("\097\098\099","\042\042\042\042\042\063"))assert(T("\122\122\122","\042\042\042\042\042\063"))assert(T("\098\098\098","\042\042\042\042\042\063"))assert(T("\097\097\097\097","\042\042\042\042\042\063"))assert(not T("\097","\042\042\042\042\042\063\063"))assert(T("\097\097","\042\042\042\042\042\063\063"))assert(T("\097\098\099","\042\042\042\042\042\063\063"))assert(T("\122\122\122","\042\042\042\042\042\063\063"))assert(T("\098\098\098","\042\042\042\042\042\063\063"))assert(T("\097\097\097\097","\042\042\042\042\042\063\063"))assert(not T("\097","\063\042\042\042\042\042\063\063"))assert(not T("\097\097","\063\042\042\042\042\042\063\063"))assert(T("\097\098\099","\063\042\042\042\042\042\063\063"))assert(T("\122\122\122","\063\042\042\042\042\042\063\063"))assert(T("\098\098\098","\063\042\042\042\042\042\063\063"))assert(T("\097\097\097\097","\063\042\042\042\042\042\063\063"))assert(T("\097\098\099","\063\042\042\042\042\042\063\099"))assert(not T("\097\098\098","\063\042\042\042\042\042\063\099"))assert(not T("\122\122\122","\063\042\042\042\042\042\063\099"))assert(T("\097\098\099","\063\042\042\042\063\042\042\042\042\099"))assert(not T("\098\098\098","\063\042\042\042\063\042\042\042\042\099"))assert(not T("\122\122\122","\063\042\042\042\063\042\042\042\042\099"))assert(T("\097\098\099","\063\042\042\042\063\042\042\042\042\063"))assert(T("\098\098\098","\063\042\042\042\063\042\042\042\042\063"))assert(T("\122\122\122","\063\042\042\042\063\042\042\042\042\063"))assert(T("\097\098\099","\063\042\042\042\063\042\042\042\042"))assert(T("\097\098\099","\042\042\042\042\042\042\042\099"))assert(T("\097\098\099","\042\042\042\042\042\042\042\063"))assert(T("\097\098\099\100\101\099\100\104\106\107","\097\042\099\100\042\042\063\042\042\063\063\107"))assert(T("\097\098\099\100\101\099\100\104\106\107","\097\042\042\063\042\042\099\100\042\042\063\042\042\063\063\107"))assert(T("\097\098\099\100\101\099\100\104\106\107","\097\042\042\063\042\042\099\100\042\042\063\042\042\063\063\107\042\042\042"))assert(T("\097\098\099\100\101\099\100\104\106\107","\097\042\042\063\042\042\099\100\042\042\063\042\042\063\063\042\042\042\107"))assert(T("\097\098\099\100\101\099\100\104\106\107","\097\042\042\063\042\042\099\100\042\042\063\042\042\063\063\042\042\042\107\042\042"))assert(T("\097\098\099\100\101\099\100\104\106\107","\097\042\042\042\042\099\042\042\063\042\042\063\063\042\042\042\042\042"))end)it("\115\104\111\117\108\100 \115\117\112\112\111\114\116 \113\109\097\114\107\115\044 \115\116\097\114\115 \097\110\100 \115\108\097\115\104\101\115",function()assert(not T("\097\047\098\047\099\047\100\047\101\046\109\100","\097\047\063\047\099\047\063\047\042\047\101\046\109\100"))assert(T("\097\047\098\047\099\047\100\047\101\047\101\046\109\100","\097\047\063\047\099\047\063\047\042\047\101\046\109\100"))assert(T("\097\047\098\047\099\047\100\047\101\102\103\104\105\106\107\047\101\046\109\100","\097\047\063\047\099\047\063\047\042\047\101\046\109\100"))assert(T("\097\047\098\047\099\047\100\047\101\102\103\104\105\106\107\047\101\046\109\100","\097\047\063\047\042\042\047\101\046\109\100"))assert(not T("\097\047\098\098\047\101\046\109\100","\097\047\063\047\101\046\109\100"))assert(T("\097\047\098\098\047\101\046\109\100","\097\047\063\063\047\101\046\109\100"))assert(not T("\097\047\098\098\047\101\046\109\100","\097\047\063\047\042\042\047\101\046\109\100"))assert(T("\097\047\098\047\099\099\099\047\101\046\109\100","\097\047\063\047\042\042\047\101\046\109\100"))assert(T("\097\047\098\047\099\047\100\047\101\102\103\104\105\106\107\047\101\046\109\100","\097\047\042\047\063\047\042\042\047\101\046\109\100"))assert(T("\097\047\098\047\099\047\100\047\101\102\103\104\046\105\106\107\047\101\046\109\100","\097\047\042\047\063\047\042\042\047\101\046\109\100"))assert(T("\097\047\098\046\098\098\047\099\047\100\047\101\102\103\104\046\105\106\107\047\101\046\109\100","\097\047\042\047\063\047\042\042\047\101\046\109\100"))assert(T("\097\047\098\098\098\047\099\047\100\047\101\102\103\104\046\105\106\107\047\101\046\109\100","\097\047\042\047\063\047\042\042\047\101\046\109\100"))end)it("\115\104\111\117\108\100 \109\097\116\099\104 \110\111\110-\108\101\097\100\105\110\103 \100\111\116\115",function()assert(T("\097\097\097\046\098\098\098","\097\097\097\063\098\098\098"))end)it("\115\104\111\117\108\100 \110\111\116 \109\097\116\099\104 \108\101\097\100\105\110\103 \100\111\116\115",function()assert(not T("\046\097\097\097\047\098\098\098","\063\097\097\097\047\098\098\098"))assert(not T("\097\097\097\047\046\098\098\098","\097\097\097\047\063\098\098\098"))end)it("\115\104\111\117\108\100 \109\097\116\099\104 \099\104\097\114\097\099\116\101\114\115 \112\114\101\099\101\100\105\110\103 \097 \100\111\116",function()assert(T("\097\047\098\098\098\047\097\098\099\100\046\109\100","\097\047\042\047\097\098\063\063\046\109\100"))assert(T("\097\047\098\098\098\047\097\098\099\100\046\109\100","\097\047\098\098\098\047\097\098\063\063\046\109\100"))assert(T("\097\047\098\098\098\047\097\098\099\100\046\109\100","\097\047\098\098\098\047\097\098\063\063\063\109\100"))end)end)describe("\112\097\114\101\110\116\104\101\115\101\115 \040\041",function()it("\115\104\111\117\108\100 \109\097\116\099\104 \108\105\116\101\114\097\108 \112\097\114\101\110\116\104\101\115\101\115 \105\110 \116\104\101 \105\110\112\117\116 \115\116\114\105\110\103",function()assert(not T("\109\121\047\102\111\108\100\101\114 \040\087\111\114\107\044 \065\099\099\116\115\041","\047\042"))assert(T("\109\121\047\102\111\108\100\101\114 \040\087\111\114\107\044 \065\099\099\116\115\041","\042\047\042"))assert(T("\109\121\047\102\111\108\100\101\114 \040\087\111\114\107\044 \065\099\099\116\115\041","\042\047\042\044\042"))assert(T("\109\121\047\102\111\108\100\101\114 \040\087\111\114\107\044 \065\099\099\116\115\041","\042\047\042\040\087\042\044 \042\041\042"))assert(T("\109\121\047\102\111\108\100\101\114\047\040\087\111\114\107\044 \065\099\099\116\115\041","\042\042\047\042\040\087\042\044 \042\041\042"))assert(not T("\109\121\047\102\111\108\100\101\114\047\040\087\111\114\107\044 \065\099\099\116\115\041","\042\047\042\040\087\042\044 \042\041\042"))assert(T("\102\111\111\040\098\097\114\041\098\097\122","\102\111\111\042\098\097\122"))end)itFIXME("\115\104\111\117\108\100 \109\097\116\099\104 \108\105\116\101\114\097\108 \112\097\114\101\110\115 \119\105\116\104 \098\114\097\099\107\101\116\115",function()assert(T("\102\111\111\040\098\097\114\041\098\097\122","\102\111\111\091\098\097\114\040\041\093\043\098\097\122"))end)it("\115\104\111\117\108\100 \116\104\114\111\119 \097\110 \101\114\114\111\114 \111\110 \105\109\098\097\108\097\110\099\101\100\044 \117\110\101\115\099\097\112\101\100 \112\097\114\101\110\115",function()local A={strictBrackets=true};(V(function()return z("\042\041",A)end)).toThrowError("\077\105\115\115\105\110\103 \111\112\101\110\105\110\103\058 \"\040\"");(V(function()return z("\042\040",A)end)).toThrowError("\077\105\115\115\105\110\103 \099\108\111\115\105\110\103\058 \"\041\"")end)it("\115\104\111\117\108\100 \116\104\114\111\119 \097\110 \101\114\114\111\114 \111\110 \105\109\098\097\108\097\110\099\101\100\044 \117\110\101\115\099\097\112\101\100 \098\114\097\099\107\101\116\115",function()local A={strictBrackets=true};(V(function()return z("\042\093",A)end)).toThrowError("\077\105\115\115\105\110\103 \111\112\101\110\105\110\103\058 \"\091\"");(V(function()return z("\042\091",A)end)).toThrowError("\077\105\115\115\105\110\103 \099\108\111\115\105\110\103\058 \"\093\"")end)end)describe("\112\097\116\104 \099\104\097\114\097\099\116\101\114\115",function()it("\115\104\111\117\108\100 \109\097\116\099\104 \119\105\110\100\111\119\115 \100\114\105\118\101\115 \119\105\116\104 \103\108\111\098\115\116\097\114\115",function()assert(T("\098\097\114\047","\042\042"))assert(T("\065\058\047\047","\042\042"))assert(T("\066\058\102\111\111\047\097\047\098\047\099\047\100","\042\042"))assert(T("\067\058\047\085\115\101\114\115\047","\042\042"))assert(T("\099\058\092","\042\042"))assert(T("\067\058\092\085\115\101\114\115\092","\042\042"))assert(T("\067\058\099\119\100\047\097\110\111\116\104\101\114","\042\042"))assert(T("\067\058\099\119\100\092\097\110\111\116\104\101\114","\042\042"))end)itSKIP("\115\104\111\117\108\100 \110\111\116 \109\097\116\099\104 \109\117\108\116\105\112\108\101 \119\105\110\100\111\119\115 \100\105\114\101\099\116\111\114\105\101\115 \119\105\116\104 \097 \115\105\110\103\108\101 \115\116\097\114",function() end)itSKIP("\115\104\111\117\108\100 \109\097\116\099\104 \109\105\120\101\100 \115\108\097\115\104\101\115 \111\110 \119\105\110\100\111\119\115",function() end)itFIXME("\115\104\111\117\108\100 \109\097\116\099\104 \109\105\120\101\100 \115\108\097\115\104\101\115 \119\104\101\110 \111\112\116\105\111\110\115\046\119\105\110\100\111\119\115 \105\115 \116\114\117\101",function()assert(T("\047\047\067\058\047\047\117\115\101\114\092\100\111\099\115\092\076\101\116\116\101\114\046\116\120\116","\042\042",{windows=true}))assert(T("\047\047\067\058\092\092\117\115\101\114\047\100\111\099\115\047\076\101\116\116\101\114\046\116\120\116","\042\042",{windows=true}))assert(T("\058\092","\042\123\044\047\125",{windows=true}))assert(T("\058\092","\058\042\123\044\047\125",{windows=true}))assert(T("\092\092\102\111\111\047\098\097\114","\042\042",{windows=true}))assert(T("\092\092\102\111\111\047\098\097\114","\047\047\042\047\042",{windows=true}))assert(T("\092\092\117\110\099\092\097\100\109\105\110\036","\047\047\042\042",{windows=true}))assert(T("\092\092\117\110\099\092\097\100\109\105\110\036","\047\047\042\047\042\036",{windows=true}))assert(T("\092\092\117\110\099\092\097\100\109\105\110\036\092\115\121\115\116\101\109\051\050","\047\047\042\047\042\036\047\042\051\050",{windows=true}))assert(T("\092\092\117\110\099\092\115\104\097\114\101\092\102\111\111","\047\047\117\042\047\115\042\047\102\042",{windows=true}))assert(T("\092\092\092\092\092\092\117\110\099\092\115\104\097\114\101\092\102\111\111","\047\092\123\049\044\092\125\117\042\047\115\042\047\102\042",{windows=true,unescape=true}))assert(T("\102\111\111\092\098\097\114\092\098\097\122","\102\042\047\042\047\042",{windows=true}))assert(T("\047\047\042\058\047\042\042","\042\042"))assert(not T("\047\047\115\101\114\118\101\114\047\102\105\108\101","\047\047\042"))assert(T("\047\047\115\101\114\118\101\114\047\102\105\108\101","\047\042\042"))assert(T("\047\047\115\101\114\118\101\114\047\102\105\108\101","\047\047\042\042"))assert(T("\047\047\115\101\114\118\101\114\047\102\105\108\101","\042\042"))assert(T("\047\047\085\078\067\047\047\083\101\114\118\101\114\048\049\047\047\117\115\101\114\047\047\100\111\099\115\047\047\076\101\116\116\101\114\046\116\120\116","\042\042"))assert(T("\047\102\111\111","\042\042"))assert(T("\047\102\111\111\047\097\047\098\047\099\047\100","\042\042"))assert(T("\047\102\111\111\047\098\097\114","\042\042"))assert(T("\047\104\111\109\101\047\102\111\111","\042\042"))assert(T("\047\104\111\109\101\047\102\111\111\047\046\046","\042\042\047\046\046"))assert(T("\047\117\115\101\114\047\100\111\099\115\047\076\101\116\116\101\114\046\116\120\116","\042\042"))assert(T("\100\105\114\101\099\116\111\114\121\092\100\105\114\101\099\116\111\114\121","\042\042"))assert(T("\097\047\098\047\099\046\106\115","\042\042"))assert(T("\100\105\114\101\099\116\111\114\121\047\100\105\114\101\099\116\111\114\121","\042\042"))assert(T("\102\111\111\047\098\097\114","\042\042"))end)it("\115\104\111\117\108\100 \109\097\116\099\104 \097\110\121 \099\104\097\114\097\099\116\101\114 \122\101\114\111 \111\114 \109\111\114\101 \116\105\109\101\115\044 \101\120\099\101\112\116 \102\111\114 \047",function()assert(not T("\102\111\111","\042\097\042"))assert(not T("\102\111\111","\042\114"))assert(not T("\102\111\111","\098\042"))assert(not T("\102\111\111\047\098\097\114","\042"))assert(T("\102\111\111\047\098\097\114","\042\047\042"))assert(not T("\102\111\111\047\098\097\114\047\098\097\122","\042\047\042"))assert(T("\098\097\114","\042\097\042"))assert(T("\098\097\114","\042\114"))assert(T("\098\097\114","\098\042"))assert(T("\102\111\111\047\098\097\114\047\098\097\122","\042\047\042\047\042"))end)it("\115\104\111\117\108\100 \109\097\116\099\104 \100\097\115\104\101\115 \115\117\114\114\111\117\110\100\101\100 \098\121 \115\112\097\099\101\115",function()assert(T("\109\121\047\102\111\108\100\101\114 - \049","\042\047\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \099\111\112\121 \040\049\041","\042\047\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \099\111\112\121 \091\049\093","\042\047\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \102\111\111 \043 \098\097\114 - \099\111\112\121 \091\049\093","\042\047\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \102\111\111 \043 \098\097\114 - \099\111\112\121 \091\049\093","\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \049","\042\047\042-\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \099\111\112\121 \040\049\041","\042\047\042-\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \099\111\112\121 \091\049\093","\042\047\042-\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \102\111\111 \043 \098\097\114 - \099\111\112\121 \091\049\093","\042\047\042-\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \049","\042\047\042\049"))assert(not T("\109\121\047\102\111\108\100\101\114 - \099\111\112\121 \040\049\041","\042\047\042\049"))end)end)describe("\098\114\097\099\107\101\116\115",function()itFIXME("\115\104\111\117\108\100 \115\117\112\112\111\114\116 \115\113\117\097\114\101 \098\114\097\099\107\101\116\115 \105\110 \103\108\111\098\115",function()assert(T("\102\111\111\047\098\097\114 - \049","\042\042\047\042\091\049\093"))assert(not T("\102\111\111\047\098\097\114 - \099\111\112\121 \040\049\041","\042\042\047\042\091\049\093"))assert(not T("\102\111\111\047\098\097\114 \040\049\041","\042\042\047\042\091\049\093"))assert(not T("\102\111\111\047\098\097\114 \040\052\041","\042\042\047\042\091\049\093"))assert(not T("\102\111\111\047\098\097\114 \040\055\041","\042\042\047\042\091\049\093"))assert(not T("\102\111\111\047\098\097\114 \040\052\050\041","\042\042\047\042\091\049\093"))assert(T("\102\111\111\047\098\097\114 - \099\111\112\121 \091\049\093","\042\042\047\042\091\049\093"))assert(T("\102\111\111\047\098\097\114 - \102\111\111 \043 \098\097\114 - \099\111\112\121 \091\049\093","\042\042\047\042\091\049\093"))end)it("\115\104\111\117\108\100 \109\097\116\099\104 \040\101\115\099\097\112\101\100\041 \098\114\097\099\107\101\116 \108\105\116\101\114\097\108\115",function()assert(T("\097 \091\098\093","\097 \092\091\098\092\093"))assert(T("\097 \091\098\093 \099","\097 \091\098\093 \099"))assert(T("\097 \091\098\093","\097 \092\091\098\092\093\042"))assert(T("\097 \091\098\099\093","\097 \092\091\098\099\092\093\042"))assert(not T("\097 \091\098\093","\097 \092\091\098\092\093\046\042"))assert(T("\097 \091\098\093\046\106\115","\097 \092\091\098\092\093\046\042"))assert(not T("\102\111\111\047\098\097\114 - \049","\042\042\047\042\092\091\042\092\093"))assert(not T("\102\111\111\047\098\097\114 - \099\111\112\121 \040\049\041","\042\042\047\042\092\091\042\092\093"))assert(not T("\102\111\111\047\098\097\114 \040\049\041","\042\042\047\042\092\091\042\092\093"))assert(not T("\102\111\111\047\098\097\114 \040\052\041","\042\042\047\042\092\091\042\092\093"))assert(not T("\102\111\111\047\098\097\114 \040\055\041","\042\042\047\042\092\091\042\092\093"))assert(not T("\102\111\111\047\098\097\114 \040\052\050\041","\042\042\047\042\092\091\042\092\093"))assert(T("\102\111\111\047\098\097\114 - \099\111\112\121 \091\049\093","\042\042\047\042\092\091\042\092\093"))assert(T("\102\111\111\047\098\097\114 - \102\111\111 \043 \098\097\114 - \099\111\112\121 \091\049\093","\042\042\047\042\092\091\042\092\093"))assert(not T("\102\111\111\047\098\097\114 - \049","\042\042\047\042\092\091\049\092\093"))assert(not T("\102\111\111\047\098\097\114 - \099\111\112\121 \040\049\041","\042\042\047\042\092\091\049\092\093"))assert(not T("\102\111\111\047\098\097\114 \040\049\041","\042\042\047\042\092\091\049\092\093"))assert(not T("\102\111\111\047\098\097\114 \040\052\041","\042\042\047\042\092\091\049\092\093"))assert(not T("\102\111\111\047\098\097\114 \040\055\041","\042\042\047\042\092\091\049\092\093"))assert(not T("\102\111\111\047\098\097\114 \040\052\050\041","\042\042\047\042\092\091\049\092\093"))assert(T("\102\111\111\047\098\097\114 - \099\111\112\121 \091\049\093","\042\042\047\042\092\091\049\092\093"))assert(T("\102\111\111\047\098\097\114 - \102\111\111 \043 \098\097\114 - \099\111\112\121 \091\049\093","\042\042\047\042\092\091\049\092\093"))assert(not T("\102\111\111\047\098\097\114 - \049","\042\047\042\092\091\042\092\093"))assert(not T("\102\111\111\047\098\097\114 - \099\111\112\121 \040\049\041","\042\047\042\092\091\042\092\093"))assert(not T("\102\111\111\047\098\097\114 \040\049\041","\042\047\042\092\091\042\092\093"))assert(not T("\102\111\111\047\098\097\114 \040\052\041","\042\047\042\092\091\042\092\093"))assert(not T("\102\111\111\047\098\097\114 \040\055\041","\042\047\042\092\091\042\092\093"))assert(not T("\102\111\111\047\098\097\114 \040\052\050\041","\042\047\042\092\091\042\092\093"))assert(T("\102\111\111\047\098\097\114 - \099\111\112\121 \091\049\093","\042\047\042\092\091\042\092\093"))assert(T("\102\111\111\047\098\097\114 - \102\111\111 \043 \098\097\114 - \099\111\112\121 \091\049\093","\042\047\042\092\091\042\092\093"))assert(T("\097 \091\098\093","\097 \092\091\098\092\093"))assert(T("\097 \091\098\093 \099","\097 \091\098\093 \099"))assert(T("\097 \091\098\093","\097 \092\091\098\092\093\042"))assert(T("\097 \091\098\099\093","\097 \092\091\098\099\092\093\042"))assert(not T("\097 \091\098\093","\097 \092\091\098\092\093\046\042"))assert(T("\097 \091\098\093\046\106\115","\097 \092\091\098\092\093\046\042"))end)end)describe("\115\116\097\114 - \"\042\"",function()it("\115\104\111\117\108\100 \109\097\116\099\104 \108\105\116\101\114\097\108 \042",function()assert(T("\042","\042"))assert(T("\042\047\042","\042\047\042"))assert(T("\042\047\042","\063\047\063"))assert(T("\042\047\042\047","\042\047\042\047"))assert(T("\047\042","\047\042"))assert(T("\047\042","\047\063"))assert(T("\102\111\111\042\047\098\097\114\042","\042\047\042"))end)itFIXME("\115\104\111\117\108\100 \115\117\112\112\111\114\116 \115\116\097\114\115 \102\111\108\108\111\119\105\110\103 \098\114\097\099\107\101\116\115",function()assert(T("\097","\091\097\093\042"))assert(T("\097\097","\091\097\093\042"))assert(T("\097\097\097","\091\097\093\042"))assert(T("\097\122","\091\097-\122\093\042"))assert(T("\122\122\122","\091\097-\122\093\042"))end)it("\115\104\111\117\108\100 \115\117\112\112\111\114\116 \115\116\097\114\115 \102\111\108\108\111\119\105\110\103 \112\097\114\101\110\115",function()assert(T("\097","\040\097\041\042"))assert(T("\097\098","\040\097\124\098\041\042"))assert(T("\097\097","\040\097\041\042"))assert(T("\097\097\097\098","\040\097\124\098\041\042"))assert(T("\097\097\097\098\098\098","\040\097\124\098\041\042"))end)it("\115\104\111\117\108\100 \110\111\116 \109\097\116\099\104 \115\108\097\115\104\101\115 \119\105\116\104 \115\105\110\103\108\101 \115\116\097\114\115",function()assert(not T("\097\047\098","\040\097\041\042"))assert(not T("\097\047\098","\091\097\093\042"))assert(not T("\097\047\098","\097\042"))assert(not T("\097\047\098","\040\097\124\098\041\042"))end)it("\115\104\111\117\108\100 \110\111\116 \109\097\116\099\104 \100\111\116\115 \119\105\116\104 \115\116\097\114\115 \098\121 \100\101\102\097\117\108\116",function()assert(not T("\046\097","\040\097\041\042"))assert(not T("\046\097","\042\091\097\093\042"))assert(not T("\046\097","\042\091\097\093"))assert(not T("\046\097","\042\097\042"))assert(not T("\046\097","\042\097"))assert(not T("\046\097","\042\040\097\124\098\041"))end)end)describe("\112\108\117\115 - \"\043\"",function()it("\115\104\111\117\108\100 \109\097\116\099\104 \108\105\116\101\114\097\108 \043",function()assert(T("\043","\042"))assert(T("\047\043","\047\042"))assert(T("\043\047\043","\042\047\042"))assert(T("\043\047\043\047","\042\047\042\047"))assert(T("\047\043","\047\043"))assert(T("\047\043","\047\063"))assert(T("\043\047\043","\063\047\063"))assert(T("\043\047\043","\043\047\043"))assert(T("\102\111\111\043\047\098\097\114\043","\042\047\042"))end)itFIXME("\115\104\111\117\108\100 \115\117\112\112\111\114\116 \112\108\117\115 \115\105\103\110\115 \116\104\097\116 \102\111\108\108\111\119 \098\114\097\099\107\101\116\115 \040\097\110\100 \110\111\116 \101\115\099\097\112\101 \116\104\101\109\041",function()assert(T("\097","\091\097\093\043"))assert(T("\097\097","\091\097\093\043"))assert(T("\097\097\097","\091\097\093\043"))assert(T("\097\122","\091\097-\122\093\043"))assert(T("\122\122\122","\091\097-\122\093\043"))end)it("\115\104\111\117\108\100 \110\111\116 \101\115\099\097\112\101 \112\108\117\115 \115\105\103\110\115 \116\104\097\116 \102\111\108\108\111\119 \112\097\114\101\110\115",function()assert(T("\097","\040\097\041\043"))assert(T("\097\098","\040\097\124\098\041\043"))assert(T("\097\097","\040\097\041\043"))assert(T("\097\097\097\098","\040\097\124\098\041\043"))assert(T("\097\097\097\098\098\098","\040\097\124\098\041\043"))end)it("\115\104\111\117\108\100 \101\115\099\097\112\101 \112\108\117\115 \115\105\103\110\115 \116\111 \109\097\116\099\104 \115\116\114\105\110\103 \108\105\116\101\114\097\108\115",function()assert(T("\097\043\098\047\115\114\099\047\103\108\105\109\105\110\105\046\106\115","\097\043\098\047\115\114\099\047\042\046\106\115"))assert(T("\043\098\047\115\114\099\047\103\108\105\109\105\110\105\046\106\115","\043\098\047\115\114\099\047\042\046\106\115"))assert(T("\099\111\102\102\101\101\043\047\115\114\099\047\103\108\105\109\105\110\105\046\106\115","\099\111\102\102\101\101\043\047\115\114\099\047\042\046\106\115"))assert(T("\099\111\102\102\101\101\043\047\115\114\099\047\103\108\105\109\105\110\105\046\106\115","\099\111\102\102\101\101\043\047\115\114\099\047\042\046\106\115"))assert(T("\099\111\102\102\101\101\043\047\115\114\099\047\103\108\105\109\105\110\105\046\106\115","\099\111\102\102\101\101\043\047\115\114\099\047\042"))end)itFIXME("\115\104\111\117\108\100 \110\111\116 \101\115\099\097\112\101 \043 \102\111\108\108\111\119\105\110\103 \098\114\097\099\107\101\116\115",function()assert(T("\097","\091\097\093\043"))assert(T("\097\097","\091\097\093\043"))assert(T("\097\097\097","\091\097\093\043"))assert(T("\097\122","\091\097-\122\093\043"))assert(T("\122\122\122","\091\097-\122\093\043"))end)it("\115\104\111\117\108\100 \110\111\116 \101\115\099\097\112\101 \043 \102\111\108\108\111\119\105\110\103 \112\097\114\101\110\115",function()assert(T("\097","\040\097\041\043"))assert(T("\097\098","\040\097\124\098\041\043"))assert(T("\097\097","\040\097\041\043"))assert(T("\097\097\097\098","\040\097\124\098\041\043"))assert(T("\097\097\097\098\098\098","\040\097\124\098\041\043"))end)end)describe("\100\111\108\108\097\114 \036",function()it("\115\104\111\117\108\100 \109\097\116\099\104 \100\111\108\108\097\114 \115\105\103\110\115",function()assert(not T("\036","\033\040\036\041"))assert(not T("\036","\033\036"))assert(T("\036\036","\033\036"))assert(T("\036\036","\033\040\036\041"))assert(T("\036\036\036","\033\040\036\041"))assert(T("\094","\033\040\036\041"))assert(T("\036","\033\040\036\036\041"))assert(not T("\036\036","\033\040\036\036\041"))assert(T("\036\036\036","\033\040\036\036\041"))assert(T("\094","\033\040\036\036\041"))assert(not T("\036","\033\040\036\042\041"))assert(not T("\036\036","\033\040\036\042\041"))assert(not T("\036\036\036","\033\040\036\042\041"))assert(T("\094","\033\040\036\042\041"))assert(T("\036","\042"))assert(T("\036\036","\042"))assert(T("\036\036\036","\042"))assert(T("\094","\042"))assert(T("\036","\036\042"))assert(T("\036\036","\036\042"))assert(T("\036\036\036","\036\042"))assert(not T("\094","\036\042"))assert(T("\036","\042\036\042"))assert(T("\036\036","\042\036\042"))assert(T("\036\036\036","\042\036\042"))assert(not T("\094","\042\036\042"))assert(T("\036","\042\036"))assert(T("\036\036","\042\036"))assert(T("\036\036\036","\042\036"))assert(not T("\094","\042\036"))assert(not T("\036","\063\036"))assert(T("\036\036","\063\036"))assert(not T("\036\036\036","\063\036"))assert(not T("\094","\063\036"))end)end)describe("\099\097\114\101\116 \094",function()it("\115\104\111\117\108\100 \109\097\116\099\104 \099\097\114\101\116\115",function()assert(T("\094","\094"))assert(T("\094\047\102\111\111","\094\047\042"))assert(T("\094\047\102\111\111","\094\047\042"))assert(T("\102\111\111\094","\042\094"))assert(T("\094\102\111\111\047\102\111\111","\094\102\111\111\047\042"))assert(T("\102\111\111\094\047\102\111\111","\102\111\111\094\047\042"))assert(not T("\094","\033\040\094\041"))assert(T("\094\094","\033\040\094\041"))assert(T("\094\094\094","\033\040\094\041"))assert(T("\038","\033\040\094\041"))assert(T("\094","\033\040\094\094\041"))assert(not T("\094\094","\033\040\094\094\041"))assert(T("\094\094\094","\033\040\094\094\041"))assert(T("\038","\033\040\094\094\041"))assert(not T("\094","\033\040\094\042\041"))assert(not T("\094\094","\033\040\094\042\041"))assert(not T("\094\094\094","\033\040\094\042\041"))assert(T("\038","\033\040\094\042\041"))assert(T("\094","\042"))assert(T("\094\094","\042"))assert(T("\094\094\094","\042"))assert(T("\038","\042"))assert(T("\094","\094\042"))assert(T("\094\094","\094\042"))assert(T("\094\094\094","\094\042"))assert(not T("\038","\094\042"))assert(T("\094","\042\094\042"))assert(T("\094\094","\042\094\042"))assert(T("\094\094\094","\042\094\042"))assert(not T("\038","\042\094\042"))assert(T("\094","\042\094"))assert(T("\094\094","\042\094"))assert(T("\094\094\094","\042\094"))assert(not T("\038","\042\094"))assert(not T("\094","\063\094"))assert(T("\094\094","\063\094"))assert(not T("\094\094\094","\063\094"))assert(not T("\038","\063\094"))end)end)describe("\109\105\120\101\100 \115\112\101\099\105\097\108 \099\104\097\114\097\099\116\101\114\115",function()it("\115\104\111\117\108\100 \109\097\116\099\104 \115\112\101\099\105\097\108 \099\104\097\114\097\099\116\101\114\115 \105\110 \112\097\116\104\115",function()assert(T("\109\121\047\102\111\108\100\101\114 \043\049","\042\047\042"))assert(T("\109\121\047\102\111\108\100\101\114 -\049","\042\047\042"))assert(T("\109\121\047\102\111\108\100\101\114 \042\049","\042\047\042"))assert(T("\109\121\047\102\111\108\100\101\114","\042\047\042"))assert(T("\109\121\047\102\111\108\100\101\114\043\102\111\111\043\098\097\114\038\098\097\122","\042\047\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \036\049\046\048\048","\042\047\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \094\049\046\048\048","\042\047\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \037\049\046\048\048","\042\047\042"))assert(T("\109\121\047\102\111\108\100\101\114 \043\049","\042\047\033\040\042\037\041\042"))assert(T("\109\121\047\102\111\108\100\101\114 -\049","\042\047\033\040\042\037\041\042"))assert(T("\109\121\047\102\111\108\100\101\114 \042\049","\042\047\033\040\042\037\041\042"))assert(T("\109\121\047\102\111\108\100\101\114","\042\047\033\040\042\037\041\042"))assert(T("\109\121\047\102\111\108\100\101\114\043\102\111\111\043\098\097\114\038\098\097\122","\042\047\033\040\042\037\041\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \036\049\046\048\048","\042\047\033\040\042\037\041\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \094\049\046\048\048","\042\047\033\040\042\037\041\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \037\049\046\048\048","\042\047\033\040\042\037\041\042"))assert(not T("\109\121\047\102\111\108\100\101\114 \043\049","\042\047\042\036\042"))assert(not T("\109\121\047\102\111\108\100\101\114 -\049","\042\047\042\036\042"))assert(not T("\109\121\047\102\111\108\100\101\114 \042\049","\042\047\042\036\042"))assert(not T("\109\121\047\102\111\108\100\101\114","\042\047\042\036\042"))assert(not T("\109\121\047\102\111\108\100\101\114\043\102\111\111\043\098\097\114\038\098\097\122","\042\047\042\036\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \036\049\046\048\048","\042\047\042\036\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \094\049\046\048\048","\042\047\042\036\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \037\049\046\048\048","\042\047\042\036\042"))assert(not T("\109\121\047\102\111\108\100\101\114 \043\049","\042\047\042\094\042"))assert(not T("\109\121\047\102\111\108\100\101\114 -\049","\042\047\042\094\042"))assert(not T("\109\121\047\102\111\108\100\101\114 \042\049","\042\047\042\094\042"))assert(not T("\109\121\047\102\111\108\100\101\114","\042\047\042\094\042"))assert(not T("\109\121\047\102\111\108\100\101\114\043\102\111\111\043\098\097\114\038\098\097\122","\042\047\042\094\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \036\049\046\048\048","\042\047\042\094\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \094\049\046\048\048","\042\047\042\094\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \037\049\046\048\048","\042\047\042\094\042"))assert(not T("\109\121\047\102\111\108\100\101\114 \043\049","\042\047\042\038\042"))assert(not T("\109\121\047\102\111\108\100\101\114 -\049","\042\047\042\038\042"))assert(not T("\109\121\047\102\111\108\100\101\114 \042\049","\042\047\042\038\042"))assert(not T("\109\121\047\102\111\108\100\101\114","\042\047\042\038\042"))assert(T("\109\121\047\102\111\108\100\101\114\043\102\111\111\043\098\097\114\038\098\097\122","\042\047\042\038\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \036\049\046\048\048","\042\047\042\038\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \094\049\046\048\048","\042\047\042\038\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \037\049\046\048\048","\042\047\042\038\042"))assert(T("\109\121\047\102\111\108\100\101\114 \043\049","\042\047\042\043\042"))assert(not T("\109\121\047\102\111\108\100\101\114 -\049","\042\047\042\043\042"))assert(not T("\109\121\047\102\111\108\100\101\114 \042\049","\042\047\042\043\042"))assert(not T("\109\121\047\102\111\108\100\101\114","\042\047\042\043\042"))assert(T("\109\121\047\102\111\108\100\101\114\043\102\111\111\043\098\097\114\038\098\097\122","\042\047\042\043\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \036\049\046\048\048","\042\047\042\043\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \094\049\046\048\048","\042\047\042\043\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \037\049\046\048\048","\042\047\042\043\042"))assert(not T("\109\121\047\102\111\108\100\101\114 \043\049","\042\047\042-\042"))assert(T("\109\121\047\102\111\108\100\101\114 -\049","\042\047\042-\042"))assert(not T("\109\121\047\102\111\108\100\101\114 \042\049","\042\047\042-\042"))assert(not T("\109\121\047\102\111\108\100\101\114","\042\047\042-\042"))assert(not T("\109\121\047\102\111\108\100\101\114\043\102\111\111\043\098\097\114\038\098\097\122","\042\047\042-\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \036\049\046\048\048","\042\047\042-\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \094\049\046\048\048","\042\047\042-\042"))assert(T("\109\121\047\102\111\108\100\101\114 - \037\049\046\048\048","\042\047\042-\042"))assert(not T("\109\121\047\102\111\108\100\101\114 \043\049","\042\047\042\092\042\042"))assert(not T("\109\121\047\102\111\108\100\101\114 -\049","\042\047\042\092\042\042"))assert(T("\109\121\047\102\111\108\100\101\114 \042\049","\042\047\042\092\042\042"))assert(not T("\109\121\047\102\111\108\100\101\114","\042\047\042\092\042\042"))assert(not T("\109\121\047\102\111\108\100\101\114\043\102\111\111\043\098\097\114\038\098\097\122","\042\047\042\092\042\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \036\049\046\048\048","\042\047\042\092\042\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \094\049\046\048\048","\042\047\042\092\042\042"))assert(not T("\109\121\047\102\111\108\100\101\114 - \037\049\046\048\048","\042\047\042\092\042\042"))end)end)end)end
-- ROBLOX upstream: https://github.com/micromatch/picomatch/tree/2.3.1/test/special-characters.js

return function()
	local CurrentModule = script.Parent
	local PicomatchModule = CurrentModule.Parent
	local Packages = PicomatchModule.Parent

	local jestExpect = require(Packages.Dev.JestGlobals).expect

	-- ROBLOX deviation START: not supported in Lua
	-- local path = require("path")

	local support = require(CurrentModule.support)
	local Picomatch = require(PicomatchModule)
	local isMatch, makeRe = Picomatch.isMatch, Picomatch.makeRe
	describe("special characters", function()
		beforeAll(function()
			return support.resetPathSep()
		end)
		afterAll(function()
			return support.resetPathSep()
		end)
		afterEach(function()
			return support.resetPathSep()
		end)

		describe("numbers", function()
			it("should match numbers in the input string", function()
				assert(not isMatch("1", "*/*"))
				assert(isMatch("1/1", "*/*"))
				assert(isMatch("1/2", "*/*"))
				assert(not isMatch("1/1/1", "*/*"))
				assert(not isMatch("1/1/2", "*/*"))
				assert(not isMatch("1", "*/*/1"))
				assert(not isMatch("1/1", "*/*/1"))
				assert(not isMatch("1/2", "*/*/1"))
				assert(isMatch("1/1/1", "*/*/1"))
				assert(not isMatch("1/1/2", "*/*/1"))
				assert(not isMatch("1", "*/*/2"))
				assert(not isMatch("1/1", "*/*/2"))
				assert(not isMatch("1/2", "*/*/2"))
				assert(not isMatch("1/1/1", "*/*/2"))
				assert(isMatch("1/1/2", "*/*/2"))
			end)
		end)

		describe("qmarks", function()
			it("should match literal ? in the input string", function()
				assert(isMatch("?", "*"))
				assert(isMatch("/?", "/*"))
				assert(isMatch("?/?", "*/*"))
				assert(isMatch("?/?/", "*/*/"))
				assert(isMatch("/?", "/?"))
				assert(isMatch("?/?", "?/?"))
				assert(isMatch("foo?/bar?", "*/*"))
			end)

			it("should not match slashes with qmarks", function()
				assert(not isMatch("aaa/bbb", "aaa?bbb"))
			end)

			it("should match literal ? with qmarks", function()
				assert(not isMatch("?", "??"))
				assert(not isMatch("?", "???"))
				assert(not isMatch("??", "?"))
				assert(not isMatch("??", "???"))
				assert(not isMatch("???", "?"))
				assert(not isMatch("???", "??"))
				assert(not isMatch("ac?", "ab?"))
				assert(isMatch("?", "?*"))
				assert(isMatch("??", "?*"))
				assert(isMatch("???", "?*"))
				assert(isMatch("????", "?*"))
				assert(isMatch("?", "?"))
				assert(isMatch("??", "??"))
				assert(isMatch("???", "???"))
				assert(isMatch("ab?", "ab?"))
			end)

			it("should match other non-slash characters with qmarks", function()
				assert(not isMatch("/a/", "?"))
				assert(not isMatch("/a/", "??"))
				assert(not isMatch("/a/", "???"))
				assert(not isMatch("/a/b/", "??"))
				assert(not isMatch("aaa/bbb", "aaa?bbb"))
				assert(not isMatch("aaa//bbb", "aaa?bbb"))
				assert(not isMatch("aaa\\\\bbb", "aaa?bbb"))
				assert(isMatch("acb/", "a?b/"))
				assert(isMatch("acdb/", "a??b/"))
				assert(isMatch("/acb", "/a?b"))
			end)

			it("should match non-slash characters when ? is escaped", function()
				assert(not isMatch("acb/", "a\\?b/"))
				assert(not isMatch("acdb/", "a\\?\\?b/"))
				assert(not isMatch("/acb", "/a\\?b"))
			end)

			it("should match one character per question mark", function()
				assert(isMatch("a", "?"))
				assert(not isMatch("aa", "?"))
				assert(not isMatch("ab", "?"))
				assert(not isMatch("aaa", "?"))
				assert(not isMatch("abcdefg", "?"))
				assert(not isMatch("a", "??"))
				assert(isMatch("aa", "??"))
				assert(isMatch("ab", "??"))
				assert(not isMatch("aaa", "??"))
				assert(not isMatch("abcdefg", "??"))
				assert(not isMatch("a", "???"))
				assert(not isMatch("aa", "???"))
				assert(not isMatch("ab", "???"))
				assert(isMatch("aaa", "???"))
				assert(not isMatch("abcdefg", "???"))
				assert(not isMatch("aaa", "a?c"))
				assert(isMatch("aac", "a?c"))
				assert(isMatch("abc", "a?c"))
				assert(not isMatch("a", "ab?"))
				assert(not isMatch("aa", "ab?"))
				assert(not isMatch("ab", "ab?"))
				assert(not isMatch("ac", "ab?"))
				assert(not isMatch("abcd", "ab?"))
				assert(not isMatch("abbb", "ab?"))
				assert(isMatch("acb", "a?b"))
				assert(not isMatch("a/bb/c/dd/e.md", "a/?/c/?/e.md"))
				assert(isMatch("a/bb/c/dd/e.md", "a/??/c/??/e.md"))
				assert(not isMatch("a/bbb/c.md", "a/??/c.md"))
				assert(isMatch("a/b/c.md", "a/?/c.md"))
				assert(isMatch("a/b/c/d/e.md", "a/?/c/?/e.md"))
				assert(not isMatch("a/b/c/d/e.md", "a/?/c/???/e.md"))
				assert(isMatch("a/b/c/zzz/e.md", "a/?/c/???/e.md"))
				assert(not isMatch("a/bb/c.md", "a/?/c.md"))
				assert(isMatch("a/bb/c.md", "a/??/c.md"))
				assert(isMatch("a/bbb/c.md", "a/???/c.md"))
				assert(isMatch("a/bbbb/c.md", "a/????/c.md"))
			end)

			it("should enforce one character per qmark even when preceded by stars", function()
				assert(not isMatch("a", "*??"))
				assert(not isMatch("aa", "*???"))
				assert(isMatch("aaa", "*???"))
				assert(not isMatch("a", "*****??"))
				assert(not isMatch("aa", "*****???"))
				assert(isMatch("aaa", "*****???"))
			end)

			it("should support qmarks and stars", function()
				assert(not isMatch("aaa", "a*?c"))
				assert(isMatch("aac", "a*?c"))
				assert(isMatch("abc", "a*?c"))
				assert(isMatch("abc", "a**?c"))
				assert(not isMatch("abb", "a**?c"))
				assert(isMatch("acc", "a**?c"))
				assert(isMatch("abc", "a*****?c"))
				assert(isMatch("a", "*****?"))
				assert(isMatch("aa", "*****?"))
				assert(isMatch("abc", "*****?"))
				assert(isMatch("zzz", "*****?"))
				assert(isMatch("bbb", "*****?"))
				assert(isMatch("aaaa", "*****?"))
				assert(not isMatch("a", "*****??"))
				assert(isMatch("aa", "*****??"))
				assert(isMatch("abc", "*****??"))
				assert(isMatch("zzz", "*****??"))
				assert(isMatch("bbb", "*****??"))
				assert(isMatch("aaaa", "*****??"))
				assert(not isMatch("a", "?*****??"))
				assert(not isMatch("aa", "?*****??"))
				assert(isMatch("abc", "?*****??"))
				assert(isMatch("zzz", "?*****??"))
				assert(isMatch("bbb", "?*****??"))
				assert(isMatch("aaaa", "?*****??"))
				assert(isMatch("abc", "?*****?c"))
				assert(not isMatch("abb", "?*****?c"))
				assert(not isMatch("zzz", "?*****?c"))
				assert(isMatch("abc", "?***?****c"))
				assert(not isMatch("bbb", "?***?****c"))
				assert(not isMatch("zzz", "?***?****c"))
				assert(isMatch("abc", "?***?****?"))
				assert(isMatch("bbb", "?***?****?"))
				assert(isMatch("zzz", "?***?****?"))
				assert(isMatch("abc", "?***?****"))
				assert(isMatch("abc", "*******c"))
				assert(isMatch("abc", "*******?"))
				assert(isMatch("abcdecdhjk", "a*cd**?**??k"))
				assert(isMatch("abcdecdhjk", "a**?**cd**?**??k"))
				assert(isMatch("abcdecdhjk", "a**?**cd**?**??k***"))
				assert(isMatch("abcdecdhjk", "a**?**cd**?**??***k"))
				assert(isMatch("abcdecdhjk", "a**?**cd**?**??***k**"))
				assert(isMatch("abcdecdhjk", "a****c**?**??*****"))
			end)

			it("should support qmarks, stars and slashes", function()
				assert(not isMatch("a/b/c/d/e.md", "a/?/c/?/*/e.md"))
				assert(isMatch("a/b/c/d/e/e.md", "a/?/c/?/*/e.md"))
				assert(isMatch("a/b/c/d/efghijk/e.md", "a/?/c/?/*/e.md"))
				assert(isMatch("a/b/c/d/efghijk/e.md", "a/?/**/e.md"))
				assert(not isMatch("a/bb/e.md", "a/?/e.md"))
				assert(isMatch("a/bb/e.md", "a/??/e.md"))
				assert(not isMatch("a/bb/e.md", "a/?/**/e.md"))
				assert(isMatch("a/b/ccc/e.md", "a/?/**/e.md"))
				assert(isMatch("a/b/c/d/efghijk/e.md", "a/*/?/**/e.md"))
				assert(isMatch("a/b/c/d/efgh.ijk/e.md", "a/*/?/**/e.md"))
				assert(isMatch("a/b.bb/c/d/efgh.ijk/e.md", "a/*/?/**/e.md"))
				assert(isMatch("a/bbb/c/d/efgh.ijk/e.md", "a/*/?/**/e.md"))
			end)

			it("should match non-leading dots", function()
				assert(isMatch("aaa.bbb", "aaa?bbb"))
			end)

			it("should not match leading dots", function()
				assert(not isMatch(".aaa/bbb", "?aaa/bbb"))
				assert(not isMatch("aaa/.bbb", "aaa/?bbb"))
			end)

			it("should match characters preceding a dot", function()
				assert(isMatch("a/bbb/abcd.md", "a/*/ab??.md"))
				assert(isMatch("a/bbb/abcd.md", "a/bbb/ab??.md"))
				assert(isMatch("a/bbb/abcd.md", "a/bbb/ab???md"))
			end)
		end)

		describe("parentheses ()", function()
			it("should match literal parentheses in the input string", function()
				assert(not isMatch("my/folder (Work, Accts)", "/*"))
				assert(isMatch("my/folder (Work, Accts)", "*/*"))
				assert(isMatch("my/folder (Work, Accts)", "*/*,*"))
				assert(isMatch("my/folder (Work, Accts)", "*/*(W*, *)*"))
				assert(isMatch("my/folder/(Work, Accts)", "**/*(W*, *)*"))
				assert(not isMatch("my/folder/(Work, Accts)", "*/*(W*, *)*"))
				assert(isMatch("foo(bar)baz", "foo*baz"))
			end)

			itFIXME("should match literal parens with brackets", function()
				assert(isMatch("foo(bar)baz", "foo[bar()]+baz"))
			end)

			it("should throw an error on imbalanced, unescaped parens", function()
				local opts = { strictBrackets = true }
				jestExpect(function()
					return makeRe("*)", opts)
				end).toThrowError('Missing opening: "("')
				jestExpect(function()
					return makeRe("*(", opts)
				end).toThrowError('Missing closing: ")"')
			end)

			it("should throw an error on imbalanced, unescaped brackets", function()
				local opts = { strictBrackets = true }
				jestExpect(function()
					return makeRe("*]", opts)
				end).toThrowError('Missing opening: "["')
				jestExpect(function()
					return makeRe("*[", opts)
				end).toThrowError('Missing closing: "]"')
			end)
		end)

		describe("path characters", function()
			it("should match windows drives with globstars", function()
				assert(isMatch("bar/", "**"))
				assert(isMatch("A://", "**"))
				assert(isMatch("B:foo/a/b/c/d", "**"))
				assert(isMatch("C:/Users/", "**"))
				assert(isMatch("c:\\", "**"))
				assert(isMatch("C:\\Users\\", "**"))
				assert(isMatch("C:cwd/another", "**"))
				assert(isMatch("C:cwd\\another", "**"))
			end)
			-- ROBLOX deviation START: not supported in Lua
			itSKIP("should not match multiple windows directories with a single star", function()
				-- path.sep = "\\"
				-- assert(isMatch("c:\\", "*{,/}"))
				-- assert(not isMatch("C:\\Users\\", "*"))
				-- assert(not isMatch("C:cwd\\another", "*"))
				-- path.sep = "/"
			end)
			itSKIP("should match mixed slashes on windows", function()
				-- path.sep = "\\"
				-- assert(isMatch("//C://user\\docs\\Letter.txt", "**"))
				-- assert(isMatch("//C:\\\\user/docs/Letter.txt", "**"))
				-- assert(isMatch(":\\", "*{,/}"))
				-- assert(isMatch(":\\", ":*{,/}"))
				-- assert(isMatch("\\\\foo/bar", "**"))
				-- assert(isMatch("\\\\foo/bar", "//*/*"))
				-- assert(isMatch("\\\\unc\\admin$", "**"))
				-- assert(isMatch("\\\\unc\\admin$", "//*/*$"))
				-- assert(isMatch("\\\\unc\\admin$\\system32", "//*/*$/*32"))
				-- assert(isMatch("\\\\unc\\share\\foo", "//u*/s*/f*"))
				-- assert(isMatch("foo\\bar\\baz", "f*/*/*"))
				-- path.sep = "/"
			end)
			-- ROBLOX deviation END
			itFIXME("should match mixed slashes when options.windows is true", function()
				assert(isMatch("//C://user\\docs\\Letter.txt", "**", { windows = true }))
				assert(isMatch("//C:\\\\user/docs/Letter.txt", "**", { windows = true }))
				assert(isMatch(":\\", "*{,/}", { windows = true }))
				assert(isMatch(":\\", ":*{,/}", { windows = true }))
				assert(isMatch("\\\\foo/bar", "**", { windows = true }))
				assert(isMatch("\\\\foo/bar", "//*/*", { windows = true }))
				assert(isMatch("\\\\unc\\admin$", "//**", { windows = true }))
				assert(isMatch("\\\\unc\\admin$", "//*/*$", { windows = true }))
				assert(isMatch("\\\\unc\\admin$\\system32", "//*/*$/*32", { windows = true }))
				assert(isMatch("\\\\unc\\share\\foo", "//u*/s*/f*", { windows = true }))
				assert(isMatch("\\\\\\\\\\\\unc\\share\\foo", "/\\{1,\\}u*/s*/f*", { windows = true, unescape = true }))
				assert(isMatch("foo\\bar\\baz", "f*/*/*", { windows = true }))
				assert(isMatch("//*:/**", "**"))
				assert(not isMatch("//server/file", "//*"))
				assert(isMatch("//server/file", "/**"))
				assert(isMatch("//server/file", "//**"))
				assert(isMatch("//server/file", "**"))
				assert(isMatch("//UNC//Server01//user//docs//Letter.txt", "**"))
				assert(isMatch("/foo", "**"))
				assert(isMatch("/foo/a/b/c/d", "**"))
				assert(isMatch("/foo/bar", "**"))
				assert(isMatch("/home/foo", "**"))
				assert(isMatch("/home/foo/..", "**/.."))
				assert(isMatch("/user/docs/Letter.txt", "**"))
				assert(isMatch("directory\\directory", "**"))
				assert(isMatch("a/b/c.js", "**"))
				assert(isMatch("directory/directory", "**"))
				assert(isMatch("foo/bar", "**"))
			end)

			it("should match any character zero or more times, except for /", function()
				assert(not isMatch("foo", "*a*"))
				assert(not isMatch("foo", "*r"))
				assert(not isMatch("foo", "b*"))
				assert(not isMatch("foo/bar", "*"))
				assert(isMatch("foo/bar", "*/*"))
				assert(not isMatch("foo/bar/baz", "*/*"))
				assert(isMatch("bar", "*a*"))
				assert(isMatch("bar", "*r"))
				assert(isMatch("bar", "b*"))
				assert(isMatch("foo/bar/baz", "*/*/*"))
			end)

			it("should match dashes surrounded by spaces", function()
				assert(isMatch("my/folder - 1", "*/*"))
				assert(isMatch("my/folder - copy (1)", "*/*"))
				assert(isMatch("my/folder - copy [1]", "*/*"))
				assert(isMatch("my/folder - foo + bar - copy [1]", "*/*"))
				assert(not isMatch("my/folder - foo + bar - copy [1]", "*"))
				assert(isMatch("my/folder - 1", "*/*-*"))
				assert(isMatch("my/folder - copy (1)", "*/*-*"))
				assert(isMatch("my/folder - copy [1]", "*/*-*"))
				assert(isMatch("my/folder - foo + bar - copy [1]", "*/*-*"))
				assert(isMatch("my/folder - 1", "*/*1"))
				assert(not isMatch("my/folder - copy (1)", "*/*1"))
			end)
		end)

		describe("brackets", function()
			itFIXME("should support square brackets in globs", function()
				assert(isMatch("foo/bar - 1", "**/*[1]"))
				assert(not isMatch("foo/bar - copy (1)", "**/*[1]"))
				assert(not isMatch("foo/bar (1)", "**/*[1]"))
				assert(not isMatch("foo/bar (4)", "**/*[1]"))
				assert(not isMatch("foo/bar (7)", "**/*[1]"))
				assert(not isMatch("foo/bar (42)", "**/*[1]"))
				assert(isMatch("foo/bar - copy [1]", "**/*[1]"))
				assert(isMatch("foo/bar - foo + bar - copy [1]", "**/*[1]"))
			end)

			it("should match (escaped) bracket literals", function()
				assert(isMatch("a [b]", "a \\[b\\]"))
				assert(isMatch("a [b] c", "a [b] c"))
				assert(isMatch("a [b]", "a \\[b\\]*"))
				assert(isMatch("a [bc]", "a \\[bc\\]*"))
				assert(not isMatch("a [b]", "a \\[b\\].*"))
				assert(isMatch("a [b].js", "a \\[b\\].*"))
				assert(not isMatch("foo/bar - 1", "**/*\\[*\\]"))
				assert(not isMatch("foo/bar - copy (1)", "**/*\\[*\\]"))
				assert(not isMatch("foo/bar (1)", "**/*\\[*\\]"))
				assert(not isMatch("foo/bar (4)", "**/*\\[*\\]"))
				assert(not isMatch("foo/bar (7)", "**/*\\[*\\]"))
				assert(not isMatch("foo/bar (42)", "**/*\\[*\\]"))
				assert(isMatch("foo/bar - copy [1]", "**/*\\[*\\]"))
				assert(isMatch("foo/bar - foo + bar - copy [1]", "**/*\\[*\\]"))
				assert(not isMatch("foo/bar - 1", "**/*\\[1\\]"))
				assert(not isMatch("foo/bar - copy (1)", "**/*\\[1\\]"))
				assert(not isMatch("foo/bar (1)", "**/*\\[1\\]"))
				assert(not isMatch("foo/bar (4)", "**/*\\[1\\]"))
				assert(not isMatch("foo/bar (7)", "**/*\\[1\\]"))
				assert(not isMatch("foo/bar (42)", "**/*\\[1\\]"))
				assert(isMatch("foo/bar - copy [1]", "**/*\\[1\\]"))
				assert(isMatch("foo/bar - foo + bar - copy [1]", "**/*\\[1\\]"))
				assert(not isMatch("foo/bar - 1", "*/*\\[*\\]"))
				assert(not isMatch("foo/bar - copy (1)", "*/*\\[*\\]"))
				assert(not isMatch("foo/bar (1)", "*/*\\[*\\]"))
				assert(not isMatch("foo/bar (4)", "*/*\\[*\\]"))
				assert(not isMatch("foo/bar (7)", "*/*\\[*\\]"))
				assert(not isMatch("foo/bar (42)", "*/*\\[*\\]"))
				assert(isMatch("foo/bar - copy [1]", "*/*\\[*\\]"))
				assert(isMatch("foo/bar - foo + bar - copy [1]", "*/*\\[*\\]"))
				assert(isMatch("a [b]", "a \\[b\\]"))
				assert(isMatch("a [b] c", "a [b] c"))
				assert(isMatch("a [b]", "a \\[b\\]*"))
				assert(isMatch("a [bc]", "a \\[bc\\]*"))
				assert(not isMatch("a [b]", "a \\[b\\].*"))
				assert(isMatch("a [b].js", "a \\[b\\].*"))
			end)
		end)

		describe('star - "*"', function()
			it("should match literal *", function()
				assert(isMatch("*", "*"))
				assert(isMatch("*/*", "*/*"))
				assert(isMatch("*/*", "?/?"))
				assert(isMatch("*/*/", "*/*/"))
				assert(isMatch("/*", "/*"))
				assert(isMatch("/*", "/?"))
				assert(isMatch("foo*/bar*", "*/*"))
			end)

			itFIXME("should support stars following brackets", function()
				assert(isMatch("a", "[a]*"))
				assert(isMatch("aa", "[a]*"))
				assert(isMatch("aaa", "[a]*"))
				assert(isMatch("az", "[a-z]*"))
				assert(isMatch("zzz", "[a-z]*"))
			end)

			it("should support stars following parens", function()
				assert(isMatch("a", "(a)*"))
				assert(isMatch("ab", "(a|b)*"))
				assert(isMatch("aa", "(a)*"))
				assert(isMatch("aaab", "(a|b)*"))
				assert(isMatch("aaabbb", "(a|b)*"))
			end)

			it("should not match slashes with single stars", function()
				assert(not isMatch("a/b", "(a)*"))
				assert(not isMatch("a/b", "[a]*"))
				assert(not isMatch("a/b", "a*"))
				assert(not isMatch("a/b", "(a|b)*"))
			end)

			it("should not match dots with stars by default", function()
				assert(not isMatch(".a", "(a)*"))
				assert(not isMatch(".a", "*[a]*"))
				assert(not isMatch(".a", "*[a]"))
				assert(not isMatch(".a", "*a*"))
				assert(not isMatch(".a", "*a"))
				assert(not isMatch(".a", "*(a|b)"))
			end)
		end)

		describe('plus - "+"', function()
			it("should match literal +", function()
				assert(isMatch("+", "*"))
				assert(isMatch("/+", "/*"))
				assert(isMatch("+/+", "*/*"))
				assert(isMatch("+/+/", "*/*/"))
				assert(isMatch("/+", "/+"))
				assert(isMatch("/+", "/?"))
				assert(isMatch("+/+", "?/?"))
				assert(isMatch("+/+", "+/+"))
				assert(isMatch("foo+/bar+", "*/*"))
			end)

			itFIXME("should support plus signs that follow brackets (and not escape them)", function()
				assert(isMatch("a", "[a]+"))
				assert(isMatch("aa", "[a]+"))
				assert(isMatch("aaa", "[a]+"))
				assert(isMatch("az", "[a-z]+"))
				assert(isMatch("zzz", "[a-z]+"))
			end)

			it("should not escape plus signs that follow parens", function()
				assert(isMatch("a", "(a)+"))
				assert(isMatch("ab", "(a|b)+"))
				assert(isMatch("aa", "(a)+"))
				assert(isMatch("aaab", "(a|b)+"))
				assert(isMatch("aaabbb", "(a|b)+"))
			end)

			it("should escape plus signs to match string literals", function()
				assert(isMatch("a+b/src/glimini.js", "a+b/src/*.js"))
				assert(isMatch("+b/src/glimini.js", "+b/src/*.js"))
				assert(isMatch("coffee+/src/glimini.js", "coffee+/src/*.js"))
				assert(isMatch("coffee+/src/glimini.js", "coffee+/src/*.js"))
				assert(isMatch("coffee+/src/glimini.js", "coffee+/src/*"))
			end)

			itFIXME("should not escape + following brackets", function()
				assert(isMatch("a", "[a]+"))
				assert(isMatch("aa", "[a]+"))
				assert(isMatch("aaa", "[a]+"))
				assert(isMatch("az", "[a-z]+"))
				assert(isMatch("zzz", "[a-z]+"))
			end)

			it("should not escape + following parens", function()
				assert(isMatch("a", "(a)+"))
				assert(isMatch("ab", "(a|b)+"))
				assert(isMatch("aa", "(a)+"))
				assert(isMatch("aaab", "(a|b)+"))
				assert(isMatch("aaabbb", "(a|b)+"))
			end)
		end)

		describe("dollar $", function()
			it("should match dollar signs", function()
				assert(not isMatch("$", "!($)"))
				assert(not isMatch("$", "!$"))
				assert(isMatch("$$", "!$"))
				assert(isMatch("$$", "!($)"))
				assert(isMatch("$$$", "!($)"))
				assert(isMatch("^", "!($)"))
				assert(isMatch("$", "!($$)"))
				assert(not isMatch("$$", "!($$)"))
				assert(isMatch("$$$", "!($$)"))
				assert(isMatch("^", "!($$)"))
				assert(not isMatch("$", "!($*)"))
				assert(not isMatch("$$", "!($*)"))
				assert(not isMatch("$$$", "!($*)"))
				assert(isMatch("^", "!($*)"))
				assert(isMatch("$", "*"))
				assert(isMatch("$$", "*"))
				assert(isMatch("$$$", "*"))
				assert(isMatch("^", "*"))
				assert(isMatch("$", "$*"))
				assert(isMatch("$$", "$*"))
				assert(isMatch("$$$", "$*"))
				assert(not isMatch("^", "$*"))
				assert(isMatch("$", "*$*"))
				assert(isMatch("$$", "*$*"))
				assert(isMatch("$$$", "*$*"))
				assert(not isMatch("^", "*$*"))
				assert(isMatch("$", "*$"))
				assert(isMatch("$$", "*$"))
				assert(isMatch("$$$", "*$"))
				assert(not isMatch("^", "*$"))
				assert(not isMatch("$", "?$"))
				assert(isMatch("$$", "?$"))
				assert(not isMatch("$$$", "?$"))
				assert(not isMatch("^", "?$"))
			end)
		end)

		describe("caret ^", function()
			it("should match carets", function()
				assert(isMatch("^", "^"))
				assert(isMatch("^/foo", "^/*"))
				assert(isMatch("^/foo", "^/*"))
				assert(isMatch("foo^", "*^"))
				assert(isMatch("^foo/foo", "^foo/*"))
				assert(isMatch("foo^/foo", "foo^/*"))
				assert(not isMatch("^", "!(^)"))
				assert(isMatch("^^", "!(^)"))
				assert(isMatch("^^^", "!(^)"))
				assert(isMatch("&", "!(^)"))
				assert(isMatch("^", "!(^^)"))
				assert(not isMatch("^^", "!(^^)"))
				assert(isMatch("^^^", "!(^^)"))
				assert(isMatch("&", "!(^^)"))
				assert(not isMatch("^", "!(^*)"))
				assert(not isMatch("^^", "!(^*)"))
				assert(not isMatch("^^^", "!(^*)"))
				assert(isMatch("&", "!(^*)"))
				assert(isMatch("^", "*"))
				assert(isMatch("^^", "*"))
				assert(isMatch("^^^", "*"))
				assert(isMatch("&", "*"))
				assert(isMatch("^", "^*"))
				assert(isMatch("^^", "^*"))
				assert(isMatch("^^^", "^*"))
				assert(not isMatch("&", "^*"))
				assert(isMatch("^", "*^*"))
				assert(isMatch("^^", "*^*"))
				assert(isMatch("^^^", "*^*"))
				assert(not isMatch("&", "*^*"))
				assert(isMatch("^", "*^"))
				assert(isMatch("^^", "*^"))
				assert(isMatch("^^^", "*^"))
				assert(not isMatch("&", "*^"))
				assert(not isMatch("^", "?^"))
				assert(isMatch("^^", "?^"))
				assert(not isMatch("^^^", "?^"))
				assert(not isMatch("&", "?^"))
			end)
		end)

		describe("mixed special characters", function()
			it("should match special characters in paths", function()
				assert(isMatch("my/folder +1", "*/*"))
				assert(isMatch("my/folder -1", "*/*"))
				assert(isMatch("my/folder *1", "*/*"))
				assert(isMatch("my/folder", "*/*"))
				assert(isMatch("my/folder+foo+bar&baz", "*/*"))
				assert(isMatch("my/folder - $1.00", "*/*"))
				assert(isMatch("my/folder - ^1.00", "*/*"))
				assert(isMatch("my/folder - %1.00", "*/*"))
				assert(isMatch("my/folder +1", "*/!(*%)*"))
				assert(isMatch("my/folder -1", "*/!(*%)*"))
				assert(isMatch("my/folder *1", "*/!(*%)*"))
				assert(isMatch("my/folder", "*/!(*%)*"))
				assert(isMatch("my/folder+foo+bar&baz", "*/!(*%)*"))
				assert(isMatch("my/folder - $1.00", "*/!(*%)*"))
				assert(isMatch("my/folder - ^1.00", "*/!(*%)*"))
				assert(not isMatch("my/folder - %1.00", "*/!(*%)*"))
				assert(not isMatch("my/folder +1", "*/*$*"))
				assert(not isMatch("my/folder -1", "*/*$*"))
				assert(not isMatch("my/folder *1", "*/*$*"))
				assert(not isMatch("my/folder", "*/*$*"))
				assert(not isMatch("my/folder+foo+bar&baz", "*/*$*"))
				assert(isMatch("my/folder - $1.00", "*/*$*"))
				assert(not isMatch("my/folder - ^1.00", "*/*$*"))
				assert(not isMatch("my/folder - %1.00", "*/*$*"))
				assert(not isMatch("my/folder +1", "*/*^*"))
				assert(not isMatch("my/folder -1", "*/*^*"))
				assert(not isMatch("my/folder *1", "*/*^*"))
				assert(not isMatch("my/folder", "*/*^*"))
				assert(not isMatch("my/folder+foo+bar&baz", "*/*^*"))
				assert(not isMatch("my/folder - $1.00", "*/*^*"))
				assert(isMatch("my/folder - ^1.00", "*/*^*"))
				assert(not isMatch("my/folder - %1.00", "*/*^*"))
				assert(not isMatch("my/folder +1", "*/*&*"))
				assert(not isMatch("my/folder -1", "*/*&*"))
				assert(not isMatch("my/folder *1", "*/*&*"))
				assert(not isMatch("my/folder", "*/*&*"))
				assert(isMatch("my/folder+foo+bar&baz", "*/*&*"))
				assert(not isMatch("my/folder - $1.00", "*/*&*"))
				assert(not isMatch("my/folder - ^1.00", "*/*&*"))
				assert(not isMatch("my/folder - %1.00", "*/*&*"))
				assert(isMatch("my/folder +1", "*/*+*"))
				assert(not isMatch("my/folder -1", "*/*+*"))
				assert(not isMatch("my/folder *1", "*/*+*"))
				assert(not isMatch("my/folder", "*/*+*"))
				assert(isMatch("my/folder+foo+bar&baz", "*/*+*"))
				assert(not isMatch("my/folder - $1.00", "*/*+*"))
				assert(not isMatch("my/folder - ^1.00", "*/*+*"))
				assert(not isMatch("my/folder - %1.00", "*/*+*"))
				assert(not isMatch("my/folder +1", "*/*-*"))
				assert(isMatch("my/folder -1", "*/*-*"))
				assert(not isMatch("my/folder *1", "*/*-*"))
				assert(not isMatch("my/folder", "*/*-*"))
				assert(not isMatch("my/folder+foo+bar&baz", "*/*-*"))
				assert(isMatch("my/folder - $1.00", "*/*-*"))
				assert(isMatch("my/folder - ^1.00", "*/*-*"))
				assert(isMatch("my/folder - %1.00", "*/*-*"))
				assert(not isMatch("my/folder +1", "*/*\\**"))
				assert(not isMatch("my/folder -1", "*/*\\**"))
				assert(isMatch("my/folder *1", "*/*\\**"))
				assert(not isMatch("my/folder", "*/*\\**"))
				assert(not isMatch("my/folder+foo+bar&baz", "*/*\\**"))
				assert(not isMatch("my/folder - $1.00", "*/*\\**"))
				assert(not isMatch("my/folder - ^1.00", "*/*\\**"))
				assert(not isMatch("my/folder - %1.00", "*/*\\**"))
			end)
		end)
	end)
end
