PageRenderTime 38ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/antlr-3.4/runtime/Ruby/test/unit/test-tree-wizard.rb

https://bitbucket.org/cyanogenmod/android_external_antlr
Ruby | 494 lines | 373 code | 116 blank | 5 comment | 2 complexity | 18328420c75b3c73c074824dc5720c44 MD5 | raw file
  1. #!/usr/bin/ruby
  2. # encoding: utf-8
  3. require 'antlr3'
  4. require 'antlr3/tree/wizard'
  5. require 'test/unit'
  6. require 'spec'
  7. include ANTLR3
  8. include ANTLR3::AST
  9. class TestPatternLexer < Test::Unit::TestCase
  10. # vvvvvvvv tests vvvvvvvvv
  11. def test_open
  12. lexer = Wizard::PatternLexer.new( '(' )
  13. type = lexer.next_token
  14. assert_equal( type, :open )
  15. assert_equal( lexer.text, '' )
  16. assert_equal( lexer.error, false )
  17. end
  18. def test_close
  19. lexer = Wizard::PatternLexer.new(')')
  20. type = lexer.next_token
  21. assert_equal(type, :close)
  22. assert_equal(lexer.text, '')
  23. assert_equal(lexer.error, false)
  24. end
  25. def test_percent
  26. lexer = Wizard::PatternLexer.new('%')
  27. type = lexer.next_token
  28. assert_equal(type, :percent)
  29. assert_equal(lexer.text, '')
  30. assert_equal(lexer.error, false)
  31. end
  32. def test_dot
  33. lexer = Wizard::PatternLexer.new('.')
  34. type = lexer.next_token
  35. assert_equal(type, :dot)
  36. assert_equal(lexer.text, '')
  37. assert_equal(lexer.error, false)
  38. end
  39. def test_eof
  40. lexer = Wizard::PatternLexer.new(" \n \r \t ")
  41. type = lexer.next_token
  42. assert_equal(type, EOF)
  43. assert_equal(lexer.text, '')
  44. assert_equal(lexer.error, false)
  45. end
  46. def test_id
  47. lexer = Wizard::PatternLexer.new('__whatever_1__')
  48. type = lexer.next_token
  49. assert_equal(:identifier, type)
  50. assert_equal('__whatever_1__', lexer.text)
  51. assert( !(lexer.error) )
  52. end
  53. def test_arg
  54. lexer = Wizard::PatternLexer.new('[ \]bla\n]')
  55. type = lexer.next_token
  56. assert_equal(type, :argument)
  57. assert_equal(' ]bla\n', lexer.text)
  58. assert( !(lexer.error) )
  59. end
  60. def test_error
  61. lexer = Wizard::PatternLexer.new("1")
  62. type = lexer.next_token
  63. assert_equal(type, EOF)
  64. assert_equal(lexer.text, '')
  65. assert_equal(lexer.error, true)
  66. end
  67. end
  68. class TestPatternParser < Test::Unit::TestCase
  69. Tokens = TokenScheme.build %w(A B C D E ID VAR)
  70. include Tokens
  71. def setup
  72. @adaptor = CommonTreeAdaptor.new( Tokens.token_class )
  73. @pattern_adaptor = Wizard::PatternAdaptor.new( Tokens.token_class )
  74. @wizard = Wizard.new( :adaptor => @adaptor, :token_scheme => Tokens )
  75. end
  76. # vvvvvvvv tests vvvvvvvvv
  77. def test_single_node
  78. tree = Wizard::PatternParser.parse( 'ID', Tokens, @adaptor )
  79. assert_instance_of(CommonTree, tree)
  80. assert_equal( ID, tree.type )
  81. assert_equal( 'ID', tree.text )
  82. end
  83. def test_single_node_with_arg
  84. tree = Wizard::PatternParser.parse( 'ID[foo]', Tokens, @adaptor )
  85. assert_instance_of( CommonTree, tree )
  86. assert_equal( ID, tree.type )
  87. assert_equal( 'foo', tree.text )
  88. end
  89. def test_single_level_tree
  90. tree = Wizard::PatternParser.parse( '(A B)', Tokens, @adaptor )
  91. assert_instance_of( CommonTree, tree )
  92. assert_equal(A, tree.type)
  93. assert_equal('A', tree.text)
  94. assert_equal(tree.child_count, 1)
  95. assert_equal(tree.child(0).type, B)
  96. assert_equal(tree.child(0).text, 'B')
  97. end
  98. def test_nil
  99. tree = Wizard::PatternParser.parse( 'nil', Tokens, @adaptor )
  100. assert_instance_of(CommonTree, tree)
  101. assert_equal(0, tree.type)
  102. assert_nil tree.text
  103. end
  104. def test_wildcard
  105. tree = Wizard::PatternParser.parse( '(.)', Tokens, @adaptor )
  106. assert_instance_of( Wizard::WildcardPattern, tree )
  107. end
  108. def test_label
  109. tree = Wizard::PatternParser.parse( '(%a:A)', Tokens, @pattern_adaptor )
  110. assert_instance_of(Wizard::Pattern, tree)
  111. assert_equal('a', tree.label)
  112. end
  113. def test_error_1
  114. tree = Wizard::PatternParser.parse( ')', Tokens, @adaptor )
  115. assert_nil tree
  116. end
  117. def test_error_2
  118. tree = Wizard::PatternParser.parse( '()', Tokens, @adaptor )
  119. assert_nil tree
  120. end
  121. def test_error_3
  122. tree = Wizard::PatternParser.parse( '(A ])', Tokens, @adaptor )
  123. assert_nil tree
  124. end
  125. end
  126. class TestTreeWizard < Test::Unit::TestCase
  127. Tokens = TokenScheme.build %w(A B C D E ID VAR)
  128. include Tokens
  129. def setup
  130. @adaptor = CommonTreeAdaptor.new( Tokens.token_class )
  131. @wizard = Wizard.new( :adaptor => @adaptor, :token_scheme => Tokens )
  132. end
  133. def create_wizard( tokens )
  134. Wizard.new( :tokens => tokens )
  135. end
  136. # vvvvvvvv tests vvvvvvvvv
  137. def test_init
  138. @wizard = Wizard.new( :tokens => %w(A B), :adaptor => @adaptor )
  139. assert_equal( @wizard.adaptor, @adaptor )
  140. assert_kind_of( ANTLR3::TokenScheme, @wizard.token_scheme )
  141. end
  142. def test_single_node
  143. t = @wizard.create("ID")
  144. assert_equal(t.inspect, 'ID')
  145. end
  146. def test_single_node_with_arg
  147. t = @wizard.create("ID[foo]")
  148. assert_equal(t.inspect, 'foo')
  149. end
  150. def test_single_node_tree
  151. t = @wizard.create("(A)")
  152. assert_equal(t.inspect, 'A')
  153. end
  154. def test_single_level_tree
  155. t = @wizard.create("(A B C D)")
  156. assert_equal(t.inspect, '(A B C D)')
  157. end
  158. def test_list_tree
  159. t = @wizard.create("(nil A B C)")
  160. assert_equal(t.inspect, 'A B C')
  161. end
  162. def test_invalid_list_tree
  163. t = @wizard.create("A B C")
  164. assert_nil t
  165. end
  166. def test_double_level_tree
  167. t = @wizard.create("(A (B C) (B D) E)")
  168. assert_equal(t.inspect, "(A (B C) (B D) E)")
  169. end
  170. SIMPLIFY_MAP = lambda do |imap|
  171. Hash[
  172. imap.map { |type, nodes| [type, nodes.map { |n| n.to_s }] }
  173. ]
  174. end
  175. def test_single_node_index
  176. tree = @wizard.create("ID")
  177. index_map = SIMPLIFY_MAP[@wizard.index(tree)]
  178. assert_equal(index_map, ID => %w(ID))
  179. end
  180. def test_no_repeats_index
  181. tree = @wizard.create("(A B C D)")
  182. index_map = SIMPLIFY_MAP[@wizard.index(tree)]
  183. assert_equal(index_map,
  184. D => %w(D), B => %w(B),
  185. C => %w(C), A => %w(A)
  186. )
  187. end
  188. def test_repeats_index
  189. tree = @wizard.create("(A B (A C B) B D D)")
  190. index_map = SIMPLIFY_MAP[@wizard.index(tree)]
  191. assert_equal(index_map,
  192. D => %w(D D), B => %w(B B B),
  193. C => %w(C), A => %w(A A)
  194. )
  195. end
  196. def test_no_repeats_visit
  197. tree = @wizard.create("(A B C D)")
  198. elements = []
  199. @wizard.visit( tree, B ) do |node, parent, child_index, labels|
  200. elements << node.to_s
  201. end
  202. assert_equal( %w(B), elements )
  203. end
  204. def test_no_repeats_visit2
  205. tree = @wizard.create("(A B (A C B) B D D)")
  206. elements = []
  207. @wizard.visit( tree, C ) do |node, parent, child_index, labels|
  208. elements << node.to_s
  209. end
  210. assert_equal(%w(C), elements)
  211. end
  212. def test_repeats_visit
  213. tree = @wizard.create("(A B (A C B) B D D)")
  214. elements = []
  215. @wizard.visit( tree, B ) do |node, parent, child_index, labels|
  216. elements << node.to_s
  217. end
  218. assert_equal(%w(B B B), elements)
  219. end
  220. def test_repeats_visit2
  221. tree = @wizard.create("(A B (A C B) B D D)")
  222. elements = []
  223. @wizard.visit( tree, A ) do |node, parent, child_index, labels|
  224. elements << node.to_s
  225. end
  226. assert_equal(%w(A A), elements)
  227. end
  228. def context(node, parent, index)
  229. '%s@%s[%d]' % [node.to_s, (parent || 'nil').to_s, index]
  230. end
  231. def test_repeats_visit_with_context
  232. tree = @wizard.create("(A B (A C B) B D D)")
  233. elements = []
  234. @wizard.visit( tree, B ) do |node, parent, child_index, labels|
  235. elements << context(node, parent, child_index)
  236. end
  237. assert_equal(['B@A[0]', 'B@A[1]', 'B@A[2]'], elements)
  238. end
  239. def test_repeats_visit_with_null_parent_and_context
  240. tree = @wizard.create("(A B (A C B) B D D)")
  241. elements = []
  242. @wizard.visit( tree, A ) do |node, parent, child_index, labels|
  243. elements << context(node, parent, child_index)
  244. end
  245. assert_equal(['A@nil[-1]', 'A@A[1]'], elements)
  246. end
  247. def test_visit_pattern
  248. tree = @wizard.create("(A B C (A B) D)")
  249. elements = []
  250. @wizard.visit(tree, '(A B)') do |node, parent, child_index, labels|
  251. elements << node.to_s
  252. end
  253. assert_equal(%w(A), elements)
  254. end
  255. def test_visit_pattern_multiple
  256. tree = @wizard.create("(A B C (A B) (D (A B)))")
  257. elements = []
  258. @wizard.visit(tree, '(A B)') do |node, parent, child_index, labels|
  259. elements << context(node, parent, child_index)
  260. end
  261. assert_equal( %w(A@A[2] A@D[0]) , elements )
  262. end
  263. def labeled_context(node, parent, index, labels, *names)
  264. suffix = names.map { |n| labels[n].to_s }.join('&')
  265. '%s@%s[%d]%s' % [node.to_s, (parent || 'nil').to_s, index, suffix]
  266. end
  267. def test_visit_pattern_multiple_with_labels
  268. tree = @wizard.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
  269. elements = []
  270. @wizard.visit(tree, '(%a:A %b:B)') do |node, parent, child_index, labels|
  271. elements << labeled_context(node, parent, child_index, labels, 'a', 'b')
  272. end
  273. assert_equal( ['foo@A[2]foo&bar', 'big@D[0]big&dog'] , elements )
  274. end
  275. def test_match
  276. tree = @wizard.create("(A B C)")
  277. assert @wizard.match(tree, "(A B C)")
  278. end
  279. def test_match_single_node
  280. tree = @wizard.create('A')
  281. assert @wizard.match(tree, 'A')
  282. end
  283. def test_match_single_node_fails
  284. tree = @wizard.create('A')
  285. assert( !(@wizard.match(tree, 'B')) )
  286. end
  287. def test_match_flat_tree
  288. tree = @wizard.create('(nil A B C)')
  289. assert @wizard.match(tree, '(nil A B C)')
  290. end
  291. def test_match_flat_tree_fails
  292. tree = @wizard.create('(nil A B C)')
  293. assert( !(@wizard.match(tree, '(nil A B)')) )
  294. end
  295. def test_match_flat_tree_fails2
  296. tree = @wizard.create('(nil A B C)')
  297. assert( !(@wizard.match(tree, '(nil A B A)')) )
  298. end
  299. def test_wildcard
  300. tree = @wizard.create('(A B C)')
  301. assert @wizard.match(tree, '(A . .)')
  302. end
  303. def test_match_with_text
  304. tree = @wizard.create('(A B[foo] C[bar])')
  305. assert @wizard.match(tree, '(A B[foo] C)')
  306. end
  307. def test_match_with_text_fails
  308. tree = @wizard.create('(A B C)')
  309. assert( !(@wizard.match(tree, '(A[foo] B C)')) )
  310. end
  311. def test_match_labels
  312. tree = @wizard.create('(A B C)')
  313. labels = @wizard.match( tree, '(%a:A %b:B %c:C)' )
  314. assert_equal('A', labels['a'].to_s)
  315. assert_equal('B', labels['b'].to_s)
  316. assert_equal('C', labels['c'].to_s)
  317. end
  318. def test_match_with_wildcard_labels
  319. tree = @wizard.create('(A B C)')
  320. labels = @wizard.match(tree, '(A %b:. %c:.)')
  321. assert_kind_of( Hash, labels )
  322. assert_equal('B', labels['b'].to_s)
  323. assert_equal('C', labels['c'].to_s)
  324. end
  325. def test_match_labels_and_test_text
  326. tree = @wizard.create('(A B[foo] C)')
  327. labels = @wizard.match( tree, '(%a:A %b:B[foo] %c:C)' )
  328. assert_kind_of( Hash, labels )
  329. assert_equal('A', labels['a'].to_s)
  330. assert_equal('foo', labels['b'].to_s)
  331. assert_equal('C', labels['c'].to_s)
  332. end
  333. def test_match_labels_in_nested_tree
  334. tree = @wizard.create('(A (B C) (D E))')
  335. labels = @wizard.match( tree, '(%a:A (%b:B %c:C) (%d:D %e:E))' )
  336. assert_kind_of( Hash, labels )
  337. assert_equal('A', labels['a'].to_s)
  338. assert_equal('B', labels['b'].to_s)
  339. assert_equal('C', labels['c'].to_s)
  340. assert_equal('D', labels['d'].to_s)
  341. assert_equal('E', labels['e'].to_s)
  342. end
  343. def test_equals
  344. tree1 = @wizard.create("(A B C)")
  345. tree2 = @wizard.create("(A B C)")
  346. assert @wizard.equals(tree1, tree2)
  347. end
  348. def test_equals_with_text
  349. tree1 = @wizard.create("(A B[foo] C)")
  350. tree2 = @wizard.create("(A B[foo] C)")
  351. assert @wizard.equals(tree1, tree2)
  352. end
  353. def test_equals_with_mismatched_text
  354. tree1 = @wizard.create("(A B[foo] C)")
  355. tree2 = @wizard.create("(A B C)")
  356. assert( !(@wizard.equals(tree1, tree2)) )
  357. end
  358. def test_equals_with_mismatched_list
  359. tree1 = @wizard.create("(A B C)")
  360. tree2 = @wizard.create("(A B A)")
  361. assert( !(@wizard.equals(tree1, tree2)) )
  362. end
  363. def test_equals_with_mismatched_list_length
  364. tree1 = @wizard.create("(A B C)")
  365. tree2 = @wizard.create("(A B)")
  366. assert( !(@wizard.equals(tree1, tree2)) )
  367. end
  368. def test_find_pattern
  369. tree = @wizard.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
  370. subtrees = @wizard.find(tree, "(A B)").map { |t| t.to_s }
  371. assert_equal(%w(foo big), subtrees)
  372. end
  373. def test_find_token_type
  374. tree = @wizard.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
  375. subtrees = @wizard.find( tree, A ).map { |t| t.to_s }
  376. assert_equal(%w(A foo big), subtrees)
  377. end
  378. end