/CleanUpTasks/CleanUpTasks.Tests/ConversionCleanUpHandlerTests.cs

https://github.com/sdl/Sdl-Community · C# · 972 lines · 728 code · 136 blank · 108 comment · 0 complexity · 021efcaf35ebeed6d18f2f06cd1110be MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using NSubstitute;
  4. using Sdl.FileTypeSupport.Framework.BilingualApi;
  5. using Sdl.FileTypeSupport.Framework.Formatting;
  6. using Sdl.FileTypeSupport.Framework.NativeApi;
  7. using SDLCommunityCleanUpTasks;
  8. using SDLCommunityCleanUpTasks.Models;
  9. using SDLCommunityCleanUpTasks.Utilities;
  10. using Xunit;
  11. namespace Sdl.Community.CleanUpTasks.Tests
  12. {
  13. public class ConversionCleanUpHandlerTests : IClassFixture<TestUtilities>
  14. {
  15. [Fact]
  16. public void ConstructorThrowsException()
  17. {
  18. var list = new List<ConversionItemList>();
  19. Assert.Throws<ArgumentNullException>(() => new ConversionCleanupHandler(null, list, null, null, null, BatchTaskMode.Source));
  20. }
  21. [Fact]
  22. public void VisitSegmentCreatesSinglePlaceholderWithEmbeddedTags()
  23. {
  24. // Arrange
  25. var settings = utility.CreateSettings();
  26. var list = utility.CreateConversionItemLists(searchText: "<.*?>",
  27. embeddedTags: true,
  28. useRegex: true);
  29. var segment = utility.CreateSegment(isLocked: false);
  30. var text = utility.CreateText("<html>", segment);
  31. var itemFactory = Substitute.For<IDocumentItemFactory>();
  32. var reporter = Substitute.For<ICleanUpMessageReporter>();
  33. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  34. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  35. // Act
  36. sourceHandler.VisitText(text);
  37. sourceHandler.VisitSegment(segment);
  38. // Assert
  39. text.Received().RemoveFromParent();
  40. segment.Received().Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  41. Assert.Equal(1, sourceHandler.PlaceholderList.Count);
  42. }
  43. [Fact]
  44. public void VisitSegmentCreatesEmbeddedTagPairWithSoftReturns()
  45. {
  46. // Arrange
  47. var settings = utility.CreateSettings();
  48. var list = utility.CreateConversionItemLists(searchText: "<.*?>",
  49. embeddedTags: true,
  50. useRegex: true);
  51. var segment = utility.CreateSegment(isLocked: false);
  52. var text = utility.CreateText("<head>\n<title>\nWhen non - translatable styles were not used\n</title>\n</head>", segment);
  53. var itemFactory = Substitute.For<IDocumentItemFactory>();
  54. var reporter = Substitute.For<ICleanUpMessageReporter>();
  55. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  56. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  57. // Act
  58. sourceHandler.VisitText(text);
  59. sourceHandler.VisitSegment(segment);
  60. // Assert
  61. text.Received().RemoveFromParent();
  62. segment.Received().Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  63. Assert.Equal(4, sourceHandler.PlaceholderList.Count);
  64. }
  65. [Fact]
  66. public void VisitSegmentCreatesEmbeddedTagPair()
  67. {
  68. // Arrange
  69. var settings = utility.CreateSettings();
  70. var list = utility.CreateConversionItemLists(searchText: "<strong>text is bold</strong>",
  71. embeddedTags: true);
  72. var segment = utility.CreateSegment(isLocked: false);
  73. var text = utility.CreateText("This <strong>text is bold</strong> and the tags should stay", segment);
  74. var itemFactory = Substitute.For<IDocumentItemFactory>();
  75. var reporter = Substitute.For<ICleanUpMessageReporter>();
  76. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  77. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  78. // Act
  79. sourceHandler.VisitText(text);
  80. sourceHandler.VisitSegment(segment);
  81. // Assert
  82. text.Received().RemoveFromParent();
  83. segment.Received(3).Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  84. Assert.Equal(2, sourceHandler.PlaceholderList.Count);
  85. }
  86. [Fact]
  87. public void VisitSegmentCreatesEmbeddedTagPairRegex()
  88. {
  89. // Arrange
  90. var settings = utility.CreateSettings();
  91. var list = utility.CreateConversionItemLists(searchText: "<strong>(.+?)</strong>",
  92. embeddedTags: true,
  93. useRegex: true);
  94. var segment = utility.CreateSegment(isLocked: false);
  95. var text = utility.CreateText("This <strong>text is bold</strong> and the tags should stay", segment);
  96. var itemFactory = Substitute.For<IDocumentItemFactory>();
  97. var reporter = Substitute.For<ICleanUpMessageReporter>();
  98. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  99. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  100. // Act
  101. sourceHandler.VisitText(text);
  102. sourceHandler.VisitSegment(segment);
  103. // Assert
  104. text.Received().RemoveFromParent();
  105. segment.Received(3).Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  106. }
  107. [Fact]
  108. public void VisitSegmentCreatesEmbeddedTagPairNested()
  109. {
  110. // Arrange
  111. var settings = utility.CreateSettings();
  112. var list = utility.CreateConversionItemLists(searchText: "<strong>(.+?)</strong>",
  113. embeddedTags: true,
  114. useRegex: true);
  115. var segment = utility.CreateSegment(isLocked: false);
  116. var text = utility.CreateText("This <strong>text <nested/>is bold</strong> and the tags should stay", segment);
  117. var itemFactory = Substitute.For<IDocumentItemFactory>();
  118. var reporter = Substitute.For<ICleanUpMessageReporter>();
  119. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  120. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  121. // Act
  122. sourceHandler.VisitText(text);
  123. sourceHandler.VisitSegment(segment);
  124. // Assert
  125. text.Received().RemoveFromParent();
  126. segment.Received(3).Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  127. Assert.Equal(3, sourceHandler.PlaceholderList.Count);
  128. }
  129. [Fact]
  130. public void VisitSegmentCreatesEmbeddedTagPairNestedTwice()
  131. {
  132. // Arrange
  133. var settings = utility.CreateSettings();
  134. var list = utility.CreateConversionItemLists(searchText: "<strong>(.+?)</strong>",
  135. embeddedTags: true,
  136. useRegex: true);
  137. var segment = utility.CreateSegment(isLocked: false);
  138. var text = utility.CreateText("This <strong>text with <more> nested <nested/> </more> is bold</strong> and the tags should stay", segment);
  139. var itemFactory = Substitute.For<IDocumentItemFactory>();
  140. var reporter = Substitute.For<ICleanUpMessageReporter>();
  141. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  142. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  143. // Act
  144. sourceHandler.VisitText(text);
  145. sourceHandler.VisitSegment(segment);
  146. // Assert
  147. text.Received().RemoveFromParent();
  148. segment.Received(3).Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  149. Assert.Equal(5, sourceHandler.PlaceholderList.Count);
  150. }
  151. [Fact]
  152. public void VisitSegmentCreatesOnePlaceholderWithEmbeddedTag()
  153. {
  154. // Arrange
  155. var settings = utility.CreateSettings();
  156. var list = utility.CreateConversionItemLists(searchText: "text",
  157. placeHolder: true,
  158. replacementText: "<text />");
  159. var segment = utility.CreateSegment(isLocked: false);
  160. var text = utility.CreateText("This text <will/> be replaced", segment);
  161. var itemFactory = Substitute.For<IDocumentItemFactory>();
  162. var reporter = Substitute.For<ICleanUpMessageReporter>();
  163. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  164. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  165. // Act
  166. sourceHandler.VisitText(text);
  167. sourceHandler.VisitSegment(segment);
  168. // Assert
  169. text.Received().RemoveFromParent();
  170. segment.Received(3).Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  171. }
  172. [Fact]
  173. public void VisitSegmentReportsWarningWhenReplacementEmpty()
  174. {
  175. // Arrange
  176. var settings = utility.CreateSettings();
  177. var list = utility.CreateConversionItemLists(searchText: "text",
  178. placeHolder: true);
  179. var segment = utility.CreateSegment(isLocked: false);
  180. var text = utility.CreateText("This text <will/> be replaced", segment);
  181. var itemFactory = Substitute.For<IDocumentItemFactory>();
  182. var reporter = Substitute.For<ICleanUpMessageReporter>();
  183. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  184. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  185. // Act
  186. sourceHandler.VisitText(text);
  187. sourceHandler.VisitSegment(segment);
  188. // Assert
  189. text.DidNotReceive().RemoveFromParent();
  190. reporter.Received().Report(sourceHandler, ErrorLevel.Warning, Arg.Any<string>(), Arg.Any<string>());
  191. }
  192. [Fact]
  193. public void VisitSegmentCreatesEmbeddedTagPairRegexBackReferences()
  194. {
  195. // Arrange
  196. var settings = utility.CreateSettings();
  197. var list = utility.CreateConversionItemLists(searchText: @"<([a-z]*)>.*?<\/\1>",
  198. embeddedTags: true,
  199. useRegex: true);
  200. var segment = utility.CreateSegment(isLocked: false);
  201. var text = utility.CreateText("This <strong>text is bold</strong> and the tags should stay", segment);
  202. var itemFactory = Substitute.For<IDocumentItemFactory>();
  203. var reporter = Substitute.For<ICleanUpMessageReporter>();
  204. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  205. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  206. // Act
  207. sourceHandler.VisitText(text);
  208. sourceHandler.VisitSegment(segment);
  209. // Assert
  210. text.Received().RemoveFromParent();
  211. segment.Received(3).Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  212. }
  213. [Fact]
  214. public void VisitSegmentCreatesNewFormattingTagPair()
  215. {
  216. // Arrange
  217. var settings = utility.CreateSettings();
  218. var list = utility.CreateConversionItemLists(searchText: "some text",
  219. placeHolder: true,
  220. replacementText: "<cf bold=\"True\">some text</cf>");
  221. var segment = utility.CreateSegment(isLocked: false);
  222. var text = utility.CreateText("some text", segment);
  223. var itemFactory = Substitute.For<IDocumentItemFactory>();
  224. var reporter = Substitute.For<ICleanUpMessageReporter>();
  225. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  226. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  227. // Act
  228. sourceHandler.VisitText(text);
  229. sourceHandler.VisitSegment(segment);
  230. // Assert
  231. text.Received().RemoveFromParent();
  232. segment.Received().Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  233. }
  234. [Fact]
  235. public void VisitSegmentCreatesPlaceholderElement()
  236. {
  237. // Arrange
  238. var settings = utility.CreateSettings();
  239. var list = utility.CreateConversionItemLists(searchText: @"name",
  240. replacementText: "<name />",
  241. placeHolder: true);
  242. var segment = utility.CreateSegment(isLocked: false);
  243. var text = utility.CreateText("hello my name is bob", segment);
  244. var itemFactory = Substitute.For<IDocumentItemFactory>();
  245. var reporter = Substitute.For<ICleanUpMessageReporter>();
  246. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  247. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  248. // Act
  249. sourceHandler.VisitText(text);
  250. sourceHandler.VisitSegment(segment);
  251. // Assert
  252. segment.Received(3).Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  253. text.Received().RemoveFromParent();
  254. }
  255. [Fact]
  256. public void VisitSegmentCreatesPlaceholderElementAndUpdatesSurroundingTextToUpper()
  257. {
  258. // Arrange
  259. var settings = utility.CreateSettings();
  260. var list = utility.CreateConversionItemLists(searchText: @"([0-9]+)",
  261. useRegex: true,
  262. replacementText: @"<numbers value=""$1""/>",
  263. placeHolder: true);
  264. list[0].Items.Add(new ConversionItem()
  265. {
  266. Search = new SearchText() { Text = "here is" },
  267. Replacement = new ReplacementText() { Text = "I REPLACED THIS" }
  268. });
  269. list[0].Items.Add(new ConversionItem()
  270. {
  271. Search = new SearchText() { Text = "other" },
  272. Replacement = new ReplacementText() { Text = "", ToUpper = true }
  273. });
  274. var segment = utility.CreateSegment(isLocked: false);
  275. var text = utility.CreateText("here is some numbers 123456 and some other stuff", segment);
  276. var itemFactory = Substitute.For<IDocumentItemFactory>();
  277. var reporter = Substitute.For<ICleanUpMessageReporter>();
  278. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  279. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  280. // Act
  281. sourceHandler.VisitText(text);
  282. sourceHandler.VisitSegment(segment);
  283. // Assert
  284. segment.DidNotReceive().RemoveFromParent();
  285. segment.Received(3).Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  286. text.Received().RemoveFromParent();
  287. }
  288. [Fact]
  289. public void VisitSegmentCreatesPlaceholderElementAndUpdatesText()
  290. {
  291. // Arrange
  292. var settings = utility.CreateSettings();
  293. var list = utility.CreateConversionItemLists(searchText: @"([0-9]+)",
  294. useRegex: true,
  295. replacementText: @"<numbers value=""$1""/>",
  296. placeHolder: true);
  297. list[0].Items.Add(new ConversionItem()
  298. {
  299. Search = new SearchText() { Text = "here is" },
  300. Replacement = new ReplacementText() { Text = "I REPLACED THIS" }
  301. });
  302. var segment = utility.CreateSegment(isLocked: false);
  303. var text = utility.CreateText("here is some numbers 123456", segment);
  304. var itemFactory = Substitute.For<IDocumentItemFactory>();
  305. var reporter = Substitute.For<ICleanUpMessageReporter>();
  306. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  307. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  308. // Act
  309. sourceHandler.VisitText(text);
  310. sourceHandler.VisitSegment(segment);
  311. // Assert
  312. segment.DidNotReceive().RemoveFromParent();
  313. segment.Received().Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  314. text.Received().RemoveFromParent();
  315. }
  316. [Fact]
  317. public void VisitSegmentCreatesPlaceholderElementWithAttributeRegex()
  318. {
  319. // Arrange
  320. var settings = utility.CreateSettings();
  321. var list = utility.CreateConversionItemLists(searchText: @"([0-9]+)",
  322. useRegex: true,
  323. replacementText: @"<numbers value=""$1""/>",
  324. placeHolder: true);
  325. var segment = utility.CreateSegment(isLocked: false);
  326. var text = utility.CreateText("here is some numbers 123456", segment);
  327. var itemFactory = Substitute.For<IDocumentItemFactory>();
  328. var reporter = Substitute.For<ICleanUpMessageReporter>();
  329. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  330. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  331. // Act
  332. sourceHandler.VisitText(text);
  333. sourceHandler.VisitSegment(segment);
  334. // Assert
  335. segment.DidNotReceive().RemoveFromParent();
  336. segment.Received().Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  337. text.Received().RemoveFromParent();
  338. }
  339. [Fact]
  340. public void VisitSegmentCreatesSinglePlaceholderElement()
  341. {
  342. // Arrange
  343. var settings = utility.CreateSettings();
  344. var list = utility.CreateConversionItemLists(searchText: @"Company",
  345. useRegex: true,
  346. replacementText: @"<Company />",
  347. placeHolder: true);
  348. var segment = utility.CreateSegment(isLocked: false);
  349. var text = utility.CreateText("Company", segment);
  350. var itemFactory = Substitute.For<IDocumentItemFactory>();
  351. var reporter = Substitute.For<ICleanUpMessageReporter>();
  352. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  353. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  354. // Act
  355. sourceHandler.VisitText(text);
  356. sourceHandler.VisitSegment(segment);
  357. // Assert
  358. segment.Received().Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  359. text.Received().RemoveFromParent();
  360. }
  361. [Fact]
  362. public void VisitSegmentDoesNotUpdateITextInvalidRegex()
  363. {
  364. // Arrange
  365. var settings = utility.CreateSettings();
  366. var list = utility.CreateConversionItemLists(searchText: @".)",
  367. useRegex: true,
  368. caseSensitive: false,
  369. replacementText: "whatever");
  370. var segment = utility.CreateSegment(isLocked: false);
  371. var text = utility.CreateText("I remain the same", segment);
  372. var itemFactory = Substitute.For<IDocumentItemFactory>();
  373. var reporter = Substitute.For<ICleanUpMessageReporter>();
  374. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  375. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  376. // Act
  377. sourceHandler.VisitText(text);
  378. sourceHandler.VisitSegment(segment);
  379. // Assert
  380. var result = text.Properties.Text;
  381. Assert.Equal("I remain the same", result);
  382. }
  383. [Fact]
  384. public void VisitSegmentDoesNotUpdateITextNoMatchNormalCaseSensitive()
  385. {
  386. // Arrange
  387. var settings = utility.CreateSettings();
  388. var list = utility.CreateConversionItemLists(searchText: @"no match",
  389. caseSensitive: true,
  390. replacementText: "whatever");
  391. var segment = utility.CreateSegment(isLocked: false);
  392. var text = utility.CreateText("NO MATCH", segment);
  393. var itemFactory = Substitute.For<IDocumentItemFactory>();
  394. var reporter = Substitute.For<ICleanUpMessageReporter>();
  395. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  396. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  397. // Act
  398. sourceHandler.VisitText(text);
  399. sourceHandler.VisitSegment(segment);
  400. // Assert
  401. var result = text.Properties.Text;
  402. Assert.Equal("NO MATCH", result);
  403. }
  404. [Fact]
  405. public void VisitSegmentDoesNotUpdateITextNoMatchRegex()
  406. {
  407. // Arrange
  408. var settings = utility.CreateSettings();
  409. var list = utility.CreateConversionItemLists(searchText: @"[0-9]",
  410. caseSensitive: false,
  411. replacementText: "whatever");
  412. var segment = utility.CreateSegment(isLocked: false);
  413. var text = utility.CreateText("I contain no numbers", segment);
  414. var itemFactory = Substitute.For<IDocumentItemFactory>();
  415. var reporter = Substitute.For<ICleanUpMessageReporter>();
  416. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  417. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  418. // Act
  419. sourceHandler.VisitText(text);
  420. sourceHandler.VisitSegment(segment);
  421. // Assert
  422. var result = text.Properties.Text;
  423. Assert.Equal("I contain no numbers", result);
  424. }
  425. [Fact]
  426. public void VisitSegmentMatchesTagPairAndCreatesPlaceholder()
  427. {
  428. // Arrange
  429. var settings = utility.CreateSettings();
  430. var list = utility.CreateConversionItemLists(searchText: "<tag>(.+?)</tag>",
  431. tagPair: true,
  432. replacementText: @"<tag trans=""$1""/>",
  433. placeHolder: true);
  434. var segment = utility.CreateSegment(isLocked: false);
  435. var text = utility.CreateText("some text", segment);
  436. var tagPair = utility.CreateTag("<tag>", "</tag>", text);
  437. tagPair.Parent = utility.CreateSegment();
  438. var itemFactory = Substitute.For<IDocumentItemFactory>();
  439. var reporter = Substitute.For<ICleanUpMessageReporter>();
  440. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  441. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  442. // Act
  443. sourceHandler.VisitTagPair(tagPair);
  444. sourceHandler.VisitSegment(segment);
  445. // Assert
  446. tagPair.Parent.Received().Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  447. tagPair.Received().RemoveFromParent();
  448. }
  449. [Fact]
  450. public void VisitSegmentMatchesTagPairAndUpdatesContent()
  451. {
  452. // Arrange
  453. var settings = utility.CreateSettings();
  454. var list = utility.CreateConversionItemLists(searchText: "<cf bold=\"True\">(.+?)</cf>",
  455. tagPair: true,
  456. replacementText: "<cf bold=\"True\">$1</cf>",
  457. toUpper: true);
  458. var segment = utility.CreateSegment(isLocked: false);
  459. var text = utility.CreateText("some text", segment);
  460. var tagPair = utility.CreateTag("<cf bold=\"True\">", "</cf>", text);
  461. tagPair.Parent = utility.CreateSegment();
  462. var itemFactory = Substitute.For<IDocumentItemFactory>();
  463. var reporter = Substitute.For<ICleanUpMessageReporter>();
  464. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  465. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  466. // Act
  467. sourceHandler.VisitTagPair(tagPair);
  468. sourceHandler.VisitSegment(segment);
  469. // Assert
  470. tagPair.Received().Add(Arg.Any<IAbstractMarkupData>());
  471. tagPair.DidNotReceive().RemoveFromParent();
  472. }
  473. [Fact]
  474. public void VisitSegmentMatchesTagPairAndUpdatesFormatting()
  475. {
  476. // Arrange
  477. var settings = utility.CreateSettings();
  478. var list = utility.CreateConversionItemLists(searchText: "<cf bold=\"True\">(.+?)</cf>",
  479. tagPair: true,
  480. replacementText: "<cf bold=\"False\">$1</cf>");
  481. var segment = utility.CreateSegment(isLocked: false);
  482. var text = utility.CreateText("some text", segment);
  483. var tagPair = utility.CreateTag("<cf bold=\"True\">", "</cf>", text);
  484. tagPair.Parent = utility.CreateSegment();
  485. var itemFactory = Substitute.For<IDocumentItemFactory>();
  486. var reporter = Substitute.For<ICleanUpMessageReporter>();
  487. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  488. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  489. // Act
  490. sourceHandler.VisitTagPair(tagPair);
  491. sourceHandler.VisitSegment(segment);
  492. // Assert
  493. tagPair.StartTagProperties.Formatting.Received().Add(Arg.Any<IFormattingItem>());
  494. tagPair.DidNotReceive().RemoveFromParent();
  495. }
  496. [Fact]
  497. public void VisitSegmentMatchesWholeWord()
  498. {
  499. // Arrange
  500. var settings = utility.CreateSettings();
  501. var list = utility.CreateConversionItemLists(searchText: "the",
  502. wholeWord: true,
  503. replacementText: "REPLACED");
  504. var segment = utility.CreateSegment(isLocked: false);
  505. var text = utility.CreateText("theater the them their", segment);
  506. var itemFactory = Substitute.For<IDocumentItemFactory>();
  507. var reporter = Substitute.For<ICleanUpMessageReporter>();
  508. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  509. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  510. // Act
  511. sourceHandler.VisitText(text);
  512. sourceHandler.VisitSegment(segment);
  513. // Assert
  514. Assert.Equal("theater REPLACED them their", text.Properties.Text);
  515. }
  516. [Fact]
  517. public void VisitSegmentMatchesWholeWordPlaceholder()
  518. {
  519. // Arrange
  520. var settings = utility.CreateSettings();
  521. var list = utility.CreateConversionItemLists(searchText: "d",
  522. wholeWord: true,
  523. replacementText: @"<locked name=""d""/>",
  524. placeHolder: true);
  525. var segment = utility.CreateSegment(isLocked: false);
  526. var text = utility.CreateText("hidden d in does dead", segment);
  527. var itemFactory = Substitute.For<IDocumentItemFactory>();
  528. var reporter = Substitute.For<ICleanUpMessageReporter>();
  529. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  530. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  531. // Act
  532. sourceHandler.VisitText(text);
  533. sourceHandler.VisitSegment(segment);
  534. // Assert
  535. segment.Received(3).Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  536. text.Received().RemoveFromParent();
  537. }
  538. [Fact]
  539. public void VisitSegmentMatchesWholeWordWithMultipleReplacements()
  540. {
  541. // Arrange
  542. var settings = utility.CreateSettings();
  543. var list = utility.CreateConversionItemLists(searchText: "d",
  544. wholeWord: true,
  545. replacementText: @"<locked name=""d""/>",
  546. placeHolder: true);
  547. var segment = utility.CreateSegment(isLocked: false);
  548. var text = utility.CreateText("hidden d in does dead and there is another d", segment);
  549. var itemFactory = Substitute.For<IDocumentItemFactory>();
  550. var reporter = Substitute.For<ICleanUpMessageReporter>();
  551. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  552. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  553. // Act
  554. sourceHandler.VisitText(text);
  555. sourceHandler.VisitSegment(segment);
  556. // Assert
  557. segment.Received(4).Insert(Arg.Any<int>(), Arg.Any<IAbstractMarkupData>());
  558. text.Received().RemoveFromParent();
  559. }
  560. [Fact]
  561. public void VisitSegmentsSkipsLockedSegment()
  562. {
  563. // Arrange
  564. var settings = utility.CreateSettings();
  565. var list = new List<ConversionItemList>();
  566. var segment = utility.CreateSegment(isLocked: true);
  567. var tagPair = utility.CreateTag();
  568. segment.GetEnumerator().Returns(utility.AbstractMarkupDataContainer(tagPair));
  569. var itemFactory = Substitute.For<IDocumentItemFactory>();
  570. var reporter = Substitute.For<ICleanUpMessageReporter>();
  571. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  572. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  573. // Act
  574. sourceHandler.VisitSegment(segment);
  575. // Assert
  576. tagPair.DidNotReceive().AcceptVisitor(sourceHandler);
  577. }
  578. [Fact]
  579. public void VisitSegmentUpdatesITextCaseInSensitive()
  580. {
  581. // Arrange
  582. var settings = utility.CreateSettings();
  583. var list = utility.CreateConversionItemLists(searchText: @"hello",
  584. caseSensitive: false,
  585. replacementText: "hello");
  586. var segment = utility.CreateSegment(isLocked: false);
  587. var text = utility.CreateText("Hello HELLO heLLo", segment);
  588. var itemFactory = Substitute.For<IDocumentItemFactory>();
  589. var reporter = Substitute.For<ICleanUpMessageReporter>();
  590. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  591. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  592. // Act
  593. sourceHandler.VisitText(text);
  594. sourceHandler.VisitSegment(segment);
  595. // Assert
  596. var result = text.Properties.Text;
  597. Assert.Equal("hello hello hello", result);
  598. }
  599. [Fact]
  600. public void VisitSegmentUpdatesITextCaseSensitive()
  601. {
  602. // Arrange
  603. var settings = utility.CreateSettings();
  604. var list = utility.CreateConversionItemLists(searchText: "TEXT RIGHT HERE",
  605. caseSensitive: true,
  606. replacementText: "I REPLACED IT");
  607. var segment = utility.CreateSegment(isLocked: false);
  608. var text = utility.CreateText("Text right here TEXT RIGHT HERE", segment);
  609. var itemFactory = Substitute.For<IDocumentItemFactory>();
  610. var reporter = Substitute.For<ICleanUpMessageReporter>();
  611. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  612. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  613. // Act
  614. sourceHandler.VisitText(text);
  615. sourceHandler.VisitSegment(segment);
  616. // Assert
  617. var result = text.Properties.Text;
  618. Assert.Equal("Text right here I REPLACED IT", result);
  619. }
  620. [Fact]
  621. public void VisitSegmentUpdatesITextComplexSegmentTagSensitive()
  622. {
  623. // Arrange
  624. var settings = utility.CreateSettings();
  625. var list = utility.CreateConversionItemLists(searchText: "Delete me",
  626. replacementText: "");
  627. var segment = utility.CreateSegment(isLocked: false);
  628. var text1 = utility.CreateText("Delete me", segment);
  629. var text2 = utility.CreateText("I will remain", segment);
  630. var tag = utility.CreateTag(new Bold(true));
  631. var itemFactory = Substitute.For<IDocumentItemFactory>();
  632. var reporter = Substitute.For<ICleanUpMessageReporter>();
  633. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  634. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  635. // Act
  636. sourceHandler.VisitText(text1);
  637. sourceHandler.VisitTagPair(tag);
  638. sourceHandler.VisitText(text2);
  639. sourceHandler.VisitSegment(segment);
  640. // Assert
  641. text1.Received().RemoveFromParent();
  642. Assert.Equal("I will remain", text2.Properties.Text);
  643. }
  644. [Fact]
  645. public void VisitSegmentUpdatesITextJapanese()
  646. {
  647. // Arrange
  648. var settings = utility.CreateSettings();
  649. var list = utility.CreateConversionItemLists(searchText: "カタカナ",
  650. replacementText: "かたかな");
  651. var segment = utility.CreateSegment(isLocked: false);
  652. var text = utility.CreateText("カタカナかたかなカタカナ", segment);
  653. var itemFactory = Substitute.For<IDocumentItemFactory>();
  654. var reporter = Substitute.For<ICleanUpMessageReporter>();
  655. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  656. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  657. // Act
  658. sourceHandler.VisitText(text);
  659. sourceHandler.VisitSegment(segment);
  660. // Assert
  661. var result = text.Properties.Text;
  662. Assert.Equal("かたかなかたかなかたかな", result);
  663. }
  664. [Fact]
  665. public void VisitSegmentUpdatesITextRegex()
  666. {
  667. // Arrange
  668. var settings = utility.CreateSettings();
  669. var list = utility.CreateConversionItemLists(searchText: @"\b(\w+)(\s)(\w+)\b",
  670. caseSensitive: true,
  671. useRegex: true,
  672. replacementText: "$3$2$1");
  673. var segment = utility.CreateSegment(isLocked: false);
  674. var text = utility.CreateText("one two", segment);
  675. var itemFactory = Substitute.For<IDocumentItemFactory>();
  676. var reporter = Substitute.For<ICleanUpMessageReporter>();
  677. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  678. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  679. // Act
  680. sourceHandler.VisitText(text);
  681. sourceHandler.VisitSegment(segment);
  682. // Assert
  683. var result = text.Properties.Text;
  684. Assert.Equal("two one", result);
  685. }
  686. [Fact]
  687. public void VisitSegmentUpdatesITextStrConv()
  688. {
  689. // Arrange
  690. var settings = utility.CreateSettings();
  691. var list = utility.CreateConversionItemLists(searchText: "カタカナ",
  692. strConv: true,
  693. vbstrConv: utility.CreateVbStrConvList(Microsoft.VisualBasic.VbStrConv.Wide),
  694. replacementText: "");
  695. var segment = utility.CreateSegment(isLocked: false);
  696. var text = utility.CreateText("カタカナHelloカタカナ", segment);
  697. var itemFactory = Substitute.For<IDocumentItemFactory>();
  698. var reporter = Substitute.For<ICleanUpMessageReporter>();
  699. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  700. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  701. // Act
  702. sourceHandler.VisitText(text);
  703. sourceHandler.VisitSegment(segment);
  704. // Assert
  705. Assert.Equal("カタカナHelloカタカナ", text.Properties.Text);
  706. }
  707. [Fact]
  708. public void VisitSegmentUpdatesITextStrConvRegex()
  709. {
  710. // Arrange
  711. var settings = utility.CreateSettings();
  712. var list = utility.CreateConversionItemLists(searchText: "[ヲ-゚]+",
  713. strConv: true,
  714. useRegex: true,
  715. vbstrConv: utility.CreateVbStrConvList(Microsoft.VisualBasic.VbStrConv.Wide),
  716. replacementText: "");
  717. var segment = utility.CreateSegment(isLocked: false);
  718. var text = utility.CreateText("カタカナHelloカタカナ", segment);
  719. var itemFactory = Substitute.For<IDocumentItemFactory>();
  720. var reporter = Substitute.For<ICleanUpMessageReporter>();
  721. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  722. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  723. // Act
  724. sourceHandler.VisitText(text);
  725. sourceHandler.VisitSegment(segment);
  726. // Assert
  727. Assert.Equal("カタカナHelloカタカナ", text.Properties.Text);
  728. }
  729. [Fact]
  730. public void VisitSegmentUpdatesITextStrConvUppercase()
  731. {
  732. // Arrange
  733. var settings = utility.CreateSettings();
  734. var list = utility.CreateConversionItemLists(searchText: ".+",
  735. strConv: true,
  736. useRegex: true,
  737. vbstrConv: utility.CreateVbStrConvList(Microsoft.VisualBasic.VbStrConv.Uppercase),
  738. replacementText: "");
  739. var segment = utility.CreateSegment(isLocked: false);
  740. var text = utility.CreateText("some lowercase text", segment);
  741. var itemFactory = Substitute.For<IDocumentItemFactory>();
  742. var reporter = Substitute.For<ICleanUpMessageReporter>();
  743. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  744. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  745. // Act
  746. sourceHandler.VisitText(text);
  747. sourceHandler.VisitSegment(segment);
  748. // Assert
  749. Assert.Equal("SOME LOWERCASE TEXT", text.Properties.Text);
  750. }
  751. [Fact]
  752. public void VisitSegmentUpdatesITextToLower()
  753. {
  754. // Arrange
  755. var settings = utility.CreateSettings();
  756. var list = utility.CreateConversionItemLists(searchText: @"[A-Z]\b",
  757. useRegex: true,
  758. caseSensitive: true,
  759. replacementText: "",
  760. toLower: true);
  761. var segment = utility.CreateSegment(isLocked: false);
  762. var text = utility.CreateText("thE lasT letteR shoulD bE madE lowercasE", segment);
  763. var itemFactory = Substitute.For<IDocumentItemFactory>();
  764. var reporter = Substitute.For<ICleanUpMessageReporter>();
  765. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  766. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  767. // Act
  768. sourceHandler.VisitText(text);
  769. sourceHandler.VisitSegment(segment);
  770. // Assert
  771. var result = text.Properties.Text;
  772. Assert.Equal("the last letter should be made lowercase", result);
  773. }
  774. [Fact]
  775. public void VisitSegmentUpdatesITextToUpper()
  776. {
  777. // Arrange
  778. var settings = utility.CreateSettings();
  779. var list = utility.CreateConversionItemLists(searchText: "[a-z]",
  780. useRegex: true,
  781. caseSensitive: true,
  782. replacementText: "",
  783. toUpper: true);
  784. var segment = utility.CreateSegment(isLocked: false);
  785. var text = utility.CreateText("SOME TEXT make me uppercase", segment);
  786. var itemFactory = Substitute.For<IDocumentItemFactory>();
  787. var reporter = Substitute.For<ICleanUpMessageReporter>();
  788. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  789. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  790. // Act
  791. sourceHandler.VisitText(text);
  792. sourceHandler.VisitSegment(segment);
  793. // Assert
  794. var result = text.Properties.Text;
  795. Assert.Equal("SOME TEXT MAKE ME UPPERCASE", result);
  796. }
  797. [Fact]
  798. public void VisitSegmentUpdatesMetaDataOfFormattingTag()
  799. {
  800. // Arrange
  801. var settings = utility.CreateSettings();
  802. var list = utility.CreateConversionItemLists(searchText: "<cf bold=\"True\">(.+?)</cf>",
  803. tagPair: true,
  804. replacementText: "<cf bold=\"False\">$1</cf>",
  805. toUpper: true);
  806. var segment = utility.CreateSegment(isLocked: false);
  807. var text = utility.CreateText("some text", segment);
  808. var tagPair = utility.CreateTag("<cf bold=\"True\">", "</cf>", text);
  809. tagPair.Parent = utility.CreateSegment();
  810. tagPair.StartTagProperties.TagContent = "<cf bold=\"True\">";
  811. tagPair.TagProperties.Returns(Substitute.For<IAbstractTagProperties>());
  812. var pair = new KeyValuePair<string, string>("bold", $@"<w:rPr> { Environment.NewLine }< w:bold w:val = ""True"" /></ w:rPr > ");
  813. tagPair.TagProperties.MetaData.Returns(new List<KeyValuePair<string, string>>()
  814. {
  815. pair
  816. });
  817. var itemFactory = Substitute.For<IDocumentItemFactory>();
  818. var reporter = Substitute.For<ICleanUpMessageReporter>();
  819. var reportGenerator = Substitute.For<IXmlReportGenerator>();
  820. var sourceHandler = new ConversionCleanupHandler(settings, list, itemFactory, reporter, reportGenerator, BatchTaskMode.Source);
  821. // Act
  822. sourceHandler.VisitTagPair(tagPair);
  823. sourceHandler.VisitSegment(segment);
  824. // Assert
  825. tagPair.StartTagProperties.Formatting.Received().Add(Arg.Any<IFormattingItem>());
  826. tagPair.TagProperties.Received().SetMetaData(Arg.Any<string>(), Arg.Any<string>());
  827. }
  828. #region Fixture
  829. private readonly TestUtilities utility = null;
  830. public ConversionCleanUpHandlerTests(TestUtilities utility)
  831. {
  832. this.utility = utility;
  833. }
  834. #endregion Fixture
  835. }
  836. }