PageRenderTime 47ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/gems/diff-lcs-1.1.2/tests/00test.rb

https://bitbucket.org/dummied/tweet-stitch
Ruby | 626 lines | 552 code | 59 blank | 15 comment | 5 complexity | 5d09b78ee37ae6d72964c4fb87a711d2 MD5 | raw file
Possible License(s): GPL-2.0, MIT
  1. #! /usr/bin/env ruby
  2. #
  3. $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../lib") if __FILE__ == $0
  4. require 'diff/lcs'
  5. require 'test/unit'
  6. require 'pp'
  7. require 'diff/lcs/array'
  8. module Diff::LCS::Tests
  9. def __format_diffs(diffs)
  10. diffs.map do |e|
  11. if e.kind_of?(Array)
  12. e.map { |f| f.to_a.join }.join(", ")
  13. else
  14. e.to_a.join
  15. end
  16. end.join("; ")
  17. end
  18. def __map_diffs(diffs, klass = Diff::LCS::ContextChange)
  19. diffs.map do |chunks|
  20. if klass == Diff::LCS::ContextChange
  21. klass.from_a(chunks)
  22. else
  23. chunks.map { |changes| klass.from_a(changes) }
  24. end
  25. end
  26. end
  27. def __simple_callbacks
  28. callbacks = Object.new
  29. class << callbacks
  30. attr_reader :matched_a
  31. attr_reader :matched_b
  32. attr_reader :discards_a
  33. attr_reader :discards_b
  34. attr_reader :done_a
  35. attr_reader :done_b
  36. def reset
  37. @matched_a = []
  38. @matched_b = []
  39. @discards_a = []
  40. @discards_b = []
  41. @done_a = []
  42. @done_b = []
  43. end
  44. def match(event)
  45. @matched_a << event.old_element
  46. @matched_b << event.new_element
  47. end
  48. def discard_b(event)
  49. @discards_b << event.new_element
  50. end
  51. def discard_a(event)
  52. @discards_a << event.old_element
  53. end
  54. def finished_a(event)
  55. @done_a << [event.old_element, event.old_position]
  56. end
  57. def finished_b(event)
  58. @done_b << [event.new_element, event.new_position]
  59. end
  60. end
  61. callbacks.reset
  62. callbacks
  63. end
  64. def __balanced_callback
  65. cb = Object.new
  66. class << cb
  67. attr_reader :result
  68. def reset
  69. @result = ""
  70. end
  71. def match(event)
  72. @result << "M#{event.old_position}#{event.new_position} "
  73. end
  74. def discard_a(event)
  75. @result << "DA#{event.old_position}#{event.new_position} "
  76. end
  77. def discard_b(event)
  78. @result << "DB#{event.old_position}#{event.new_position} "
  79. end
  80. def change(event)
  81. @result << "C#{event.old_position}#{event.new_position} "
  82. end
  83. end
  84. cb.reset
  85. cb
  86. end
  87. def setup
  88. @seq1 = %w(a b c e h j l m n p)
  89. @seq2 = %w(b c d e f j k l m r s t)
  90. @correct_lcs = %w(b c e j l m)
  91. @skipped_seq1 = 'a h n p'
  92. @skipped_seq2 = 'd f k r s t'
  93. correct_diff = [
  94. [ [ '-', 0, 'a' ] ],
  95. [ [ '+', 2, 'd' ] ],
  96. [ [ '-', 4, 'h' ],
  97. [ '+', 4, 'f' ] ],
  98. [ [ '+', 6, 'k' ] ],
  99. [ [ '-', 8, 'n' ],
  100. [ '-', 9, 'p' ],
  101. [ '+', 9, 'r' ],
  102. [ '+', 10, 's' ],
  103. [ '+', 11, 't' ] ] ]
  104. @correct_diff = __map_diffs(correct_diff, Diff::LCS::Change)
  105. end
  106. end
  107. class TestLCS < Test::Unit::TestCase
  108. include Diff::LCS::Tests
  109. def test_lcs
  110. res = ares = bres = nil
  111. assert_nothing_raised { res = Diff::LCS.__lcs(@seq1, @seq2) }
  112. # The result of the LCS (less the +nil+ values) must be as long as the
  113. # correct result.
  114. assert_equal(res.compact.size, @correct_lcs.size)
  115. res.each_with_index { |ee, ii| assert(ee.nil? || (@seq1[ii] == @seq2[ee])) }
  116. assert_nothing_raised { ares = (0...res.size).map { |ii| res[ii] ? @seq1[ii] : nil } }
  117. assert_nothing_raised { bres = (0...res.size).map { |ii| res[ii] ? @seq2[res[ii]] : nil } }
  118. assert_equal(@correct_lcs, ares.compact)
  119. assert_equal(@correct_lcs, bres.compact)
  120. assert_nothing_raised { res = Diff::LCS.LCS(@seq1, @seq2) }
  121. assert_equal(res.compact, @correct_lcs)
  122. end
  123. end
  124. class TestSequences < Test::Unit::TestCase
  125. include Diff::LCS::Tests
  126. def test_sequences
  127. callbacks = nil
  128. assert_nothing_raised do
  129. callbacks = __simple_callbacks
  130. class << callbacks
  131. undef :finished_a
  132. undef :finished_b
  133. end
  134. Diff::LCS.traverse_sequences(@seq1, @seq2, callbacks)
  135. end
  136. assert_equal(@correct_lcs.size, callbacks.matched_a.size)
  137. assert_equal(@correct_lcs.size, callbacks.matched_b.size)
  138. assert_equal(@skipped_seq1, callbacks.discards_a.join(" "))
  139. assert_equal(@skipped_seq2, callbacks.discards_b.join(" "))
  140. assert_nothing_raised do
  141. callbacks = __simple_callbacks
  142. Diff::LCS.traverse_sequences(@seq1, @seq2, callbacks)
  143. end
  144. assert_equal(@correct_lcs.size, callbacks.matched_a.size)
  145. assert_equal(@correct_lcs.size, callbacks.matched_b.size)
  146. assert_equal(@skipped_seq1, callbacks.discards_a.join(" "))
  147. assert_equal(@skipped_seq2, callbacks.discards_b.join(" "))
  148. assert_equal(9, callbacks.done_a[0][1])
  149. assert_nil(callbacks.done_b[0])
  150. # seqw = %w(abcd efgh ijkl mnopqrstuvwxyz)
  151. # assert_nothing_raised do
  152. # callbacks = __simple_callbacks
  153. # class << callbacks
  154. # undef :finished_a
  155. # undef :finished_b
  156. # end
  157. # Diff::LCS.traverse_sequences(seqw, [], callbacks)
  158. # end
  159. end
  160. def test_diff
  161. diff = nil
  162. assert_nothing_raised { diff = Diff::LCS.diff(@seq1, @seq2) }
  163. assert_equal(__format_diffs(@correct_diff), __format_diffs(diff))
  164. assert_equal(@correct_diff, diff)
  165. end
  166. def test_diff_empty
  167. seqw = %w(abcd efgh ijkl mnopqrstuvwxyz)
  168. correct_diff = [
  169. [ [ '-', 0, 'abcd' ],
  170. [ '-', 1, 'efgh' ],
  171. [ '-', 2, 'ijkl' ],
  172. [ '-', 3, 'mnopqrstuvwxyz' ] ] ]
  173. diff = nil
  174. assert_nothing_raised { diff = Diff::LCS.diff(seqw, []) }
  175. assert_equal(__format_diffs(correct_diff), __format_diffs(diff))
  176. correct_diff = [
  177. [ [ '+', 0, 'abcd' ],
  178. [ '+', 1, 'efgh' ],
  179. [ '+', 2, 'ijkl' ],
  180. [ '+', 3, 'mnopqrstuvwxyz' ] ] ]
  181. assert_nothing_raised { diff = Diff::LCS.diff([], seqw) }
  182. assert_equal(__format_diffs(correct_diff), __format_diffs(diff))
  183. end
  184. end
  185. class TestBalanced < Test::Unit::TestCase
  186. include Diff::LCS::Tests
  187. def test_sdiff_a
  188. sdiff = nil
  189. seq1 = %w(abc def yyy xxx ghi jkl)
  190. seq2 = %w(abc dxf xxx ghi jkl)
  191. correct_sdiff = [
  192. [ '=', [ 0, 'abc' ], [ 0, 'abc' ] ],
  193. [ '!', [ 1, 'def' ], [ 1, 'dxf' ] ],
  194. [ '-', [ 2, 'yyy' ], [ 2, nil ] ],
  195. [ '=', [ 3, 'xxx' ], [ 2, 'xxx' ] ],
  196. [ '=', [ 4, 'ghi' ], [ 3, 'ghi' ] ],
  197. [ '=', [ 5, 'jkl' ], [ 4, 'jkl' ] ] ]
  198. correct_sdiff = __map_diffs(correct_sdiff)
  199. assert_nothing_raised { sdiff = Diff::LCS.sdiff(seq1, seq2) }
  200. assert_equal(correct_sdiff, sdiff)
  201. end
  202. def test_sdiff_b
  203. sdiff = nil
  204. correct_sdiff = [
  205. [ '-', [ 0, 'a' ], [ 0, nil ] ],
  206. [ '=', [ 1, 'b' ], [ 0, 'b' ] ],
  207. [ '=', [ 2, 'c' ], [ 1, 'c' ] ],
  208. [ '+', [ 3, nil ], [ 2, 'd' ] ],
  209. [ '=', [ 3, 'e' ], [ 3, 'e' ] ],
  210. [ '!', [ 4, 'h' ], [ 4, 'f' ] ],
  211. [ '=', [ 5, 'j' ], [ 5, 'j' ] ],
  212. [ '+', [ 6, nil ], [ 6, 'k' ] ],
  213. [ '=', [ 6, 'l' ], [ 7, 'l' ] ],
  214. [ '=', [ 7, 'm' ], [ 8, 'm' ] ],
  215. [ '!', [ 8, 'n' ], [ 9, 'r' ] ],
  216. [ '!', [ 9, 'p' ], [ 10, 's' ] ],
  217. [ '+', [ 10, nil ], [ 11, 't' ] ] ]
  218. correct_sdiff = __map_diffs(correct_sdiff)
  219. assert_nothing_raised { sdiff = Diff::LCS.sdiff(@seq1, @seq2) }
  220. assert_equal(correct_sdiff, sdiff)
  221. end
  222. def test_sdiff_c
  223. sdiff = nil
  224. seq1 = %w(a b c d e)
  225. seq2 = %w(a e)
  226. correct_sdiff = [
  227. [ '=', [ 0, 'a' ], [ 0, 'a' ] ],
  228. [ '-', [ 1, 'b' ], [ 1, nil ] ],
  229. [ '-', [ 2, 'c' ], [ 1, nil ] ],
  230. [ '-', [ 3, 'd' ], [ 1, nil ] ],
  231. [ '=', [ 4, 'e' ], [ 1, 'e' ] ] ]
  232. correct_sdiff = __map_diffs(correct_sdiff)
  233. assert_nothing_raised { sdiff = Diff::LCS.sdiff(seq1, seq2) }
  234. assert_equal(correct_sdiff, sdiff)
  235. end
  236. def test_sdiff_d
  237. sdiff = nil
  238. seq1 = %w(a e)
  239. seq2 = %w(a b c d e)
  240. correct_sdiff = [
  241. [ '=', [ 0, 'a' ], [ 0, 'a' ] ],
  242. [ '+', [ 1, nil ], [ 1, 'b' ] ],
  243. [ '+', [ 1, nil ], [ 2, 'c' ] ],
  244. [ '+', [ 1, nil ], [ 3, 'd' ] ],
  245. [ '=', [ 1, 'e' ], [ 4, 'e' ] ] ]
  246. correct_sdiff = __map_diffs(correct_sdiff)
  247. assert_nothing_raised { sdiff = Diff::LCS.sdiff(seq1, seq2) }
  248. assert_equal(correct_sdiff, sdiff)
  249. end
  250. def test_sdiff_e
  251. sdiff = nil
  252. seq1 = %w(v x a e)
  253. seq2 = %w(w y a b c d e)
  254. correct_sdiff = [
  255. [ '!', [ 0, 'v' ], [ 0, 'w' ] ],
  256. [ '!', [ 1, 'x' ], [ 1, 'y' ] ],
  257. [ '=', [ 2, 'a' ], [ 2, 'a' ] ],
  258. [ '+', [ 3, nil ], [ 3, 'b' ] ],
  259. [ '+', [ 3, nil ], [ 4, 'c' ] ],
  260. [ '+', [ 3, nil ], [ 5, 'd' ] ],
  261. [ '=', [ 3, 'e' ], [ 6, 'e' ] ] ]
  262. correct_sdiff = __map_diffs(correct_sdiff)
  263. assert_nothing_raised { sdiff = Diff::LCS.sdiff(seq1, seq2) }
  264. assert_equal(correct_sdiff, sdiff)
  265. end
  266. def test_sdiff_f
  267. sdiff = nil
  268. seq1 = %w(x a e)
  269. seq2 = %w(a b c d e)
  270. correct_sdiff = [
  271. [ '-', [ 0, 'x' ], [ 0, nil ] ],
  272. [ '=', [ 1, 'a' ], [ 0, 'a' ] ],
  273. [ '+', [ 2, nil ], [ 1, 'b' ] ],
  274. [ '+', [ 2, nil ], [ 2, 'c' ] ],
  275. [ '+', [ 2, nil ], [ 3, 'd' ] ],
  276. [ '=', [ 2, 'e' ], [ 4, 'e' ] ] ]
  277. correct_sdiff = __map_diffs(correct_sdiff)
  278. assert_nothing_raised { sdiff = Diff::LCS.sdiff(seq1, seq2) }
  279. assert_equal(correct_sdiff, sdiff)
  280. end
  281. def test_sdiff_g
  282. sdiff = nil
  283. seq1 = %w(a e)
  284. seq2 = %w(x a b c d e)
  285. correct_sdiff = [
  286. [ '+', [ 0, nil ], [ 0, 'x' ] ],
  287. [ '=', [ 0, 'a' ], [ 1, 'a' ] ],
  288. [ '+', [ 1, nil ], [ 2, 'b' ] ],
  289. [ '+', [ 1, nil ], [ 3, 'c' ] ],
  290. [ '+', [ 1, nil ], [ 4, 'd' ] ],
  291. [ '=', [ 1, 'e' ], [ 5, 'e' ] ] ]
  292. correct_sdiff = __map_diffs(correct_sdiff)
  293. assert_nothing_raised { sdiff = Diff::LCS.sdiff(seq1, seq2) }
  294. assert_equal(correct_sdiff, sdiff)
  295. end
  296. def test_sdiff_h
  297. sdiff = nil
  298. seq1 = %w(a e v)
  299. seq2 = %w(x a b c d e w x)
  300. correct_sdiff = [
  301. [ '+', [ 0, nil ], [ 0, 'x' ] ],
  302. [ '=', [ 0, 'a' ], [ 1, 'a' ] ],
  303. [ '+', [ 1, nil ], [ 2, 'b' ] ],
  304. [ '+', [ 1, nil ], [ 3, 'c' ] ],
  305. [ '+', [ 1, nil ], [ 4, 'd' ] ],
  306. [ '=', [ 1, 'e' ], [ 5, 'e' ] ],
  307. [ '!', [ 2, 'v' ], [ 6, 'w' ] ],
  308. [ '+', [ 3, nil ], [ 7, 'x' ] ] ]
  309. correct_sdiff = __map_diffs(correct_sdiff)
  310. assert_nothing_raised { sdiff = Diff::LCS.sdiff(seq1, seq2) }
  311. assert_equal(correct_sdiff, sdiff)
  312. end
  313. def test_sdiff_i
  314. sdiff = nil
  315. seq1 = %w()
  316. seq2 = %w(a b c)
  317. correct_sdiff = [
  318. [ '+', [ 0, nil ], [ 0, 'a' ] ],
  319. [ '+', [ 0, nil ], [ 1, 'b' ] ],
  320. [ '+', [ 0, nil ], [ 2, 'c' ] ] ]
  321. correct_sdiff = __map_diffs(correct_sdiff)
  322. assert_nothing_raised { sdiff = Diff::LCS.sdiff(seq1, seq2) }
  323. assert_equal(correct_sdiff, sdiff)
  324. end
  325. def test_sdiff_j
  326. sdiff = nil
  327. seq1 = %w(a b c)
  328. seq2 = %w()
  329. correct_sdiff = [
  330. [ '-', [ 0, 'a' ], [ 0, nil ] ],
  331. [ '-', [ 1, 'b' ], [ 0, nil ] ],
  332. [ '-', [ 2, 'c' ], [ 0, nil ] ] ]
  333. correct_sdiff = __map_diffs(correct_sdiff)
  334. assert_nothing_raised { sdiff = Diff::LCS.sdiff(seq1, seq2) }
  335. assert_equal(correct_sdiff, sdiff)
  336. end
  337. def test_sdiff_k
  338. sdiff = nil
  339. seq1 = %w(a b c)
  340. seq2 = %w(1)
  341. correct_sdiff = [
  342. [ '!', [ 0, 'a' ], [ 0, '1' ] ],
  343. [ '-', [ 1, 'b' ], [ 1, nil ] ],
  344. [ '-', [ 2, 'c' ], [ 1, nil ] ] ]
  345. correct_sdiff = __map_diffs(correct_sdiff)
  346. assert_nothing_raised { sdiff = Diff::LCS.sdiff(seq1, seq2) }
  347. assert_equal(correct_sdiff, sdiff)
  348. end
  349. def test_sdiff_l
  350. sdiff = nil
  351. seq1 = %w(a b c)
  352. seq2 = %w(c)
  353. correct_sdiff = [
  354. [ '-', [ 0, 'a' ], [ 0, nil ] ],
  355. [ '-', [ 1, 'b' ], [ 0, nil ] ],
  356. [ '=', [ 2, 'c' ], [ 0, 'c' ] ]
  357. ]
  358. correct_sdiff = __map_diffs(correct_sdiff)
  359. assert_nothing_raised { sdiff = Diff::LCS.sdiff(seq1, seq2) }
  360. assert_equal(correct_sdiff, sdiff)
  361. end
  362. def test_sdiff_m
  363. sdiff = nil
  364. seq1 = %w(abcd efgh ijkl mnop)
  365. seq2 = []
  366. correct_sdiff = [
  367. [ '-', [ 0, 'abcd' ], [ 0, nil ] ],
  368. [ '-', [ 1, 'efgh' ], [ 0, nil ] ],
  369. [ '-', [ 2, 'ijkl' ], [ 0, nil ] ],
  370. [ '-', [ 3, 'mnop' ], [ 0, nil ] ]
  371. ]
  372. correct_sdiff = __map_diffs(correct_sdiff)
  373. assert_nothing_raised { sdiff = Diff::LCS.sdiff(seq1, seq2) }
  374. assert_equal(correct_sdiff, sdiff)
  375. end
  376. def test_sdiff_n
  377. sdiff = nil
  378. seq1 = []
  379. seq2 = %w(abcd efgh ijkl mnop)
  380. correct_sdiff = [
  381. [ '+', [ 0, nil ], [ 0, 'abcd' ] ],
  382. [ '+', [ 0, nil ], [ 1, 'efgh' ] ],
  383. [ '+', [ 0, nil ], [ 2, 'ijkl' ] ],
  384. [ '+', [ 0, nil ], [ 3, 'mnop' ] ]
  385. ]
  386. correct_sdiff = __map_diffs(correct_sdiff)
  387. assert_nothing_raised { sdiff = Diff::LCS.sdiff(seq1, seq2) }
  388. assert_equal(correct_sdiff, sdiff)
  389. end
  390. def test_balanced_a
  391. seq1 = %w(a b c)
  392. seq2 = %w(a x c)
  393. callback = nil
  394. assert_nothing_raised { callback = __balanced_callback }
  395. assert_nothing_raised { Diff::LCS.traverse_balanced(seq1, seq2, callback) }
  396. assert_equal("M00 C11 M22 ", callback.result)
  397. end
  398. def test_balanced_b
  399. seq1 = %w(a b c)
  400. seq2 = %w(a x c)
  401. callback = nil
  402. assert_nothing_raised do
  403. callback = __balanced_callback
  404. class << callback
  405. undef change
  406. end
  407. end
  408. assert_nothing_raised { Diff::LCS.traverse_balanced(seq1, seq2, callback) }
  409. assert_equal("M00 DA11 DB21 M22 ", callback.result)
  410. end
  411. def test_balanced_c
  412. seq1 = %w(a x y c)
  413. seq2 = %w(a v w c)
  414. callback = nil
  415. assert_nothing_raised { callback = __balanced_callback }
  416. assert_nothing_raised { Diff::LCS.traverse_balanced(seq1, seq2, callback) }
  417. assert_equal("M00 C11 C22 M33 ", callback.result)
  418. end
  419. def test_balanced_d
  420. seq1 = %w(x y c)
  421. seq2 = %w(v w c)
  422. callback = nil
  423. assert_nothing_raised { callback = __balanced_callback }
  424. assert_nothing_raised { Diff::LCS.traverse_balanced(seq1, seq2, callback) }
  425. assert_equal("C00 C11 M22 ", callback.result)
  426. end
  427. def test_balanced_e
  428. seq1 = %w(a x y z)
  429. seq2 = %w(b v w)
  430. callback = nil
  431. assert_nothing_raised { callback = __balanced_callback }
  432. assert_nothing_raised { Diff::LCS.traverse_balanced(seq1, seq2, callback) }
  433. assert_equal("C00 C11 C22 DA33 ", callback.result)
  434. end
  435. def test_balanced_f
  436. seq1 = %w(a z)
  437. seq2 = %w(a)
  438. callback = nil
  439. assert_nothing_raised { callback = __balanced_callback }
  440. assert_nothing_raised { Diff::LCS.traverse_balanced(seq1, seq2, callback) }
  441. assert_equal("M00 DA11 ", callback.result)
  442. end
  443. def test_balanced_g
  444. seq1 = %w(z a)
  445. seq2 = %w(a)
  446. callback = nil
  447. assert_nothing_raised { callback = __balanced_callback }
  448. assert_nothing_raised { Diff::LCS.traverse_balanced(seq1, seq2, callback) }
  449. assert_equal("DA00 M10 ", callback.result)
  450. end
  451. def test_balanced_h
  452. seq1 = %w(a b c)
  453. seq2 = %w(x y z)
  454. callback = nil
  455. assert_nothing_raised { callback = __balanced_callback }
  456. assert_nothing_raised { Diff::LCS.traverse_balanced(seq1, seq2, callback) }
  457. assert_equal("C00 C11 C22 ", callback.result)
  458. end
  459. def test_balanced_i
  460. seq1 = %w(abcd efgh ijkl mnopqrstuvwxyz)
  461. seq2 = []
  462. callback = nil
  463. assert_nothing_raised { callback = __balanced_callback }
  464. assert_nothing_raised { Diff::LCS.traverse_balanced(seq1, seq2, callback) }
  465. assert_equal("DA00 DA10 DA20 DA30 ", callback.result)
  466. end
  467. def test_balanced_j
  468. seq1 = []
  469. seq2 = %w(abcd efgh ijkl mnopqrstuvwxyz)
  470. callback = nil
  471. assert_nothing_raised { callback = __balanced_callback }
  472. assert_nothing_raised { Diff::LCS.traverse_balanced(seq1, seq2, callback) }
  473. assert_equal("DB00 DB01 DB02 DB03 ", callback.result)
  474. end
  475. end
  476. class TestPatching < Test::Unit::TestCase
  477. include Diff::LCS::Tests
  478. def test_patch_diff
  479. ps = ms1 = ms2 = ms3 = nil
  480. assert_nothing_raised do
  481. ps = Diff::LCS.diff(@seq1, @seq2)
  482. ms1 = Diff::LCS.patch(@seq1, ps)
  483. ms2 = Diff::LCS.patch(@seq2, ps, :unpatch)
  484. ms3 = Diff::LCS.patch(@seq2, ps)
  485. end
  486. assert_equal(@seq2, ms1)
  487. assert_equal(@seq1, ms2)
  488. assert_equal(@seq1, ms3)
  489. assert_nothing_raised do
  490. ps = Diff::LCS.diff(@seq1, @seq2, Diff::LCS::ContextDiffCallbacks)
  491. ms1 = Diff::LCS.patch(@seq1, ps)
  492. ms2 = Diff::LCS.patch(@seq2, ps, :unpatch)
  493. ms2 = Diff::LCS.patch(@seq2, ps)
  494. end
  495. assert_equal(@seq2, ms1)
  496. assert_equal(@seq1, ms2)
  497. assert_equal(@seq1, ms3)
  498. assert_nothing_raised do
  499. ps = Diff::LCS.diff(@seq1, @seq2, Diff::LCS::SDiffCallbacks)
  500. ms1 = Diff::LCS.patch(@seq1, ps)
  501. ms2 = Diff::LCS.patch(@seq2, ps, :unpatch)
  502. ms3 = Diff::LCS.patch(@seq2, ps)
  503. end
  504. assert_equal(@seq2, ms1)
  505. assert_equal(@seq1, ms2)
  506. assert_equal(@seq1, ms3)
  507. end
  508. # Tests patch bug #891:
  509. # http://rubyforge.org/tracker/?func=detail&atid=407&aid=891&group_id=84
  510. def test_patch_bug891
  511. s1 = s2 = s3 = s4 = s5 = ps = nil
  512. assert_nothing_raised do
  513. s1 = %w{a b c d e f g h i j k }
  514. s2 = %w{a b c d D e f g h i j k }
  515. ps = Diff::LCS::diff(s1, s2)
  516. s3 = Diff::LCS.patch(s1, ps, :patch)
  517. ps = Diff::LCS::diff(s1, s2, Diff::LCS::ContextDiffCallbacks)
  518. s4 = Diff::LCS.patch(s1, ps, :patch)
  519. ps = Diff::LCS::diff(s1, s2, Diff::LCS::SDiffCallbacks)
  520. s5 = Diff::LCS.patch(s1, ps, :patch)
  521. end
  522. assert_equal(s2, s3)
  523. assert_equal(s2, s4)
  524. assert_equal(s2, s5)
  525. assert_nothing_raised do
  526. ps = Diff::LCS::sdiff(s1, s2)
  527. s3 = Diff::LCS.patch(s1, ps, :patch)
  528. ps = Diff::LCS::diff(s1, s2, Diff::LCS::ContextDiffCallbacks)
  529. s4 = Diff::LCS.patch(s1, ps, :patch)
  530. ps = Diff::LCS::diff(s1, s2, Diff::LCS::DiffCallbacks)
  531. s5 = Diff::LCS.patch(s1, ps, :patch)
  532. end
  533. assert_equal(s2, s3)
  534. assert_equal(s2, s4)
  535. assert_equal(s2, s5)
  536. end
  537. def test_patch_sdiff
  538. ps = ms1 = ms2 = ms3 = nil
  539. assert_nothing_raised do
  540. ps = Diff::LCS.sdiff(@seq1, @seq2)
  541. ms1 = Diff::LCS.patch(@seq1, ps)
  542. ms2 = Diff::LCS.patch(@seq2, ps, :unpatch)
  543. ms3 = Diff::LCS.patch(@seq2, ps)
  544. end
  545. assert_equal(@seq2, ms1)
  546. assert_equal(@seq1, ms2)
  547. assert_equal(@seq1, ms3)
  548. assert_nothing_raised do
  549. ps = Diff::LCS.sdiff(@seq1, @seq2, Diff::LCS::ContextDiffCallbacks)
  550. ms1 = Diff::LCS.patch(@seq1, ps)
  551. ms2 = Diff::LCS.patch(@seq2, ps, :unpatch)
  552. ms3 = Diff::LCS.patch(@seq2, ps)
  553. end
  554. assert_equal(@seq2, ms1)
  555. assert_equal(@seq1, ms2)
  556. assert_equal(@seq1, ms3)
  557. assert_nothing_raised do
  558. ps = Diff::LCS.sdiff(@seq1, @seq2, Diff::LCS::DiffCallbacks)
  559. ms1 = Diff::LCS.patch(@seq1, ps)
  560. ms2 = Diff::LCS.patch(@seq2, ps, :unpatch)
  561. ms3 = Diff::LCS.patch(@seq2, ps)
  562. end
  563. assert_equal(@seq2, ms1)
  564. assert_equal(@seq1, ms2)
  565. assert_equal(@seq1, ms3)
  566. end
  567. end