/test/unit/bio/test_tree.rb

https://github.com/domthu/bioruby · Ruby · 852 lines · 723 code · 104 blank · 25 comment · 2 complexity · 352f830ddce00cf924cbb9ca55384589 MD5 · raw file

  1. #
  2. # = test/bio/test_tree.rb - unit test for Bio::Tree
  3. #
  4. # Copyright:: Copyright (C) 2006, 2010
  5. # Naohisa Goto <ng@bioruby.org>
  6. # Copyright (C) 2010 Kazuhiro Hayashi <k.hayashi.info@gmail.com>
  7. # License:: The Ruby License
  8. #
  9. # $Id:$
  10. #
  11. # loading helper routine for testing bioruby
  12. require 'pathname'
  13. load Pathname.new(File.join(File.dirname(__FILE__), ['..'] * 2,
  14. 'bioruby_test_helper.rb')).cleanpath.to_s
  15. # libraries needed for the tests
  16. require 'test/unit'
  17. require 'bio/tree'
  18. module Bio
  19. class TestTreeEdge < Test::Unit::TestCase
  20. def setup
  21. @obj = Bio::Tree::Edge.new(123.45)
  22. end
  23. def test_initialize
  24. assert_nothing_raised { Bio::Tree::Edge.new }
  25. assert_equal(1.23, Bio::Tree::Edge.new(1.23).distance)
  26. assert_equal(12.3, Bio::Tree::Edge.new('12.3').distance)
  27. end
  28. def test_distance
  29. assert_equal(123.45, @obj.distance)
  30. end
  31. def test_distance_string
  32. assert_equal("123.45", @obj.distance_string)
  33. end
  34. def test_distance=()
  35. @obj.distance = 678.9
  36. assert_equal(678.9, @obj.distance)
  37. assert_equal("678.9", @obj.distance_string)
  38. @obj.distance = nil
  39. assert_equal(nil, @obj.distance)
  40. assert_equal(nil, @obj.distance_string)
  41. end
  42. def test_distance_string=()
  43. @obj.distance_string = "678.9"
  44. assert_equal(678.9, @obj.distance)
  45. assert_equal("678.9", @obj.distance_string)
  46. @obj.distance_string = nil
  47. assert_equal(nil, @obj.distance)
  48. assert_equal(nil, @obj.distance_string)
  49. end
  50. def test_inspect
  51. assert_equal("<Edge distance=123.45>", @obj.inspect)
  52. end
  53. def test_to_s
  54. assert_equal("123.45", @obj.to_s)
  55. end
  56. end #class TestTreeEdge
  57. class TestTreeNode < Test::Unit::TestCase
  58. def setup
  59. @obj = Bio::Tree::Node.new
  60. end
  61. def test_initialize
  62. assert_nothing_raised { Bio::Tree::Node.new }
  63. a = nil
  64. assert_nothing_raised { a = Bio::Tree::Node.new('mouse') }
  65. assert_equal('mouse', a.name)
  66. end
  67. def test_name
  68. assert_equal(nil, @obj.name)
  69. @obj.name = 'human'
  70. assert_equal('human', @obj.name)
  71. end
  72. def test_bootstrap
  73. assert_equal(nil, @obj.bootstrap)
  74. end
  75. def test_bootstrap_string
  76. assert_equal(nil, @obj.bootstrap_string)
  77. end
  78. def test_bootstrap=()
  79. @obj.bootstrap = 98
  80. assert_equal(98, @obj.bootstrap)
  81. assert_equal('98', @obj.bootstrap_string)
  82. @obj.bootstrap = nil
  83. assert_equal(nil, @obj.bootstrap)
  84. assert_equal(nil, @obj.bootstrap_string)
  85. end
  86. def test_bootstrap_string=()
  87. @obj.bootstrap_string = '98'
  88. assert_equal(98, @obj.bootstrap)
  89. assert_equal('98', @obj.bootstrap_string)
  90. @obj.bootstrap_string = '99.98'
  91. assert_equal(99.98, @obj.bootstrap)
  92. assert_equal('99.98', @obj.bootstrap_string)
  93. @obj.bootstrap = nil
  94. assert_equal(nil, @obj.bootstrap)
  95. assert_equal(nil, @obj.bootstrap_string)
  96. end
  97. def test_inspect
  98. @obj.name = 'human'
  99. assert_equal('(Node:"human")', @obj.inspect)
  100. @obj.bootstrap = 99.98
  101. assert_equal('(Node:"human" bootstrap=99.98)', @obj.inspect)
  102. end
  103. def test_to_s
  104. @obj.name = 'human'
  105. assert_equal('human', @obj.to_s)
  106. end
  107. end #class TestTreeNode
  108. class TestTree < Test::Unit::TestCase
  109. def setup
  110. @tree = Bio::Tree.new
  111. end
  112. def test_get_edge_distance
  113. edge = Bio::Tree::Edge.new
  114. assert_equal(nil, @tree.get_edge_distance(edge))
  115. edge = Bio::Tree::Edge.new(12.34)
  116. assert_equal(12.34, @tree.get_edge_distance(edge))
  117. assert_equal(12.34, @tree.get_edge_distance(12.34))
  118. end
  119. def test_get_edge_distance_string
  120. edge = Bio::Tree::Edge.new
  121. assert_equal(nil, @tree.get_edge_distance_string(edge))
  122. edge = Bio::Tree::Edge.new(12.34)
  123. assert_equal("12.34", @tree.get_edge_distance_string(edge))
  124. assert_equal("12.34", @tree.get_edge_distance_string(12.34))
  125. end
  126. def test_get_node_name
  127. node = Bio::Tree::Node.new
  128. assert_equal(nil, @tree.get_node_name(node))
  129. node.name = 'human'
  130. assert_equal('human', @tree.get_node_name(node))
  131. end
  132. def test_initialize
  133. assert_nothing_raised { Bio::Tree.new }
  134. assert_nothing_raised { Bio::Tree.new(@tree) }
  135. end
  136. def test_root
  137. assert_equal(nil, @tree.root)
  138. end
  139. def test_root=()
  140. assert_equal(nil, @tree.root)
  141. node = Bio::Tree::Node.new
  142. @tree.root = node
  143. assert_equal(node, @tree.root)
  144. end
  145. def test_options
  146. assert_equal({}, @tree.options)
  147. @tree.options[:bootstrap_style] = :traditional
  148. assert_equal(:traditional, @tree.options[:bootstrap_style])
  149. end
  150. end #class TestTree
  151. class TestTree2 < Test::Unit::TestCase
  152. def setup
  153. # Note that below data is NOT real. The distances are random.
  154. @tree = Bio::Tree.new
  155. @mouse = Bio::Tree::Node.new('mouse')
  156. @rat = Bio::Tree::Node.new('rat')
  157. @rodents = Bio::Tree::Node.new('rodents')
  158. @human = Bio::Tree::Node.new('human')
  159. @chimpanzee = Bio::Tree::Node.new('chimpanzee')
  160. @primates = Bio::Tree::Node.new('primates')
  161. @mammals = Bio::Tree::Node.new('mammals')
  162. @nodes =
  163. [ @mouse, @rat, @rodents, @human, @chimpanzee, @primates, @mammals ]
  164. @edge_rodents_mouse = Bio::Tree::Edge.new(0.0968)
  165. @edge_rodents_rat = Bio::Tree::Edge.new(0.1125)
  166. @edge_mammals_rodents = Bio::Tree::Edge.new(0.2560)
  167. @edge_primates_human = Bio::Tree::Edge.new(0.0386)
  168. @edge_primates_chimpanzee = Bio::Tree::Edge.new(0.0503)
  169. @edge_mammals_primates = Bio::Tree::Edge.new(0.2235)
  170. @edges = [
  171. [ @rodents, @mouse, @edge_rodents_mouse ],
  172. [ @rodents, @rat, @edge_rodents_rat ],
  173. [ @mammals, @rodents, @edge_mammals_rodents ],
  174. [ @primates, @human, @edge_primates_human ],
  175. [ @primates, @chimpanzee, @edge_primates_chimpanzee ],
  176. [ @mammals, @primates, @edge_mammals_primates ]
  177. ]
  178. @edges.each do |a|
  179. @tree.add_edge(*a)
  180. end
  181. @by_id = Proc.new { |a, b| a.__id__ <=> b.__id__ }
  182. end
  183. def test_clear
  184. assert_nothing_raised { @tree.clear }
  185. assert_equal(0, @tree.number_of_nodes)
  186. assert_equal(0, @tree.number_of_edges)
  187. end
  188. def test_nodes
  189. nodes = @nodes.sort(&@by_id)
  190. assert_equal(nodes, @tree.nodes.sort(&@by_id))
  191. end
  192. def test_number_of_nodes
  193. assert_equal(7, @tree.number_of_nodes)
  194. end
  195. def test_each_node
  196. @tree.each_node do |x|
  197. assert_not_nil(@nodes.delete(x))
  198. end
  199. assert_equal(true, @nodes.empty?)
  200. end
  201. def test_each_edge
  202. @tree.each_edge do |source, target, edge|
  203. assert_not_nil(@edges.delete([ source, target, edge ]))
  204. end
  205. assert_equal(true, @edges.empty?)
  206. end
  207. def test_edges
  208. edges = @edges.sort { |a, b| a[-1].distance <=> b[-1].distance }
  209. assert_equal(edges,
  210. @tree.edges.sort {
  211. |a, b| a[-1].distance <=> b[-1].distance })
  212. end
  213. def test_number_of_edges
  214. assert_equal(@edges.size, @tree.number_of_edges)
  215. end
  216. def test_adjacent_nodes
  217. assert_equal([ @rodents ], @tree.adjacent_nodes(@mouse))
  218. assert_equal([ @rodents ], @tree.adjacent_nodes(@rat))
  219. assert_equal([ @primates ], @tree.adjacent_nodes(@human))
  220. assert_equal([ @primates ], @tree.adjacent_nodes(@chimpanzee))
  221. assert_equal([ @mouse, @rat, @mammals ].sort(&@by_id),
  222. @tree.adjacent_nodes(@rodents).sort(&@by_id))
  223. assert_equal([ @human, @chimpanzee, @mammals ].sort(&@by_id),
  224. @tree.adjacent_nodes(@primates).sort(&@by_id))
  225. assert_equal([ @rodents, @primates ].sort(&@by_id),
  226. @tree.adjacent_nodes(@mammals).sort(&@by_id))
  227. end
  228. def test_adjacent_nodes_nonexistent
  229. # test for not existed nodes
  230. assert_equal([], @tree.adjacent_nodes(Bio::Tree::Node.new))
  231. end
  232. def test_out_edges
  233. assert_equal([[ @mouse, @rodents, @edge_rodents_mouse ]],
  234. @tree.out_edges(@mouse))
  235. assert_equal([[ @rat, @rodents, @edge_rodents_rat ]],
  236. @tree.out_edges(@rat))
  237. assert_equal([[ @human, @primates, @edge_primates_human ]],
  238. @tree.out_edges(@human))
  239. assert_equal([[ @chimpanzee, @primates, @edge_primates_chimpanzee ]],
  240. @tree.out_edges(@chimpanzee))
  241. end
  242. def test_out_edges_rodents
  243. adjacents = [ @mouse, @rat, @mammals ]
  244. edges = [ @edge_rodents_mouse, @edge_rodents_rat, @edge_mammals_rodents ]
  245. @tree.out_edges(@rodents).each do |a|
  246. assert_equal(@rodents, a[0])
  247. assert_not_nil(i = adjacents.index(a[1]))
  248. assert_equal(edges[i], a[2])
  249. adjacents.delete_at(i)
  250. edges.delete_at(i)
  251. end
  252. assert_equal(true, adjacents.empty?)
  253. assert_equal(true, edges.empty?)
  254. end
  255. def test_out_edges_primates
  256. adjacents = [ @human, @chimpanzee, @mammals ]
  257. edges = [ @edge_primates_human, @edge_primates_chimpanzee,
  258. @edge_mammals_primates ]
  259. @tree.out_edges(@primates).each do |a|
  260. assert_equal(@primates, a[0])
  261. assert_not_nil(i = adjacents.index(a[1]))
  262. assert_equal(edges[i], a[2])
  263. adjacents.delete_at(i)
  264. edges.delete_at(i)
  265. end
  266. assert_equal(true, adjacents.empty?)
  267. assert_equal(true, edges.empty?)
  268. end
  269. def test_out_edges_mammals
  270. adjacents = [ @rodents, @primates ]
  271. edges = [ @edge_mammals_rodents, @edge_mammals_primates ]
  272. @tree.out_edges(@mammals).each do |a|
  273. assert_equal(@mammals, a[0])
  274. assert_not_nil(i = adjacents.index(a[1]))
  275. assert_equal(edges[i], a[2])
  276. adjacents.delete_at(i)
  277. edges.delete_at(i)
  278. end
  279. assert_equal(true, adjacents.empty?)
  280. assert_equal(true, edges.empty?)
  281. end
  282. def test_out_edges_nonexistent
  283. # test for not existed nodes
  284. assert_equal([], @tree.out_edges(Bio::Tree::Node.new))
  285. end
  286. def test_each_out_edge
  287. flag = nil
  288. r = @tree.each_out_edge(@mouse) do |src, tgt, edge|
  289. assert_equal(@mouse, src)
  290. assert_equal(@rodents, tgt)
  291. assert_equal(@edge_rodents_mouse, edge)
  292. flag = true
  293. end
  294. assert_equal(@tree, r)
  295. assert_equal(true, flag)
  296. end
  297. def test_each_out_edge_rat
  298. flag = nil
  299. r = @tree.each_out_edge(@rat) do |src, tgt, edge|
  300. assert_equal(@rat, src)
  301. assert_equal(@rodents, tgt)
  302. assert_equal(@edge_rodents_rat, edge)
  303. flag = true
  304. end
  305. assert_equal(@tree, r)
  306. assert_equal(true, flag)
  307. end
  308. def test_each_out_edge_human
  309. flag = nil
  310. r = @tree.each_out_edge(@human) do |src, tgt, edge|
  311. assert_equal(@human, src)
  312. assert_equal(@primates, tgt)
  313. assert_equal(@edge_primates_human, edge)
  314. flag = true
  315. end
  316. assert_equal(@tree, r)
  317. assert_equal(true, flag)
  318. end
  319. def test_each_out_edge_chimpanzee
  320. flag = nil
  321. r = @tree.each_out_edge(@chimpanzee) do |src, tgt, edge|
  322. assert_equal(@chimpanzee, src)
  323. assert_equal(@primates, tgt)
  324. assert_equal(@edge_primates_chimpanzee, edge)
  325. flag = true
  326. end
  327. assert_equal(@tree, r)
  328. assert_equal(true, flag)
  329. end
  330. def test_each_out_edge_rodents
  331. adjacents = [ @mouse, @rat, @mammals ]
  332. edges = [ @edge_rodents_mouse, @edge_rodents_rat, @edge_mammals_rodents ]
  333. @tree.each_out_edge(@rodents) do |src, tgt, edge|
  334. assert_equal(@rodents, src)
  335. assert_not_nil(i = adjacents.index(tgt))
  336. assert_equal(edges[i], edge)
  337. adjacents.delete_at(i)
  338. edges.delete_at(i)
  339. end
  340. assert_equal(true, adjacents.empty?)
  341. assert_equal(true, edges.empty?)
  342. end
  343. def test_each_out_edge_primates
  344. adjacents = [ @human, @chimpanzee, @mammals ]
  345. edges = [ @edge_primates_human, @edge_primates_chimpanzee,
  346. @edge_mammals_primates ]
  347. @tree.each_out_edge(@primates) do |src, tgt, edge|
  348. assert_equal(@primates, src)
  349. assert_not_nil(i = adjacents.index(tgt))
  350. assert_equal(edges[i], edge)
  351. adjacents.delete_at(i)
  352. edges.delete_at(i)
  353. end
  354. assert_equal(true, adjacents.empty?)
  355. assert_equal(true, edges.empty?)
  356. end
  357. def test_each_out_edge_mammals
  358. adjacents = [ @rodents, @primates ]
  359. edges = [ @edge_mammals_rodents, @edge_mammals_primates ]
  360. @tree.each_out_edge(@mammals) do |src, tgt, edge|
  361. assert_equal(@mammals, src)
  362. assert_not_nil(i = adjacents.index(tgt))
  363. assert_equal(edges[i], edge)
  364. adjacents.delete_at(i)
  365. edges.delete_at(i)
  366. end
  367. assert_equal(true, adjacents.empty?)
  368. assert_equal(true, edges.empty?)
  369. end
  370. def test_each_out_edge_nonexistent
  371. # test for not existed nodes
  372. flag = nil
  373. node = Bio::Tree::Node.new
  374. r = @tree.each_out_edge(node) do |src, tgt, edge|
  375. flag = true
  376. end
  377. assert_equal(@tree, r)
  378. assert_equal(nil, flag)
  379. end
  380. def test_out_degree
  381. assert_equal(1, @tree.out_degree(@mouse))
  382. assert_equal(1, @tree.out_degree(@rat))
  383. assert_equal(3, @tree.out_degree(@rodents))
  384. assert_equal(1, @tree.out_degree(@human))
  385. assert_equal(1, @tree.out_degree(@chimpanzee))
  386. assert_equal(3, @tree.out_degree(@primates))
  387. assert_equal(2, @tree.out_degree(@mammals))
  388. end
  389. def test_out_degree_nonexistent
  390. assert_equal(0, @tree.out_degree(Bio::Tree::Node.new))
  391. end
  392. def test_get_edge
  393. assert_not_nil(@tree.get_edge(@rodents, @mouse))
  394. assert_not_nil(@tree.get_edge(@mouse, @rodents))
  395. assert_equal(@edge_rodents_mouse, @tree.get_edge(@rodents, @mouse))
  396. assert_equal(@edge_rodents_mouse, @tree.get_edge(@mouse, @rodents))
  397. assert_not_nil(@tree.get_edge(@rodents, @rat))
  398. assert_not_nil(@tree.get_edge(@rat, @rodents))
  399. assert_equal(@edge_rodents_rat, @tree.get_edge(@rodents, @rat))
  400. assert_equal(@edge_rodents_rat, @tree.get_edge(@rat, @rodents))
  401. assert_not_nil(@tree.get_edge(@mammals, @rodents))
  402. assert_not_nil(@tree.get_edge(@rodents, @mammals))
  403. assert_equal(@edge_mammals_rodents, @tree.get_edge(@mammals, @rodents))
  404. assert_equal(@edge_mammals_rodents, @tree.get_edge(@rodents, @mammals))
  405. assert_not_nil(@tree.get_edge(@primates, @human))
  406. assert_not_nil(@tree.get_edge(@human, @primates))
  407. assert_equal(@edge_primates_human, @tree.get_edge(@primates, @human))
  408. assert_equal(@edge_primates_human, @tree.get_edge(@human, @primates))
  409. assert_not_nil(@tree.get_edge(@primates, @chimpanzee))
  410. assert_not_nil(@tree.get_edge(@chimpanzee, @primates))
  411. assert_equal(@edge_primates_chimpanzee, @tree.get_edge(@primates, @chimpanzee))
  412. assert_equal(@edge_primates_chimpanzee, @tree.get_edge(@chimpanzee, @primates))
  413. assert_not_nil(@tree.get_edge(@mammals, @primates))
  414. assert_not_nil(@tree.get_edge(@primates, @mammals))
  415. assert_equal(@edge_mammals_primates, @tree.get_edge(@mammals, @primates))
  416. assert_equal(@edge_mammals_primates, @tree.get_edge(@primates, @mammals))
  417. end
  418. def test_get_edge_indirect
  419. assert_nil(@tree.get_edge(@mouse, @rat))
  420. assert_nil(@tree.get_edge(@human, @chimpanzee))
  421. end
  422. def test_get_edge_nonexistent
  423. assert_nil(@tree.get_edge(@mouse, Bio::Tree::Node.new))
  424. end
  425. def test_get_node_by_name
  426. assert_not_nil(@tree.get_node_by_name('mouse'))
  427. assert_not_nil(@tree.get_node_by_name('rat'))
  428. assert_not_nil(@tree.get_node_by_name('human'))
  429. assert_not_nil(@tree.get_node_by_name('chimpanzee'))
  430. assert_equal(@mouse, @tree.get_node_by_name('mouse'))
  431. assert_equal(@rat, @tree.get_node_by_name('rat'))
  432. assert_equal(@human, @tree.get_node_by_name('human'))
  433. assert_equal(@chimpanzee, @tree.get_node_by_name('chimpanzee'))
  434. end
  435. def test_get_node_by_name_noexistent
  436. assert_nil(@tree.get_node_by_name('frog'))
  437. end
  438. def test_add_edge
  439. amphibian = Bio::Tree::Node.new('amphibian')
  440. edge = Bio::Tree::Edge.new(0.3123)
  441. assert_equal(edge, @tree.add_edge(@mammals, amphibian, edge))
  442. frog = Bio::Tree::Node.new('frog')
  443. newt = Bio::Tree::Node.new('newt')
  444. assert_instance_of(Bio::Tree::Edge, @tree.add_edge(frog, newt))
  445. end
  446. def test_add_node
  447. frog = Bio::Tree::Node.new('frog')
  448. # the node does not exist
  449. assert_nil(@tree.get_node_by_name('frog'))
  450. assert_equal(false, @tree.include?(frog))
  451. # add node
  452. assert_equal(@tree, @tree.add_node(frog))
  453. # the node exists
  454. assert_equal(frog, @tree.get_node_by_name('frog'))
  455. assert_equal(true, @tree.include?(frog))
  456. end
  457. def test_include?
  458. assert_equal(true, @tree.include?(@mouse))
  459. assert_equal(true, @tree.include?(@rat))
  460. assert_equal(true, @tree.include?(@rodents))
  461. assert_equal(true, @tree.include?(@human))
  462. assert_equal(true, @tree.include?(@chimpanzee))
  463. assert_equal(true, @tree.include?(@primates))
  464. assert_equal(true, @tree.include?(@mammals))
  465. end
  466. def test_include_nonexistent
  467. assert_equal(false, @tree.include?(Bio::Tree::Node.new))
  468. end
  469. def test_clear_node
  470. assert_equal(2, @tree.out_degree(@mammals))
  471. # clear node
  472. assert_equal(@tree, @tree.clear_node(@mammals))
  473. # checks
  474. assert_equal(true, @tree.include?(@mammals))
  475. assert_equal(0, @tree.out_degree(@mammals))
  476. assert_equal(2, @tree.out_degree(@rodents))
  477. assert_equal(2, @tree.out_degree(@primates))
  478. end
  479. def test_clear_node_nonexistent
  480. assert_raise(IndexError) { @tree.clear_node(Bio::Tree::Node.new) }
  481. end
  482. def test_remove_node
  483. assert_equal(2, @tree.out_degree(@mammals))
  484. # remove node
  485. assert_equal(@tree, @tree.remove_node(@mammals))
  486. # checks
  487. assert_equal(false, @tree.include?(@mammals))
  488. assert_equal(0, @tree.out_degree(@mammals))
  489. assert_equal(2, @tree.out_degree(@rodents))
  490. assert_equal(2, @tree.out_degree(@primates))
  491. end
  492. def test_remove_node_nonexistent
  493. assert_raise(IndexError) { @tree.remove_node(Bio::Tree::Node.new) }
  494. end
  495. def test_remove_node_if
  496. assert_equal(@tree, @tree.remove_node_if { |node| node == @mouse })
  497. assert_equal(false, @tree.include?(@mouse))
  498. end
  499. def test_remove_node_if_false
  500. ary = []
  501. assert_equal(@tree, @tree.remove_node_if { |node| ary << node; false })
  502. nodes = @nodes.sort(&@by_id)
  503. assert_equal(nodes, ary.sort(&@by_id))
  504. assert_equal(nodes, @tree.nodes.sort(&@by_id))
  505. end
  506. def test_remove_edge
  507. assert_not_nil(@tree.get_edge(@mouse, @rodents))
  508. assert_equal(@tree, @tree.remove_edge(@mouse, @rodents))
  509. assert_nil(@tree.get_edge(@mouse, @rodents))
  510. end
  511. def test_remove_edge_nonexistent
  512. assert_raise(IndexError) { @tree.remove_edge(@mouse, @rat) }
  513. end
  514. def test_remove_edge_if
  515. ret = nil
  516. assert_nothing_raised {
  517. ret = @tree.remove_edge_if do |source, target, edge|
  518. [ source.name, target.name ].sort == [ 'mouse', 'rodents' ]
  519. end
  520. }
  521. assert_equal(@tree, ret)
  522. assert_nil(@tree.get_edge(@mouse, @rodents))
  523. end
  524. def test_remove_edge_if_nothing_removed
  525. ret = nil
  526. by_id_2 = Proc.new { |x,y| x[2].__id__ <=> y[2].__id__ }
  527. orig_edges = @tree.edges.sort(&by_id_2)
  528. assert_nothing_raised {
  529. ret = @tree.remove_node_if { |edge| false }
  530. }
  531. assert_equal(@tree, ret)
  532. assert_equal(orig_edges, @tree.edges.sort(&by_id_2))
  533. end
  534. def test_collect_node!
  535. ret = nil
  536. newmouse = Bio::Tree::Node.new('MOUSE')
  537. newhuman = Bio::Tree::Node.new('HUMAN')
  538. assert_nothing_raised {
  539. ret = @tree.collect_node! do |node|
  540. case node.name
  541. when 'mouse'
  542. newmouse
  543. when 'human'
  544. newhuman
  545. else
  546. node
  547. end
  548. end
  549. }
  550. assert_equal(@tree, ret)
  551. assert(@tree.include?(newmouse))
  552. assert(!@tree.include?(@mouse))
  553. assert(@tree.include?(newhuman))
  554. assert(!@tree.include?(@human))
  555. nodes = [ newmouse, @rat, @rodents, newhuman,
  556. @chimpanzee, @primates, @mammals ].sort(&@by_id)
  557. assert_equal(nodes, @tree.nodes.sort(&@by_id))
  558. end
  559. def test_collect_edge!
  560. ret = nil
  561. newedge_rodents_mouse = Bio::Tree::Edge.new(100.0)
  562. newedge_primates_human = Bio::Tree::Edge.new(200.0)
  563. assert_nothing_raised {
  564. ret = @tree.collect_edge! do |source, target, edge|
  565. case [ source.name, target.name ].sort
  566. when [ 'mouse', 'rodents' ]
  567. newedge_rodents_mouse
  568. when [ 'human', 'primates' ]
  569. newedge_primates_human
  570. else
  571. edge
  572. end
  573. end
  574. }
  575. assert_equal(@tree, ret)
  576. assert_equal(newedge_rodents_mouse, @tree.get_edge(@mouse, @rodents))
  577. assert_equal(newedge_primates_human, @tree.get_edge(@human, @primates))
  578. expected = [ newedge_rodents_mouse,
  579. @edge_rodents_rat,
  580. @edge_mammals_rodents,
  581. newedge_primates_human,
  582. @edge_primates_chimpanzee,
  583. @edge_mammals_primates ].sort(&@by_id)
  584. assert_equal(expected, @tree.edges.collect { |x| x[-1] }.sort(&@by_id))
  585. end
  586. def test_get_edge_merged
  587. edge1 = Bio::Tree::Edge.new(12.34)
  588. edge2 = Bio::Tree::Edge.new(56.78)
  589. merged_edge = @tree.get_edge_merged(edge1, edge2)
  590. # struggle to avoid possible float problem
  591. expected = 12.34 + 56.78
  592. assert_equal(expected, merged_edge.distance)
  593. end
  594. def test_get_node_bootstrap
  595. node = Bio::Tree::Node.new("test")
  596. node.bootstrap = 1
  597. assert_equal(1, @tree.get_node_bootstrap(node))
  598. end
  599. def test_get_node_bootstrap_string=
  600. node = Bio::Tree::Node.new("test")
  601. node.bootstrap_string = "0.75"
  602. assert_equal(0.75, @tree.get_node_bootstrap(node))
  603. end
  604. def test_subtree
  605. newtree = nil
  606. assert_nothing_raised {
  607. newtree = @tree.subtree([ @mouse, @rodents, @human ])
  608. }
  609. assert_equal(3, newtree.number_of_nodes)
  610. assert_equal(1, newtree.number_of_edges)
  611. nodes = [ @mouse, @rodents, @human ].sort(&@by_id)
  612. assert_equal(nodes, newtree.nodes.sort(&@by_id))
  613. edges = [ @edge_rodents_mouse ].sort(&@by_id)
  614. assert_equal(edges, newtree.edges.collect { |x| x[-1] }.sort(&@by_id))
  615. end
  616. def test_subtree_with_all_paths
  617. newtree = nil
  618. assert_nothing_raised {
  619. newtree = @tree.subtree_with_all_paths([ @mouse, @rodents, @human ])
  620. }
  621. assert_equal(5, newtree.number_of_nodes)
  622. assert_equal(4, newtree.number_of_edges)
  623. nodes = [ @mouse, @rodents, @mammals, @primates, @human ].sort(&@by_id)
  624. assert_equal(nodes, newtree.nodes.sort(&@by_id))
  625. edges = [ @edge_rodents_mouse,
  626. @edge_mammals_rodents,
  627. @edge_mammals_primates,
  628. @edge_primates_human ].sort(&@by_id)
  629. assert_equal(edges, newtree.edges.collect { |x| x[-1] }.sort(&@by_id))
  630. end
  631. def test_concat
  632. tree2 = Bio::Tree.new
  633. node1 = Bio::Tree::Node.new('node1')
  634. node2 = Bio::Tree::Node.new('node2')
  635. edge0 = Bio::Tree::Edge.new(0.1)
  636. tree2.add_edge(node1, node2, edge0)
  637. ret = nil
  638. assert_nothing_raised {
  639. ret = @tree.concat(tree2)
  640. }
  641. assert_equal(@tree, ret)
  642. assert_equal(9, @tree.number_of_nodes)
  643. assert_equal(7, @tree.number_of_edges)
  644. nodes = (@nodes + [ node1, node2 ]).sort(&@by_id)
  645. assert_equal(nodes, @tree.nodes.sort(&@by_id))
  646. edges = (@edges.collect { |x| x[-1] } + [ edge0 ]).sort(&@by_id)
  647. assert_equal(edges, @tree.edges.collect { |x| x[-1] }.sort(&@by_id))
  648. end
  649. def test_path
  650. expected = [ @mouse, @rodents, @mammals, @primates, @human ]
  651. assert_equal(expected, @tree.path(@mouse, @human))
  652. end
  653. #Passed cache_* methods because of internal methods
  654. def test_parent
  655. assert_equal(@rodents, @tree.parent(@mouse, @mammals))
  656. end
  657. def test_children
  658. expected = [ @primates, @rodents ].sort(&@by_id)
  659. assert_equal(expected,
  660. @tree.children(@mammals, @mammals).sort(&@by_id))
  661. end
  662. def test_descendents
  663. expected = [ @primates, @rodents, @human, @chimpanzee,
  664. @mouse, @rat ].sort(&@by_id)
  665. assert_equal(expected,
  666. @tree.descendents(@mammals, @mammals).sort(&@by_id))
  667. end
  668. def test_leaves_noargs
  669. expected = [ @chimpanzee, @human, @mouse, @rat ].sort(&@by_id)
  670. @tree.root = @mammals
  671. assert_equal(expected, @tree.leaves.sort(&@by_id))
  672. end
  673. def test_leaves
  674. expected = [ @chimpanzee, @human, @mouse, @rat ].sort(&@by_id)
  675. assert_equal(expected, @tree.leaves(@mammals, @mammals).sort(&@by_id))
  676. end
  677. def test_ancestors
  678. expected = [ @rodents, @mammals ].sort(&@by_id)
  679. assert_equal(expected, @tree.ancestors(@mouse, @mammals).sort(&@by_id))
  680. end
  681. def test_lowest_common_ancestor
  682. assert_equal(@rodents,
  683. @tree.lowest_common_ancestor(@mouse, @rat, @mammals))
  684. end
  685. def test_total_distance
  686. assert_equal("0.7777", sprintf("%.15g", @tree.total_distance))
  687. end
  688. def test_distance_matrix
  689. mat = @tree.distance_matrix([ @mouse, @rat, @human, @chimpanzee ])
  690. assert_instance_of(Matrix, mat)
  691. assert_equal([ "0", "0.2093", "0.6149", "0.6266" ],
  692. mat.row(0).map { |x| sprintf("%.15g", x) }.to_a)
  693. assert_equal([ "0.2093", "0", "0.6306", "0.6423" ],
  694. mat.row(1).map { |x| sprintf("%.15g", x) }.to_a)
  695. assert_equal([ "0.6149", "0.6306", "0", "0.0889" ],
  696. mat.row(2).map { |x| sprintf("%.15g", x) }.to_a)
  697. assert_equal([ "0.6266", "0.6423", "0.0889", "0" ],
  698. mat.row(3).map { |x| sprintf("%.15g", x) }.to_a)
  699. end
  700. def test_adjacency_matrix
  701. a =
  702. [ [ 0, nil, @edge_rodents_mouse, nil, nil, nil, nil ],
  703. [ nil, 0, @edge_rodents_rat, nil, nil, nil, nil ],
  704. [ @edge_rodents_mouse, @edge_rodents_rat, 0, nil,
  705. nil, nil, @edge_mammals_rodents ],
  706. [ nil, nil, nil, 0, nil, @edge_primates_human, nil ],
  707. [ nil, nil, nil, nil, 0, @edge_primates_chimpanzee, nil ],
  708. [ nil, nil, nil, @edge_primates_human,
  709. @edge_primates_chimpanzee, 0, @edge_mammals_primates ],
  710. [ nil, nil, @edge_mammals_rodents, nil,
  711. nil, @edge_mammals_primates, 0 ]
  712. ]
  713. expected = Matrix.rows(a, false)
  714. assert_equal(expected, @tree.adjacency_matrix(@nodes, nil, 0))
  715. end
  716. def test_adjacency_matrix_with_block
  717. a =
  718. [ [ 0, nil, "0.0968", nil, nil, nil, nil ],
  719. [ nil, 0, "0.1125", nil, nil, nil, nil ],
  720. [ "0.0968", "0.1125", 0, nil, nil, nil, "0.256" ],
  721. [ nil, nil, nil, 0, nil, "0.0386", nil ],
  722. [ nil, nil, nil, nil, 0, "0.0503", nil ],
  723. [ nil, nil, nil, "0.0386", "0.0503", 0, "0.2235" ],
  724. [ nil, nil, "0.256", nil, nil, "0.2235", 0 ]
  725. ]
  726. expected = Matrix.rows(a, false)
  727. assert_equal(expected,
  728. @tree.adjacency_matrix(@nodes, nil, 0) { |src, tgt, edge|
  729. sprintf("%.15g", edge.distance)
  730. })
  731. end
  732. def test_remove_nonsense_nodes
  733. assert_equal([ @mammals ], @tree.remove_nonsense_nodes)
  734. end
  735. def test_insert_node
  736. node1 = Bio::Tree::Node.new('node1')
  737. ret = nil
  738. assert_nothing_raised {
  739. ret = @tree.insert_node(@mouse, @rodents, node1, 0.0123)
  740. }
  741. assert_equal(@tree, ret)
  742. distance_mouse_node1 = @tree.get_edge(@mouse, node1).distance
  743. assert_equal("0.0123", sprintf("%.15g", distance_mouse_node1))
  744. distance_node1_rodents = @tree.get_edge(node1, @rodents).distance
  745. assert_equal("0.0845", sprintf("%.15g", distance_node1_rodents))
  746. end
  747. end #class TestTree2
  748. end #module Bio