PageRenderTime 55ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/core/externals/update-engine/externals/google-toolbox-for-mac/Foundation/GTMRegexTest.m

http://macfuse.googlecode.com/
Objective C | 1245 lines | 961 code | 76 blank | 208 comment | 0 complexity | 0b2ad123e72a8272441f42fe7ec8d405 MD5 | raw file
Possible License(s): Apache-2.0, BSD-3-Clause, GPL-2.0
  1. //
  2. // GTMRegexTest.m
  3. //
  4. // Copyright 2007-2008 Google Inc.
  5. //
  6. // Licensed under the Apache License, Version 2.0 (the "License"); you may not
  7. // use this file except in compliance with the License. You may obtain a copy
  8. // of the License at
  9. //
  10. // http://www.apache.org/licenses/LICENSE-2.0
  11. //
  12. // Unless required by applicable law or agreed to in writing, software
  13. // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  14. // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  15. // License for the specific language governing permissions and limitations under
  16. // the License.
  17. //
  18. #import "GTMSenTestCase.h"
  19. #import "GTMRegex.h"
  20. #import "GTMUnitTestDevLog.h"
  21. //
  22. // NOTE:
  23. //
  24. // We don't really test any of the pattern matching since that's testing
  25. // libregex, we just want to test our wrapper.
  26. //
  27. @interface GTMRegexTest : GTMTestCase
  28. @end
  29. @interface NSString_GTMRegexAdditions : GTMTestCase
  30. @end
  31. @implementation GTMRegexTest
  32. - (void)testEscapedPatternForString {
  33. STAssertEqualStrings([GTMRegex escapedPatternForString:@"abcdefghijklmnopqrstuvwxyz0123456789"],
  34. @"abcdefghijklmnopqrstuvwxyz0123456789",
  35. nil);
  36. STAssertEqualStrings([GTMRegex escapedPatternForString:@"^.[$()|*+?{\\"],
  37. @"\\^\\.\\[\\$\\(\\)\\|\\*\\+\\?\\{\\\\",
  38. nil);
  39. STAssertEqualStrings([GTMRegex escapedPatternForString:@"a^b.c[d$e(f)g|h*i+j?k{l\\m"],
  40. @"a\\^b\\.c\\[d\\$e\\(f\\)g\\|h\\*i\\+j\\?k\\{l\\\\m",
  41. nil);
  42. STAssertNil([GTMRegex escapedPatternForString:nil], nil);
  43. STAssertEqualStrings([GTMRegex escapedPatternForString:@""], @"", nil);
  44. }
  45. - (void)testInit {
  46. // fail cases
  47. STAssertNil([[[GTMRegex alloc] init] autorelease], nil);
  48. STAssertNil([[[GTMRegex alloc] initWithPattern:nil] autorelease], nil);
  49. STAssertNil([[[GTMRegex alloc] initWithPattern:nil
  50. options:kGTMRegexOptionIgnoreCase] autorelease], nil);
  51. [GTMUnitTestDevLog expectString:@"Invalid pattern \"(.\", error: \"parentheses not balanced\""];
  52. STAssertNil([[[GTMRegex alloc] initWithPattern:@"(."] autorelease], nil);
  53. [GTMUnitTestDevLog expectString:@"Invalid pattern \"(.\", error: \"parentheses not balanced\""];
  54. STAssertNil([[[GTMRegex alloc] initWithPattern:@"(."
  55. options:kGTMRegexOptionIgnoreCase] autorelease], nil);
  56. // fail cases w/ error param
  57. NSError *error = nil;
  58. STAssertNil([[[GTMRegex alloc] initWithPattern:nil
  59. options:kGTMRegexOptionIgnoreCase
  60. withError:&error] autorelease], nil);
  61. STAssertNil(error, @"no pattern, shouldn't get error object");
  62. STAssertNil([[[GTMRegex alloc] initWithPattern:@"(."
  63. options:kGTMRegexOptionIgnoreCase
  64. withError:&error] autorelease], nil);
  65. STAssertNotNil(error, nil);
  66. STAssertEqualObjects([error domain], kGTMRegexErrorDomain, nil);
  67. STAssertEquals([error code], (NSInteger)kGTMRegexPatternParseFailedError, nil);
  68. NSDictionary *userInfo = [error userInfo];
  69. STAssertNotNil(userInfo, @"failed to get userInfo from error");
  70. STAssertEqualObjects([userInfo objectForKey:kGTMRegexPatternErrorPattern], @"(.", nil);
  71. STAssertNotNil([userInfo objectForKey:kGTMRegexPatternErrorErrorString], nil);
  72. // basic pattern w/ options
  73. STAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)"] autorelease], nil);
  74. STAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)"
  75. options:0] autorelease], nil);
  76. STAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)"
  77. options:kGTMRegexOptionIgnoreCase] autorelease], nil);
  78. error = nil;
  79. STAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)"
  80. options:kGTMRegexOptionIgnoreCase
  81. withError:&error] autorelease], nil);
  82. STAssertNil(error, @"shouldn't have been any error");
  83. // fail cases (helper)
  84. STAssertNil([GTMRegex regexWithPattern:nil], nil);
  85. STAssertNil([GTMRegex regexWithPattern:nil
  86. options:0], nil);
  87. [GTMUnitTestDevLog expectString:@"Invalid pattern \"(.\", error: \"parentheses not balanced\""];
  88. STAssertNil([GTMRegex regexWithPattern:@"(."], nil);
  89. [GTMUnitTestDevLog expectString:@"Invalid pattern \"(.\", error: \"parentheses not balanced\""];
  90. STAssertNil([GTMRegex regexWithPattern:@"(."
  91. options:0], nil);
  92. // fail cases (helper) w/ error param
  93. STAssertNil([GTMRegex regexWithPattern:nil
  94. options:kGTMRegexOptionIgnoreCase
  95. withError:&error], nil);
  96. STAssertNil(error, @"no pattern, shouldn't get error object");
  97. STAssertNil([GTMRegex regexWithPattern:@"(."
  98. options:kGTMRegexOptionIgnoreCase
  99. withError:&error], nil);
  100. STAssertNotNil(error, nil);
  101. STAssertEqualObjects([error domain], kGTMRegexErrorDomain, nil);
  102. STAssertEquals([error code], (NSInteger)kGTMRegexPatternParseFailedError, nil);
  103. userInfo = [error userInfo];
  104. STAssertNotNil(userInfo, @"failed to get userInfo from error");
  105. STAssertEqualObjects([userInfo objectForKey:kGTMRegexPatternErrorPattern], @"(.", nil);
  106. STAssertNotNil([userInfo objectForKey:kGTMRegexPatternErrorErrorString], nil);
  107. // basic pattern w/ options (helper)
  108. STAssertNotNil([GTMRegex regexWithPattern:@"(.*)"], nil);
  109. STAssertNotNil([GTMRegex regexWithPattern:@"(.*)"
  110. options:0], nil);
  111. STAssertNotNil([GTMRegex regexWithPattern:@"(.*)"
  112. options:kGTMRegexOptionIgnoreCase], nil);
  113. error = nil;
  114. STAssertNotNil([GTMRegex regexWithPattern:@"(.*)"
  115. options:kGTMRegexOptionIgnoreCase
  116. withError:&error], nil);
  117. STAssertNil(error, @"shouldn't have been any error");
  118. // not really a test on GTMRegex, but make sure we block attempts to directly
  119. // alloc/init a GTMRegexStringSegment.
  120. STAssertThrowsSpecificNamed([[[GTMRegexStringSegment alloc] init] autorelease],
  121. NSException, NSInvalidArgumentException,
  122. @"shouldn't have been able to alloc/init a GTMRegexStringSegment");
  123. }
  124. - (void)testOptions {
  125. NSString *testString = @"aaa AAA\nbbb BBB\n aaa aAa\n bbb BbB";
  126. // default options
  127. GTMRegex *regex = [GTMRegex regexWithPattern:@"a+"];
  128. STAssertNotNil(regex, nil);
  129. NSEnumerator *enumerator = [regex segmentEnumeratorForString:testString];
  130. STAssertNotNil(enumerator, nil);
  131. // "aaa"
  132. GTMRegexStringSegment *seg = [enumerator nextObject];
  133. STAssertNotNil(seg, nil);
  134. STAssertTrue([seg isMatch], nil);
  135. STAssertEqualStrings([seg string], @"aaa", nil);
  136. // " AAA\nbbb BBB\n "
  137. seg = [enumerator nextObject];
  138. STAssertNotNil(seg, nil);
  139. STAssertFalse([seg isMatch], nil);
  140. STAssertEqualStrings([seg string], @" AAA\nbbb BBB\n ", nil);
  141. // "aaa"
  142. seg = [enumerator nextObject];
  143. STAssertNotNil(seg, nil);
  144. STAssertTrue([seg isMatch], nil);
  145. STAssertEqualStrings([seg string], @"aaa", nil);
  146. // " "
  147. seg = [enumerator nextObject];
  148. STAssertNotNil(seg, nil);
  149. STAssertFalse([seg isMatch], nil);
  150. STAssertEqualStrings([seg string], @" ", nil);
  151. // "a"
  152. seg = [enumerator nextObject];
  153. STAssertNotNil(seg, nil);
  154. STAssertTrue([seg isMatch], nil);
  155. STAssertEqualStrings([seg string], @"a", nil);
  156. // "A"
  157. seg = [enumerator nextObject];
  158. STAssertNotNil(seg, nil);
  159. STAssertFalse([seg isMatch], nil);
  160. STAssertEqualStrings([seg string], @"A", nil);
  161. // "a"
  162. seg = [enumerator nextObject];
  163. STAssertNotNil(seg, nil);
  164. STAssertTrue([seg isMatch], nil);
  165. STAssertEqualStrings([seg string], @"a", nil);
  166. // "\n bbb BbB"
  167. seg = [enumerator nextObject];
  168. STAssertNotNil(seg, nil);
  169. STAssertFalse([seg isMatch], nil);
  170. STAssertEqualStrings([seg string], @"\n bbb BbB", nil);
  171. // (end)
  172. seg = [enumerator nextObject];
  173. STAssertNil(seg, nil);
  174. // kGTMRegexOptionIgnoreCase
  175. regex = [GTMRegex regexWithPattern:@"a+" options:kGTMRegexOptionIgnoreCase];
  176. STAssertNotNil(regex, nil);
  177. enumerator = [regex segmentEnumeratorForString:testString];
  178. STAssertNotNil(enumerator, nil);
  179. // "aaa"
  180. seg = [enumerator nextObject];
  181. STAssertNotNil(seg, nil);
  182. STAssertTrue([seg isMatch], nil);
  183. STAssertEqualStrings([seg string], @"aaa", nil);
  184. // " "
  185. seg = [enumerator nextObject];
  186. STAssertNotNil(seg, nil);
  187. STAssertFalse([seg isMatch], nil);
  188. STAssertEqualStrings([seg string], @" ", nil);
  189. // "AAA"
  190. seg = [enumerator nextObject];
  191. STAssertNotNil(seg, nil);
  192. STAssertTrue([seg isMatch], nil);
  193. STAssertEqualStrings([seg string], @"AAA", nil);
  194. // "\nbbb BBB\n "
  195. seg = [enumerator nextObject];
  196. STAssertNotNil(seg, nil);
  197. STAssertFalse([seg isMatch], nil);
  198. STAssertEqualStrings([seg string], @"\nbbb BBB\n ", nil);
  199. // "aaa"
  200. seg = [enumerator nextObject];
  201. STAssertNotNil(seg, nil);
  202. STAssertTrue([seg isMatch], nil);
  203. STAssertEqualStrings([seg string], @"aaa", nil);
  204. // " "
  205. seg = [enumerator nextObject];
  206. STAssertNotNil(seg, nil);
  207. STAssertFalse([seg isMatch], nil);
  208. STAssertEqualStrings([seg string], @" ", nil);
  209. // "aAa"
  210. seg = [enumerator nextObject];
  211. STAssertNotNil(seg, nil);
  212. STAssertTrue([seg isMatch], nil);
  213. STAssertEqualStrings([seg string], @"aAa", nil);
  214. // "\n bbb BbB"
  215. seg = [enumerator nextObject];
  216. STAssertNotNil(seg, nil);
  217. STAssertFalse([seg isMatch], nil);
  218. STAssertEqualStrings([seg string], @"\n bbb BbB", nil);
  219. // (end)
  220. seg = [enumerator nextObject];
  221. STAssertNil(seg, nil);
  222. // defaults w/ '^'
  223. regex = [GTMRegex regexWithPattern:@"^a+"];
  224. STAssertNotNil(regex, nil);
  225. enumerator = [regex segmentEnumeratorForString:testString];
  226. STAssertNotNil(enumerator, nil);
  227. // "aaa"
  228. seg = [enumerator nextObject];
  229. STAssertNotNil(seg, nil);
  230. STAssertTrue([seg isMatch], nil);
  231. STAssertEqualStrings([seg string], @"aaa", nil);
  232. // " AAA\nbbb BBB\n aaa aAa\n bbb BbB"
  233. seg = [enumerator nextObject];
  234. STAssertNotNil(seg, nil);
  235. STAssertFalse([seg isMatch], nil);
  236. STAssertEqualStrings([seg string], @" AAA\nbbb BBB\n aaa aAa\n bbb BbB", nil);
  237. // (end)
  238. seg = [enumerator nextObject];
  239. STAssertNil(seg, nil);
  240. // defaults w/ '$'
  241. regex = [GTMRegex regexWithPattern:@"B+$"];
  242. STAssertNotNil(regex, nil);
  243. enumerator = [regex segmentEnumeratorForString:testString];
  244. STAssertNotNil(enumerator, nil);
  245. // "aaa AAA\nbbb "
  246. seg = [enumerator nextObject];
  247. STAssertNotNil(seg, nil);
  248. STAssertFalse([seg isMatch], nil);
  249. STAssertEqualStrings([seg string], @"aaa AAA\nbbb ", nil);
  250. // "BBB"
  251. seg = [enumerator nextObject];
  252. STAssertNotNil(seg, nil);
  253. STAssertTrue([seg isMatch], nil);
  254. STAssertEqualStrings([seg string], @"BBB", nil);
  255. // "\n aaa aAa\n bbb Bb"
  256. seg = [enumerator nextObject];
  257. STAssertNotNil(seg, nil);
  258. STAssertFalse([seg isMatch], nil);
  259. STAssertEqualStrings([seg string], @"\n aaa aAa\n bbb Bb", nil);
  260. // "B"
  261. seg = [enumerator nextObject];
  262. STAssertNotNil(seg, nil);
  263. STAssertTrue([seg isMatch], nil);
  264. STAssertEqualStrings([seg string], @"B", nil);
  265. // (end)
  266. seg = [enumerator nextObject];
  267. STAssertNil(seg, nil);
  268. // kGTMRegexOptionIgnoreCase w/ '$'
  269. regex = [GTMRegex regexWithPattern:@"B+$"
  270. options:kGTMRegexOptionIgnoreCase];
  271. STAssertNotNil(regex, nil);
  272. enumerator = [regex segmentEnumeratorForString:testString];
  273. STAssertNotNil(enumerator, nil);
  274. // "aaa AAA\nbbb "
  275. seg = [enumerator nextObject];
  276. STAssertNotNil(seg, nil);
  277. STAssertFalse([seg isMatch], nil);
  278. STAssertEqualStrings([seg string], @"aaa AAA\nbbb ", nil);
  279. // "BBB"
  280. seg = [enumerator nextObject];
  281. STAssertNotNil(seg, nil);
  282. STAssertTrue([seg isMatch], nil);
  283. STAssertEqualStrings([seg string], @"BBB", nil);
  284. // "\n aaa aAa\n bbb "
  285. seg = [enumerator nextObject];
  286. STAssertNotNil(seg, nil);
  287. STAssertFalse([seg isMatch], nil);
  288. STAssertEqualStrings([seg string], @"\n aaa aAa\n bbb ", nil);
  289. // "BbB"
  290. seg = [enumerator nextObject];
  291. STAssertNotNil(seg, nil);
  292. STAssertTrue([seg isMatch], nil);
  293. STAssertEqualStrings([seg string], @"BbB", nil);
  294. // (end)
  295. seg = [enumerator nextObject];
  296. STAssertNil(seg, nil);
  297. // test w/ kGTMRegexOptionSupressNewlineSupport and \n in the string
  298. regex = [GTMRegex regexWithPattern:@"a.*b" options:kGTMRegexOptionSupressNewlineSupport];
  299. STAssertNotNil(regex, nil);
  300. enumerator = [regex segmentEnumeratorForString:testString];
  301. STAssertNotNil(enumerator, nil);
  302. // "aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb"
  303. seg = [enumerator nextObject];
  304. STAssertNotNil(seg, nil);
  305. STAssertTrue([seg isMatch], nil);
  306. STAssertEqualStrings([seg string], @"aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb", nil);
  307. // "B"
  308. seg = [enumerator nextObject];
  309. STAssertNotNil(seg, nil);
  310. STAssertFalse([seg isMatch], nil);
  311. STAssertEqualStrings([seg string], @"B", nil);
  312. // (end)
  313. seg = [enumerator nextObject];
  314. STAssertNil(seg, nil);
  315. // test w/o kGTMRegexOptionSupressNewlineSupport and \n in the string
  316. // (this is no match since it '.' can't match the '\n')
  317. regex = [GTMRegex regexWithPattern:@"a.*b"];
  318. STAssertNotNil(regex, nil);
  319. enumerator = [regex segmentEnumeratorForString:testString];
  320. STAssertNotNil(enumerator, nil);
  321. // "aaa AAA\nbbb BBB\n aaa aAa\n bbb BbB"
  322. seg = [enumerator nextObject];
  323. STAssertNotNil(seg, nil);
  324. STAssertFalse([seg isMatch], nil);
  325. STAssertEqualStrings([seg string], @"aaa AAA\nbbb BBB\n aaa aAa\n bbb BbB", nil);
  326. // (end)
  327. seg = [enumerator nextObject];
  328. STAssertNil(seg, nil);
  329. // kGTMRegexOptionSupressNewlineSupport w/ '^'
  330. regex = [GTMRegex regexWithPattern:@"^a+" options:kGTMRegexOptionSupressNewlineSupport];
  331. STAssertNotNil(regex, nil);
  332. enumerator = [regex segmentEnumeratorForString:testString];
  333. STAssertNotNil(enumerator, nil);
  334. // "aaa"
  335. seg = [enumerator nextObject];
  336. STAssertNotNil(seg, nil);
  337. STAssertTrue([seg isMatch], nil);
  338. STAssertEqualStrings([seg string], @"aaa", nil);
  339. // " AAA\nbbb BBB\n aaa aAa\n bbb BbB"
  340. seg = [enumerator nextObject];
  341. STAssertNotNil(seg, nil);
  342. STAssertFalse([seg isMatch], nil);
  343. STAssertEqualStrings([seg string], @" AAA\nbbb BBB\n aaa aAa\n bbb BbB", nil);
  344. // (end)
  345. seg = [enumerator nextObject];
  346. STAssertNil(seg, nil);
  347. // kGTMRegexOptionSupressNewlineSupport w/ '$'
  348. regex = [GTMRegex regexWithPattern:@"B+$" options:kGTMRegexOptionSupressNewlineSupport];
  349. STAssertNotNil(regex, nil);
  350. enumerator = [regex segmentEnumeratorForString:testString];
  351. STAssertNotNil(enumerator, nil);
  352. // "aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb"
  353. seg = [enumerator nextObject];
  354. STAssertNotNil(seg, nil);
  355. STAssertFalse([seg isMatch], nil);
  356. STAssertEqualStrings([seg string], @"aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb", nil);
  357. // "B"
  358. seg = [enumerator nextObject];
  359. STAssertNotNil(seg, nil);
  360. STAssertTrue([seg isMatch], nil);
  361. STAssertEqualStrings([seg string], @"B", nil);
  362. // (end)
  363. seg = [enumerator nextObject];
  364. STAssertNil(seg, nil);
  365. }
  366. - (void)testSubPatternCount {
  367. STAssertEquals((NSUInteger)0, [[GTMRegex regexWithPattern:@".*"] subPatternCount], nil);
  368. STAssertEquals((NSUInteger)1, [[GTMRegex regexWithPattern:@"(.*)"] subPatternCount], nil);
  369. STAssertEquals((NSUInteger)1, [[GTMRegex regexWithPattern:@"[fo]*(.*)[bar]*"] subPatternCount], nil);
  370. STAssertEquals((NSUInteger)3, [[GTMRegex regexWithPattern:@"([fo]*)(.*)([bar]*)"] subPatternCount], nil);
  371. STAssertEquals((NSUInteger)7, [[GTMRegex regexWithPattern:@"(([bar]*)|([fo]*))(.*)(([bar]*)|([fo]*))"] subPatternCount], nil);
  372. }
  373. - (void)testMatchesString {
  374. // simple pattern
  375. GTMRegex *regex = [GTMRegex regexWithPattern:@"foo.*bar"];
  376. STAssertNotNil(regex, nil);
  377. STAssertTrue([regex matchesString:@"foobar"], nil);
  378. STAssertTrue([regex matchesString:@"foobydoo spambar"], nil);
  379. STAssertFalse([regex matchesString:@"zzfoobarzz"], nil);
  380. STAssertFalse([regex matchesString:@"zzfoobydoo spambarzz"], nil);
  381. STAssertFalse([regex matchesString:@"abcdef"], nil);
  382. STAssertFalse([regex matchesString:@""], nil);
  383. STAssertFalse([regex matchesString:nil], nil);
  384. // pattern w/ sub patterns
  385. regex = [GTMRegex regexWithPattern:@"(foo)(.*)(bar)"];
  386. STAssertNotNil(regex, nil);
  387. STAssertTrue([regex matchesString:@"foobar"], nil);
  388. STAssertTrue([regex matchesString:@"foobydoo spambar"], nil);
  389. STAssertFalse([regex matchesString:@"zzfoobarzz"], nil);
  390. STAssertFalse([regex matchesString:@"zzfoobydoo spambarzz"], nil);
  391. STAssertFalse([regex matchesString:@"abcdef"], nil);
  392. STAssertFalse([regex matchesString:@""], nil);
  393. STAssertFalse([regex matchesString:nil], nil);
  394. }
  395. - (void)testSubPatternsOfString {
  396. GTMRegex *regex = [GTMRegex regexWithPattern:@"(fo(o+))((bar)|(baz))"];
  397. STAssertNotNil(regex, nil);
  398. STAssertEquals((NSUInteger)5, [regex subPatternCount], nil);
  399. NSArray *subPatterns = [regex subPatternsOfString:@"foooooobaz"];
  400. STAssertNotNil(subPatterns, nil);
  401. STAssertEquals((NSUInteger)6, [subPatterns count], nil);
  402. STAssertEqualStrings(@"foooooobaz", [subPatterns objectAtIndex:0], nil);
  403. STAssertEqualStrings(@"foooooo", [subPatterns objectAtIndex:1], nil);
  404. STAssertEqualStrings(@"ooooo", [subPatterns objectAtIndex:2], nil);
  405. STAssertEqualStrings(@"baz", [subPatterns objectAtIndex:3], nil);
  406. STAssertEqualObjects([NSNull null], [subPatterns objectAtIndex:4], nil);
  407. STAssertEqualStrings(@"baz", [subPatterns objectAtIndex:5], nil);
  408. // not there
  409. subPatterns = [regex subPatternsOfString:@"aaa"];
  410. STAssertNil(subPatterns, nil);
  411. // not extra stuff on either end
  412. subPatterns = [regex subPatternsOfString:@"ZZZfoooooobaz"];
  413. STAssertNil(subPatterns, nil);
  414. subPatterns = [regex subPatternsOfString:@"foooooobazZZZ"];
  415. STAssertNil(subPatterns, nil);
  416. subPatterns = [regex subPatternsOfString:@"ZZZfoooooobazZZZ"];
  417. STAssertNil(subPatterns, nil);
  418. }
  419. - (void)testFirstSubStringMatchedInString {
  420. // simple pattern
  421. GTMRegex *regex = [GTMRegex regexWithPattern:@"foo.*bar"];
  422. STAssertNotNil(regex, nil);
  423. STAssertEqualStrings([regex firstSubStringMatchedInString:@"foobar"],
  424. @"foobar", nil);
  425. STAssertEqualStrings([regex firstSubStringMatchedInString:@"foobydoo spambar"],
  426. @"foobydoo spambar", nil);
  427. STAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobarzz"],
  428. @"foobar", nil);
  429. STAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobydoo spambarzz"],
  430. @"foobydoo spambar", nil);
  431. STAssertNil([regex firstSubStringMatchedInString:@"abcdef"], nil);
  432. STAssertNil([regex firstSubStringMatchedInString:@""], nil);
  433. // pattern w/ sub patterns
  434. regex = [GTMRegex regexWithPattern:@"(foo)(.*)(bar)"];
  435. STAssertNotNil(regex, nil);
  436. STAssertEqualStrings([regex firstSubStringMatchedInString:@"foobar"],
  437. @"foobar", nil);
  438. STAssertEqualStrings([regex firstSubStringMatchedInString:@"foobydoo spambar"],
  439. @"foobydoo spambar", nil);
  440. STAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobarzz"],
  441. @"foobar", nil);
  442. STAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobydoo spambarzz"],
  443. @"foobydoo spambar", nil);
  444. STAssertNil([regex firstSubStringMatchedInString:@"abcdef"], nil);
  445. STAssertNil([regex firstSubStringMatchedInString:@""], nil);
  446. }
  447. - (void)testMatchesSubStringInString {
  448. // simple pattern
  449. GTMRegex *regex = [GTMRegex regexWithPattern:@"foo.*bar"];
  450. STAssertNotNil(regex, nil);
  451. STAssertTrue([regex matchesSubStringInString:@"foobar"], nil);
  452. STAssertTrue([regex matchesSubStringInString:@"foobydoo spambar"], nil);
  453. STAssertTrue([regex matchesSubStringInString:@"zzfoobarzz"], nil);
  454. STAssertTrue([regex matchesSubStringInString:@"zzfoobydoo spambarzz"], nil);
  455. STAssertFalse([regex matchesSubStringInString:@"abcdef"], nil);
  456. STAssertFalse([regex matchesSubStringInString:@""], nil);
  457. // pattern w/ sub patterns
  458. regex = [GTMRegex regexWithPattern:@"(foo)(.*)(bar)"];
  459. STAssertNotNil(regex, nil);
  460. STAssertTrue([regex matchesSubStringInString:@"foobar"], nil);
  461. STAssertTrue([regex matchesSubStringInString:@"foobydoo spambar"], nil);
  462. STAssertTrue([regex matchesSubStringInString:@"zzfoobarzz"], nil);
  463. STAssertTrue([regex matchesSubStringInString:@"zzfoobydoo spambarzz"], nil);
  464. STAssertFalse([regex matchesSubStringInString:@"abcdef"], nil);
  465. STAssertFalse([regex matchesSubStringInString:@""], nil);
  466. }
  467. - (void)testSegmentEnumeratorForString {
  468. GTMRegex *regex = [GTMRegex regexWithPattern:@"foo+ba+r"];
  469. STAssertNotNil(regex, nil);
  470. // test odd input
  471. NSEnumerator *enumerator = [regex segmentEnumeratorForString:@""];
  472. STAssertNotNil(enumerator, nil);
  473. enumerator = [regex segmentEnumeratorForString:nil];
  474. STAssertNil(enumerator, nil);
  475. // on w/ the normal tests
  476. enumerator = [regex segmentEnumeratorForString:@"afoobarbfooobaarfoobarzz"];
  477. STAssertNotNil(enumerator, nil);
  478. // "a"
  479. GTMRegexStringSegment *seg = [enumerator nextObject];
  480. STAssertNotNil(seg, nil);
  481. STAssertFalse([seg isMatch], nil);
  482. STAssertEqualStrings([seg string], @"a", nil);
  483. // "foobar"
  484. seg = [enumerator nextObject];
  485. STAssertNotNil(seg, nil);
  486. STAssertTrue([seg isMatch], nil);
  487. STAssertEqualStrings([seg string], @"foobar", nil);
  488. // "b"
  489. seg = [enumerator nextObject];
  490. STAssertNotNil(seg, nil);
  491. STAssertFalse([seg isMatch], nil);
  492. STAssertEqualStrings([seg string], @"b", nil);
  493. // "fooobaar"
  494. seg = [enumerator nextObject];
  495. STAssertNotNil(seg, nil);
  496. STAssertTrue([seg isMatch], nil);
  497. STAssertEqualStrings([seg string], @"fooobaar", nil);
  498. // "foobar"
  499. seg = [enumerator nextObject];
  500. STAssertNotNil(seg, nil);
  501. STAssertTrue([seg isMatch], nil);
  502. STAssertEqualStrings([seg string], @"foobar", nil);
  503. // "zz"
  504. seg = [enumerator nextObject];
  505. STAssertNotNil(seg, nil);
  506. STAssertFalse([seg isMatch], nil);
  507. STAssertEqualStrings([seg string], @"zz", nil);
  508. // (end)
  509. seg = [enumerator nextObject];
  510. STAssertNil(seg, nil);
  511. // test no match
  512. enumerator = [regex segmentEnumeratorForString:@"aaa"];
  513. STAssertNotNil(enumerator, nil);
  514. seg = [enumerator nextObject];
  515. STAssertNotNil(seg, nil);
  516. STAssertFalse([seg isMatch], nil);
  517. STAssertEqualStrings([seg string], @"aaa", nil);
  518. seg = [enumerator nextObject];
  519. STAssertNil(seg, nil);
  520. // test only match
  521. enumerator = [regex segmentEnumeratorForString:@"foobar"];
  522. STAssertNotNil(enumerator, nil);
  523. seg = [enumerator nextObject];
  524. STAssertNotNil(seg, nil);
  525. STAssertTrue([seg isMatch], nil);
  526. STAssertEqualStrings([seg string], @"foobar", nil);
  527. seg = [enumerator nextObject];
  528. STAssertNil(seg, nil);
  529. // now test the saved sub segments
  530. regex = [GTMRegex regexWithPattern:@"(foo)((bar)|(baz))"];
  531. STAssertNotNil(regex, nil);
  532. STAssertEquals((NSUInteger)4, [regex subPatternCount], nil);
  533. enumerator = [regex segmentEnumeratorForString:@"foobarxxfoobaz"];
  534. STAssertNotNil(enumerator, nil);
  535. // "foobar"
  536. seg = [enumerator nextObject];
  537. STAssertNotNil(seg, nil);
  538. STAssertTrue([seg isMatch], nil);
  539. STAssertEqualStrings([seg string], @"foobar", nil);
  540. STAssertEqualStrings([seg subPatternString:0], @"foobar", nil);
  541. STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
  542. STAssertEqualStrings([seg subPatternString:2], @"bar", nil);
  543. STAssertEqualStrings([seg subPatternString:3], @"bar", nil);
  544. STAssertNil([seg subPatternString:4], nil); // nothing matched "(baz)"
  545. STAssertNil([seg subPatternString:5], nil);
  546. // "xx"
  547. seg = [enumerator nextObject];
  548. STAssertNotNil(seg, nil);
  549. STAssertFalse([seg isMatch], nil);
  550. STAssertEqualStrings([seg string], @"xx", nil);
  551. STAssertEqualStrings([seg subPatternString:0], @"xx", nil);
  552. STAssertNil([seg subPatternString:1], nil);
  553. // "foobaz"
  554. seg = [enumerator nextObject];
  555. STAssertNotNil(seg, nil);
  556. STAssertTrue([seg isMatch], nil);
  557. STAssertEqualStrings([seg string], @"foobaz", nil);
  558. STAssertEqualStrings([seg subPatternString:0], @"foobaz", nil);
  559. STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
  560. STAssertEqualStrings([seg subPatternString:2], @"baz", nil);
  561. STAssertNil([seg subPatternString:3], nil); // (nothing matched "(bar)"
  562. STAssertEqualStrings([seg subPatternString:4], @"baz", nil);
  563. STAssertNil([seg subPatternString:5], nil);
  564. // (end)
  565. seg = [enumerator nextObject];
  566. STAssertNil(seg, nil);
  567. // test all objects
  568. regex = [GTMRegex regexWithPattern:@"foo+ba+r"];
  569. STAssertNotNil(regex, nil);
  570. enumerator = [regex segmentEnumeratorForString:@"afoobarbfooobaarfoobarzz"];
  571. STAssertNotNil(enumerator, nil);
  572. NSArray *allSegments = [enumerator allObjects];
  573. STAssertNotNil(allSegments, nil);
  574. STAssertEquals((NSUInteger)6, [allSegments count], nil);
  575. // test we are getting the flags right for newline
  576. regex = [GTMRegex regexWithPattern:@"^a"];
  577. STAssertNotNil(regex, nil);
  578. enumerator = [regex segmentEnumeratorForString:@"aa\naa"];
  579. STAssertNotNil(enumerator, nil);
  580. // "a"
  581. seg = [enumerator nextObject];
  582. STAssertNotNil(seg, nil);
  583. STAssertTrue([seg isMatch], nil);
  584. STAssertEqualStrings([seg string], @"a", nil);
  585. // "a\n"
  586. seg = [enumerator nextObject];
  587. STAssertNotNil(seg, nil);
  588. STAssertFalse([seg isMatch], nil);
  589. STAssertEqualStrings([seg string], @"a\n", nil);
  590. // "a"
  591. seg = [enumerator nextObject];
  592. STAssertNotNil(seg, nil);
  593. STAssertTrue([seg isMatch], nil);
  594. STAssertEqualStrings([seg string], @"a", nil);
  595. // "a"
  596. seg = [enumerator nextObject];
  597. STAssertNotNil(seg, nil);
  598. STAssertFalse([seg isMatch], nil);
  599. STAssertEqualStrings([seg string], @"a", nil);
  600. // (end)
  601. seg = [enumerator nextObject];
  602. STAssertNil(seg, nil);
  603. // test we are getting the flags right for newline, part 2
  604. regex = [GTMRegex regexWithPattern:@"^a*$"];
  605. STAssertNotNil(regex, nil);
  606. enumerator = [regex segmentEnumeratorForString:@"aa\naa\nbb\naa"];
  607. STAssertNotNil(enumerator, nil);
  608. // "aa"
  609. seg = [enumerator nextObject];
  610. STAssertNotNil(seg, nil);
  611. STAssertTrue([seg isMatch], nil);
  612. STAssertEqualStrings([seg string], @"aa", nil);
  613. // "\n"
  614. seg = [enumerator nextObject];
  615. STAssertNotNil(seg, nil);
  616. STAssertFalse([seg isMatch], nil);
  617. STAssertEqualStrings([seg string], @"\n", nil);
  618. // "aa"
  619. seg = [enumerator nextObject];
  620. STAssertNotNil(seg, nil);
  621. STAssertTrue([seg isMatch], nil);
  622. STAssertEqualStrings([seg string], @"aa", nil);
  623. // "\nbb\n"
  624. seg = [enumerator nextObject];
  625. STAssertNotNil(seg, nil);
  626. STAssertFalse([seg isMatch], nil);
  627. STAssertEqualStrings([seg string], @"\nbb\n", nil);
  628. // "aa"
  629. seg = [enumerator nextObject];
  630. STAssertNotNil(seg, nil);
  631. STAssertTrue([seg isMatch], nil);
  632. STAssertEqualStrings([seg string], @"aa", nil);
  633. // (end)
  634. seg = [enumerator nextObject];
  635. STAssertNil(seg, nil);
  636. // make sure the enum cleans up if not walked to the end
  637. regex = [GTMRegex regexWithPattern:@"b+"];
  638. STAssertNotNil(regex, nil);
  639. enumerator = [regex segmentEnumeratorForString:@"aabbcc"];
  640. STAssertNotNil(enumerator, nil);
  641. // "aa"
  642. seg = [enumerator nextObject];
  643. STAssertNotNil(seg, nil);
  644. STAssertFalse([seg isMatch], nil);
  645. STAssertEqualStrings([seg string], @"aa", nil);
  646. // and done w/o walking the rest
  647. }
  648. - (void)testMatchSegmentEnumeratorForString {
  649. GTMRegex *regex = [GTMRegex regexWithPattern:@"foo+ba+r"];
  650. STAssertNotNil(regex, nil);
  651. // test odd input
  652. NSEnumerator *enumerator = [regex matchSegmentEnumeratorForString:@""];
  653. STAssertNotNil(enumerator, nil);
  654. enumerator = [regex matchSegmentEnumeratorForString:nil];
  655. STAssertNil(enumerator, nil);
  656. // on w/ the normal tests
  657. enumerator = [regex matchSegmentEnumeratorForString:@"afoobarbfooobaarfoobarzz"];
  658. STAssertNotNil(enumerator, nil);
  659. // "a" - skipped
  660. // "foobar"
  661. GTMRegexStringSegment *seg = [enumerator nextObject];
  662. STAssertNotNil(seg, nil);
  663. STAssertTrue([seg isMatch], nil);
  664. STAssertEqualStrings([seg string], @"foobar", nil);
  665. // "b" - skipped
  666. // "fooobaar"
  667. seg = [enumerator nextObject];
  668. STAssertNotNil(seg, nil);
  669. STAssertTrue([seg isMatch], nil);
  670. STAssertEqualStrings([seg string], @"fooobaar", nil);
  671. // "foobar"
  672. seg = [enumerator nextObject];
  673. STAssertNotNil(seg, nil);
  674. STAssertTrue([seg isMatch], nil);
  675. STAssertEqualStrings([seg string], @"foobar", nil);
  676. // "zz" - skipped
  677. // (end)
  678. seg = [enumerator nextObject];
  679. STAssertNil(seg, nil);
  680. // test no match
  681. enumerator = [regex matchSegmentEnumeratorForString:@"aaa"];
  682. STAssertNotNil(enumerator, nil);
  683. seg = [enumerator nextObject];
  684. STAssertNil(seg, nil); // should have gotten nothing
  685. // test only match
  686. enumerator = [regex matchSegmentEnumeratorForString:@"foobar"];
  687. STAssertNotNil(enumerator, nil);
  688. seg = [enumerator nextObject];
  689. STAssertNotNil(seg, nil);
  690. STAssertTrue([seg isMatch], nil);
  691. STAssertEqualStrings([seg string], @"foobar", nil);
  692. seg = [enumerator nextObject];
  693. STAssertNil(seg, nil);
  694. // now test the saved sub segments
  695. regex = [GTMRegex regexWithPattern:@"(foo)((bar)|(baz))"];
  696. STAssertNotNil(regex, nil);
  697. STAssertEquals((NSUInteger)4, [regex subPatternCount], nil);
  698. enumerator = [regex matchSegmentEnumeratorForString:@"foobarxxfoobaz"];
  699. STAssertNotNil(enumerator, nil);
  700. // "foobar"
  701. seg = [enumerator nextObject];
  702. STAssertNotNil(seg, nil);
  703. STAssertTrue([seg isMatch], nil);
  704. STAssertEqualStrings([seg string], @"foobar", nil);
  705. STAssertEqualStrings([seg subPatternString:0], @"foobar", nil);
  706. STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
  707. STAssertEqualStrings([seg subPatternString:2], @"bar", nil);
  708. STAssertEqualStrings([seg subPatternString:3], @"bar", nil);
  709. STAssertNil([seg subPatternString:4], nil); // nothing matched "(baz)"
  710. STAssertNil([seg subPatternString:5], nil);
  711. // "xx" - skipped
  712. // "foobaz"
  713. seg = [enumerator nextObject];
  714. STAssertNotNil(seg, nil);
  715. STAssertTrue([seg isMatch], nil);
  716. STAssertEqualStrings([seg string], @"foobaz", nil);
  717. STAssertEqualStrings([seg subPatternString:0], @"foobaz", nil);
  718. STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
  719. STAssertEqualStrings([seg subPatternString:2], @"baz", nil);
  720. STAssertNil([seg subPatternString:3], nil); // (nothing matched "(bar)"
  721. STAssertEqualStrings([seg subPatternString:4], @"baz", nil);
  722. STAssertNil([seg subPatternString:5], nil);
  723. // (end)
  724. seg = [enumerator nextObject];
  725. STAssertNil(seg, nil);
  726. // test all objects
  727. regex = [GTMRegex regexWithPattern:@"foo+ba+r"];
  728. STAssertNotNil(regex, nil);
  729. enumerator = [regex matchSegmentEnumeratorForString:@"afoobarbfooobaarfoobarzz"];
  730. STAssertNotNil(enumerator, nil);
  731. NSArray *allSegments = [enumerator allObjects];
  732. STAssertNotNil(allSegments, nil);
  733. STAssertEquals((NSUInteger)3, [allSegments count], nil);
  734. // test we are getting the flags right for newline
  735. regex = [GTMRegex regexWithPattern:@"^a"];
  736. STAssertNotNil(regex, nil);
  737. enumerator = [regex matchSegmentEnumeratorForString:@"aa\naa"];
  738. STAssertNotNil(enumerator, nil);
  739. // "a"
  740. seg = [enumerator nextObject];
  741. STAssertNotNil(seg, nil);
  742. STAssertTrue([seg isMatch], nil);
  743. STAssertEqualStrings([seg string], @"a", nil);
  744. // "a\n" - skipped
  745. // "a"
  746. seg = [enumerator nextObject];
  747. STAssertNotNil(seg, nil);
  748. STAssertTrue([seg isMatch], nil);
  749. STAssertEqualStrings([seg string], @"a", nil);
  750. // "a" - skipped
  751. // (end)
  752. seg = [enumerator nextObject];
  753. STAssertNil(seg, nil);
  754. // test we are getting the flags right for newline, part 2
  755. regex = [GTMRegex regexWithPattern:@"^a*$"];
  756. STAssertNotNil(regex, nil);
  757. enumerator = [regex matchSegmentEnumeratorForString:@"aa\naa\nbb\naa"];
  758. STAssertNotNil(enumerator, nil);
  759. // "aa"
  760. seg = [enumerator nextObject];
  761. STAssertNotNil(seg, nil);
  762. STAssertTrue([seg isMatch], nil);
  763. STAssertEqualStrings([seg string], @"aa", nil);
  764. // "\n" - skipped
  765. // "aa"
  766. seg = [enumerator nextObject];
  767. STAssertNotNil(seg, nil);
  768. STAssertTrue([seg isMatch], nil);
  769. STAssertEqualStrings([seg string], @"aa", nil);
  770. // "\nbb\n" - skipped
  771. // "aa"
  772. seg = [enumerator nextObject];
  773. STAssertNotNil(seg, nil);
  774. STAssertTrue([seg isMatch], nil);
  775. STAssertEqualStrings([seg string], @"aa", nil);
  776. // (end)
  777. seg = [enumerator nextObject];
  778. STAssertNil(seg, nil);
  779. }
  780. - (void)testStringByReplacingMatchesInStringWithReplacement {
  781. GTMRegex *regex = [GTMRegex regexWithPattern:@"(foo)(.*)(bar)"];
  782. STAssertNotNil(regex, nil);
  783. // the basics
  784. STAssertEqualStrings(@"weeZbarZbydoo spamZfooZdoggies",
  785. [regex stringByReplacingMatchesInString:@"weefoobydoo spambardoggies"
  786. withReplacement:@"Z\\3Z\\2Z\\1Z"],
  787. nil);
  788. // nil/empty replacement
  789. STAssertEqualStrings(@"weedoggies",
  790. [regex stringByReplacingMatchesInString:@"weefoobydoo spambardoggies"
  791. withReplacement:nil],
  792. nil);
  793. STAssertEqualStrings(@"weedoggies",
  794. [regex stringByReplacingMatchesInString:@"weefoobydoo spambardoggies"
  795. withReplacement:@""],
  796. nil);
  797. STAssertEqualStrings(@"",
  798. [regex stringByReplacingMatchesInString:@""
  799. withReplacement:@"abc"],
  800. nil);
  801. STAssertNil([regex stringByReplacingMatchesInString:nil
  802. withReplacement:@"abc"],
  803. nil);
  804. // use optional and invale subexpression parts to confirm that works
  805. regex = [GTMRegex regexWithPattern:@"(fo(o+))((bar)|(baz))"];
  806. STAssertNotNil(regex, nil);
  807. STAssertEqualStrings(@"aaa baz bar bar foo baz aaa",
  808. [regex stringByReplacingMatchesInString:@"aaa foooooobaz fooobar bar foo baz aaa"
  809. withReplacement:@"\\4\\5"],
  810. nil);
  811. STAssertEqualStrings(@"aaa ZZZ ZZZ bar foo baz aaa",
  812. [regex stringByReplacingMatchesInString:@"aaa foooooobaz fooobar bar foo baz aaa"
  813. withReplacement:@"Z\\10Z\\12Z"],
  814. nil);
  815. // test slashes in replacement that aren't part of the subpattern reference
  816. regex = [GTMRegex regexWithPattern:@"a+"];
  817. STAssertNotNil(regex, nil);
  818. STAssertEqualStrings(@"z\\\\0 \\\\a \\\\\\\\0z",
  819. [regex stringByReplacingMatchesInString:@"zaz"
  820. withReplacement:@"\\\\0 \\\\\\0 \\\\\\\\0"],
  821. nil);
  822. STAssertEqualStrings(@"z\\\\a \\\\\\\\0 \\\\\\\\az",
  823. [regex stringByReplacingMatchesInString:@"zaz"
  824. withReplacement:@"\\\\\\0 \\\\\\\\0 \\\\\\\\\\0"],
  825. nil);
  826. STAssertEqualStrings(@"z\\\\\\\\0 \\\\\\\\a \\\\\\\\\\\\0z",
  827. [regex stringByReplacingMatchesInString:@"zaz"
  828. withReplacement:@"\\\\\\\\0 \\\\\\\\\\0 \\\\\\\\\\\\0"],
  829. nil);
  830. }
  831. - (void)testDescriptions {
  832. // default options
  833. GTMRegex *regex = [GTMRegex regexWithPattern:@"a+"];
  834. STAssertNotNil(regex, nil);
  835. STAssertGreaterThan([[regex description] length], (NSUInteger)10,
  836. @"failed to get a reasonable description for regex");
  837. // enumerator
  838. NSEnumerator *enumerator = [regex segmentEnumeratorForString:@"aaabbbccc"];
  839. STAssertNotNil(enumerator, nil);
  840. STAssertGreaterThan([[enumerator description] length], (NSUInteger)10,
  841. @"failed to get a reasonable description for regex enumerator");
  842. // string segment
  843. GTMRegexStringSegment *seg = [enumerator nextObject];
  844. STAssertNotNil(seg, nil);
  845. STAssertGreaterThan([[seg description] length], (NSUInteger)10,
  846. @"failed to get a reasonable description for regex string segment");
  847. // regex w/ other options
  848. regex = [GTMRegex regexWithPattern:@"a+"
  849. options:(kGTMRegexOptionIgnoreCase | kGTMRegexOptionSupressNewlineSupport)];
  850. STAssertNotNil(regex, nil);
  851. STAssertGreaterThan([[regex description] length], (NSUInteger)10,
  852. @"failed to get a reasonable description for regex w/ options");
  853. }
  854. @end
  855. @implementation NSString_GTMRegexAdditions
  856. // Only partial tests to test that the call get through correctly since the
  857. // above really tests them.
  858. - (void)testMatchesPattern {
  859. // simple pattern
  860. STAssertTrue([@"foobar" gtm_matchesPattern:@"foo.*bar"], nil);
  861. STAssertTrue([@"foobydoo spambar" gtm_matchesPattern:@"foo.*bar"], nil);
  862. STAssertFalse([@"zzfoobarzz" gtm_matchesPattern:@"foo.*bar"], nil);
  863. STAssertFalse([@"zzfoobydoo spambarzz" gtm_matchesPattern:@"foo.*bar"], nil);
  864. STAssertFalse([@"abcdef" gtm_matchesPattern:@"foo.*bar"], nil);
  865. STAssertFalse([@"" gtm_matchesPattern:@"foo.*bar"], nil);
  866. // pattern w/ sub patterns
  867. STAssertTrue([@"foobar" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil);
  868. STAssertTrue([@"foobydoo spambar" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil);
  869. STAssertFalse([@"zzfoobarzz" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil);
  870. STAssertFalse([@"zzfoobydoo spambarzz" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil);
  871. STAssertFalse([@"abcdef" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil);
  872. STAssertFalse([@"" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil);
  873. }
  874. - (void)testSubPatternsOfPattern {
  875. NSArray *subPatterns = [@"foooooobaz" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"];
  876. STAssertNotNil(subPatterns, nil);
  877. STAssertEquals((NSUInteger)6, [subPatterns count], nil);
  878. STAssertEqualStrings(@"foooooobaz", [subPatterns objectAtIndex:0], nil);
  879. STAssertEqualStrings(@"foooooo", [subPatterns objectAtIndex:1], nil);
  880. STAssertEqualStrings(@"ooooo", [subPatterns objectAtIndex:2], nil);
  881. STAssertEqualStrings(@"baz", [subPatterns objectAtIndex:3], nil);
  882. STAssertEqualObjects([NSNull null], [subPatterns objectAtIndex:4], nil);
  883. STAssertEqualStrings(@"baz", [subPatterns objectAtIndex:5], nil);
  884. // not there
  885. subPatterns = [@"aaa" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"];
  886. STAssertNil(subPatterns, nil);
  887. // not extra stuff on either end
  888. subPatterns = [@"ZZZfoooooobaz" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"];
  889. STAssertNil(subPatterns, nil);
  890. subPatterns = [@"foooooobazZZZ" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"];
  891. STAssertNil(subPatterns, nil);
  892. subPatterns = [@"ZZZfoooooobazZZZ" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"];
  893. STAssertNil(subPatterns, nil);
  894. }
  895. - (void)testFirstSubStringMatchedByPattern {
  896. // simple pattern
  897. STAssertEqualStrings([@"foobar" gtm_firstSubStringMatchedByPattern:@"foo.*bar"],
  898. @"foobar", nil);
  899. STAssertEqualStrings([@"foobydoo spambar" gtm_firstSubStringMatchedByPattern:@"foo.*bar"],
  900. @"foobydoo spambar", nil);
  901. STAssertEqualStrings([@"zzfoobarzz" gtm_firstSubStringMatchedByPattern:@"foo.*bar"],
  902. @"foobar", nil);
  903. STAssertEqualStrings([@"zzfoobydoo spambarzz" gtm_firstSubStringMatchedByPattern:@"foo.*bar"],
  904. @"foobydoo spambar", nil);
  905. STAssertNil([@"abcdef" gtm_firstSubStringMatchedByPattern:@"foo.*bar"], nil);
  906. STAssertNil([@"" gtm_firstSubStringMatchedByPattern:@"foo.*bar"], nil);
  907. // pattern w/ sub patterns
  908. STAssertEqualStrings([@"foobar" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"],
  909. @"foobar", nil);
  910. STAssertEqualStrings([@"foobydoo spambar" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"],
  911. @"foobydoo spambar", nil);
  912. STAssertEqualStrings([@"zzfoobarzz" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"],
  913. @"foobar", nil);
  914. STAssertEqualStrings([@"zzfoobydoo spambarzz" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"],
  915. @"foobydoo spambar", nil);
  916. STAssertNil([@"abcdef" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"], nil);
  917. STAssertNil([@"" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"], nil);
  918. }
  919. - (void)testSubStringMatchesPattern {
  920. // simple pattern
  921. STAssertTrue([@"foobar" gtm_subStringMatchesPattern:@"foo.*bar"], nil);
  922. STAssertTrue([@"foobydoo spambar" gtm_subStringMatchesPattern:@"foo.*bar"], nil);
  923. STAssertTrue([@"zzfoobarzz" gtm_subStringMatchesPattern:@"foo.*bar"], nil);
  924. STAssertTrue([@"zzfoobydoo spambarzz" gtm_subStringMatchesPattern:@"foo.*bar"], nil);
  925. STAssertFalse([@"abcdef" gtm_subStringMatchesPattern:@"foo.*bar"], nil);
  926. STAssertFalse([@"" gtm_subStringMatchesPattern:@"foo.*bar"], nil);
  927. // pattern w/ sub patterns
  928. STAssertTrue([@"foobar" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil);
  929. STAssertTrue([@"foobydoo spambar" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil);
  930. STAssertTrue([@"zzfoobarzz" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil);
  931. STAssertTrue([@"zzfoobydoo spambarzz" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil);
  932. STAssertFalse([@"abcdef" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil);
  933. STAssertFalse([@"" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil);
  934. }
  935. - (void)testSegmentEnumeratorForPattern {
  936. NSEnumerator *enumerator =
  937. [@"afoobarbfooobaarfoobarzz" gtm_segmentEnumeratorForPattern:@"foo+ba+r"];
  938. STAssertNotNil(enumerator, nil);
  939. // "a"
  940. GTMRegexStringSegment *seg = [enumerator nextObject];
  941. STAssertNotNil(seg, nil);
  942. STAssertFalse([seg isMatch], nil);
  943. STAssertEqualStrings([seg string], @"a", nil);
  944. // "foobar"
  945. seg = [enumerator nextObject];
  946. STAssertNotNil(seg, nil);
  947. STAssertTrue([seg isMatch], nil);
  948. STAssertEqualStrings([seg string], @"foobar", nil);
  949. // "b"
  950. seg = [enumerator nextObject];
  951. STAssertNotNil(seg, nil);
  952. STAssertFalse([seg isMatch], nil);
  953. STAssertEqualStrings([seg string], @"b", nil);
  954. // "fooobaar"
  955. seg = [enumerator nextObject];
  956. STAssertNotNil(seg, nil);
  957. STAssertTrue([seg isMatch], nil);
  958. STAssertEqualStrings([seg string], @"fooobaar", nil);
  959. // "foobar"
  960. seg = [enumerator nextObject];
  961. STAssertNotNil(seg, nil);
  962. STAssertTrue([seg isMatch], nil);
  963. STAssertEqualStrings([seg string], @"foobar", nil);
  964. // "zz"
  965. seg = [enumerator nextObject];
  966. STAssertNotNil(seg, nil);
  967. STAssertFalse([seg isMatch], nil);
  968. STAssertEqualStrings([seg string], @"zz", nil);
  969. // (end)
  970. seg = [enumerator nextObject];
  971. STAssertNil(seg, nil);
  972. // test no match
  973. enumerator = [@"aaa" gtm_segmentEnumeratorForPattern:@"foo+ba+r"];
  974. STAssertNotNil(enumerator, nil);
  975. seg = [enumerator nextObject];
  976. STAssertNotNil(seg, nil);
  977. STAssertFalse([seg isMatch], nil);
  978. STAssertEqualStrings([seg string], @"aaa", nil);
  979. seg = [enumerator nextObject];
  980. STAssertNil(seg, nil);
  981. // test only match
  982. enumerator = [@"foobar" gtm_segmentEnumeratorForPattern:@"foo+ba+r"];
  983. STAssertNotNil(enumerator, nil);
  984. seg = [enumerator nextObject];
  985. STAssertNotNil(seg, nil);
  986. STAssertTrue([seg isMatch], nil);
  987. STAssertEqualStrings([seg string], @"foobar", nil);
  988. seg = [enumerator nextObject];
  989. STAssertNil(seg, nil);
  990. // now test the saved sub segments
  991. enumerator =
  992. [@"foobarxxfoobaz" gtm_segmentEnumeratorForPattern:@"(foo)((bar)|(baz))"];
  993. STAssertNotNil(enumerator, nil);
  994. // "foobar"
  995. seg = [enumerator nextObject];
  996. STAssertNotNil(seg, nil);
  997. STAssertTrue([seg isMatch], nil);
  998. STAssertEqualStrings([seg string], @"foobar", nil);
  999. STAssertEqualStrings([seg subPatternString:0], @"foobar", nil);
  1000. STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
  1001. STAssertEqualStrings([seg subPatternString:2], @"bar", nil);
  1002. STAssertEqualStrings([seg subPatternString:3], @"bar", nil);
  1003. STAssertNil([seg subPatternString:4], nil); // nothing matched "(baz)"
  1004. STAssertNil([seg subPatternString:5], nil);
  1005. // "xx"
  1006. seg = [enumerator nextObject];
  1007. STAssertNotNil(seg, nil);
  1008. STAssertFalse([seg isMatch], nil);
  1009. STAssertEqualStrings([seg string], @"xx", nil);
  1010. STAssertEqualStrings([seg subPatternString:0], @"xx", nil);
  1011. STAssertNil([seg subPatternString:1], nil);
  1012. // "foobaz"
  1013. seg = [enumerator nextObject];
  1014. STAssertNotNil(seg, nil);
  1015. STAssertTrue([seg isMatch], nil);
  1016. STAssertEqualStrings([seg string], @"foobaz", nil);
  1017. STAssertEqualStrings([seg subPatternString:0], @"foobaz", nil);
  1018. STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
  1019. STAssertEqualStrings([seg subPatternString:2], @"baz", nil);
  1020. STAssertNil([seg subPatternString:3], nil); // (nothing matched "(bar)"
  1021. STAssertEqualStrings([seg subPatternString:4], @"baz", nil);
  1022. STAssertNil([seg subPatternString:5], nil);
  1023. // (end)
  1024. seg = [enumerator nextObject];
  1025. STAssertNil(seg, nil);
  1026. // test all objects
  1027. enumerator = [@"afoobarbfooobaarfoobarzz" gtm_segmentEnumeratorForPattern:@"foo+ba+r"];
  1028. STAssertNotNil(enumerator, nil);
  1029. NSArray *allSegments = [enumerator allObjects];
  1030. STAssertNotNil(allSegments, nil);
  1031. STAssertEquals((NSUInteger)6, [allSegments count], nil);
  1032. }
  1033. - (void)testMatchSegmentEnumeratorForPattern {
  1034. NSEnumerator *enumerator =
  1035. [@"afoobarbfooobaarfoobarzz" gtm_matchSegmentEnumeratorForPattern:@"foo+ba+r"];
  1036. STAssertNotNil(enumerator, nil);
  1037. // "a" - skipped
  1038. // "foobar"
  1039. GTMRegexStringSegment *seg = [enumerator nextObject];
  1040. STAssertNotNil(seg, nil);
  1041. STAssertTrue([seg isMatch], nil);
  1042. STAssertEqualStrings([seg string], @"foobar", nil);
  1043. // "b" - skipped
  1044. // "fooobaar"
  1045. seg = [enumerator nextObject];
  1046. STAssertNotNil(seg, nil);
  1047. STAssertTrue([seg isMatch], nil);
  1048. STAssertEqualStrings([seg string], @"fooobaar", nil);
  1049. // "foobar"
  1050. seg = [enumerator nextObject];
  1051. STAssertNotNil(seg, nil);
  1052. STAssertTrue([seg isMatch], nil);
  1053. STAssertEqualStrings([seg string], @"foobar", nil);
  1054. // "zz" - skipped
  1055. // (end)
  1056. seg = [enumerator nextObject];
  1057. STAssertNil(seg, nil);
  1058. // test no match
  1059. enumerator = [@"aaa" gtm_matchSegmentEnumeratorForPattern:@"foo+ba+r"];
  1060. STAssertNotNil(enumerator, nil);
  1061. seg = [enumerator nextObject];
  1062. STAssertNil(seg, nil);
  1063. // test only match
  1064. enumerator = [@"foobar" gtm_matchSegmentEnumeratorForPattern:@"foo+ba+r"];
  1065. STAssertNotNil(enumerator, nil);
  1066. seg = [enumerator nextObject];
  1067. STAssertNotNil(seg, nil);
  1068. STAssertTrue([seg isMatch], nil);
  1069. STAssertEqualStrings([seg string], @"foobar", nil);
  1070. seg = [enumerator nextObject];
  1071. STAssertNil(seg, nil);
  1072. // now test the saved sub segments
  1073. enumerator =
  1074. [@"foobarxxfoobaz" gtm_matchSegmentEnumeratorForPattern:@"(foo)((bar)|(baz))"];
  1075. STAssertNotNil(enumerator, nil);
  1076. // "foobar"
  1077. seg = [enumerator nextObject];
  1078. STAssertNotNil(seg, nil);
  1079. STAssertTrue([seg isMatch], nil);
  1080. STAssertEqualStrings([seg string], @"foobar", nil);
  1081. STAssertEqualStrings([seg subPatternString:0], @"foobar", nil);
  1082. STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
  1083. STAssertEqualStrings([seg subPatternString:2], @"bar", nil);
  1084. STAssertEqualStrings([seg subPatternString:3], @"bar", nil);
  1085. STAssertNil([seg subPatternString:4], nil); // nothing matched "(baz)"
  1086. STAssertNil([seg subPatternString:5], nil);
  1087. // "xx" - skipped
  1088. // "foobaz"
  1089. seg = [enumerator nextObject];
  1090. STAssertNotNil(seg, nil);
  1091. STAssertTrue([seg isMatch], nil);
  1092. STAssertEqualStrings([seg string], @"foobaz", nil);
  1093. STAssertEqualStrings([seg subPatternString:0], @"foobaz", nil);
  1094. STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
  1095. STAssertEqualStrings([seg subPatternString:2], @"baz", nil);
  1096. STAssertNil([seg subPatternString:3], nil); // (nothing matched "(bar)"
  1097. STAssertEqualStrings([seg subPatternString:4], @"baz", nil);
  1098. STAssertNil([seg subPatternString:5], nil);
  1099. // (end)
  1100. seg = [enumerator nextObject];
  1101. STAssertNil(seg, nil);
  1102. // test all objects
  1103. enumerator = [@"afoobarbfooobaarfoobarzz" gtm_matchSegmentEnumeratorForPattern:@"foo+ba+r"];
  1104. STAssertNotNil(enumerator, nil);
  1105. NSArray *allSegments = [enumerator allObjects];
  1106. STAssertNotNil(allSegments, nil);
  1107. STAssertEquals((NSUInteger)3, [allSegments count], nil);
  1108. }
  1109. - (void)testAllSubstringsMatchedByPattern {
  1110. NSArray *segments =
  1111. [@"afoobarbfooobaarfoobarzz" gtm_allSubstringsMatchedByPattern:@"foo+ba+r"];
  1112. STAssertNotNil(segments, nil);
  1113. STAssertEquals((NSUInteger)3, [segments count], nil);
  1114. STAssertEqualStrings([segments objectAtIndex:0], @"foobar", nil);
  1115. STAssertEqualStrings([segments objectAtIndex:1], @"fooobaar", nil);
  1116. STAssertEqualStrings([segments objectAtIndex:2], @"foobar", nil);
  1117. // test no match
  1118. segments = [@"aaa" gtm_allSubstringsMatchedByPattern:@"foo+ba+r"];
  1119. STAssertNotNil(segments, nil);
  1120. STAssertEquals((NSUInteger)0, [segments count], nil);
  1121. // test only match
  1122. segments = [@"foobar" gtm_allSubstringsMatchedByPattern:@"foo+ba+r"];
  1123. STAssertNotNil(segments, nil);
  1124. STAssertEquals((NSUInteger)1, [segments count], nil);
  1125. STAssertEqualStrings([segments objectAtIndex:0], @"foobar", nil);
  1126. }
  1127. - (void)testStringByReplacingMatchesOfPatternWithReplacement {
  1128. // the basics
  1129. STAssertEqualStrings(@"weeZbarZbydoo spamZfooZdoggies",
  1130. [@"weefoobydoo spambardoggies" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)"
  1131. withReplacement:@"Z\\3Z\\2Z\\1Z"],
  1132. nil);
  1133. // nil/empty replacement
  1134. STAssertEqualStrings(@"weedoggies",
  1135. [@"weefoobydoo spambardoggies" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)"
  1136. withReplacement:nil],
  1137. nil);
  1138. STAssertEqualStrings(@"weedoggies",
  1139. [@"weefoobydoo spambardoggies" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)"
  1140. withReplacement:@""],
  1141. nil);
  1142. STAssertEqualStrings(@"",
  1143. [@"" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)"
  1144. withReplacement:@"abc"],
  1145. nil);
  1146. // use optional and invale subexpression parts to confirm that works
  1147. STAssertEqualStrings(@"aaa baz bar bar foo baz aaa",
  1148. [@"aaa foooooobaz fooobar bar foo baz aaa" gtm_stringByReplacingMatchesOfPattern:@"(fo(o+))((bar)|(baz))"
  1149. withReplacement:@"\\4\\5"],
  1150. nil);
  1151. STAssertEqualStrings(@"aaa ZZZ ZZZ bar foo baz aaa",
  1152. [@"aaa foooooobaz fooobar bar foo baz aaa" gtm_stringByReplacingMatchesOfPattern:@"(fo(o+))((bar)|(baz))"
  1153. withReplacement:@"Z\\10Z\\12Z"],
  1154. nil);
  1155. // test slashes in replacement that aren't part of the subpattern reference
  1156. STAssertEqualStrings(@"z\\\\0 \\\\a \\\\\\\\0z",
  1157. [@"zaz" gtm_stringByReplacingMatchesOfPattern:@"a+"
  1158. withReplacement:@"\\\\0 \\\\\\0 \\\\\\\\0"],
  1159. nil);
  1160. STAssertEqualStrings(@"z\\\\a \\\\\\\\0 \\\\\\\\az",
  1161. [@"zaz" gtm_stringByReplacingMatchesOfPattern:@"a+"
  1162. withReplacement:@"\\\\\\0 \\\\\\\\0 \\\\\\\\\\0"],
  1163. nil);
  1164. STAssertEqualStrings(@"z\\\\\\\\0 \\\\\\\\a \\\\\\\\\\\\0z",
  1165. [@"zaz" gtm_stringByReplacingMatchesOfPattern:@"a+"
  1166. withReplacement:@"\\\\\\\\0 \\\\\\\\\\0 \\\\\\\\\\\\0"],
  1167. nil);
  1168. }
  1169. @end