PageRenderTime 34ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/Support/test/cases/as3/parsers/test_class_parser.rb

http://github.com/simongregory/actionscript3-tmbundle
Ruby | 596 lines | 415 code | 141 blank | 40 comment | 1 complexity | 242c9cbf126f5cac2b5e5286c23a347e MD5 | raw file
  1. #!/usr/bin/env ruby18 -wKU
  2. # encoding: utf-8
  3. require "test/unit"
  4. require "c_env"
  5. require "as3/parsers/class_parser"
  6. # Helper methods for testing
  7. #
  8. module ClassParserHelpers
  9. def bundle_support
  10. File.expand_path(File.dirname(__FILE__)+'../../../../../')
  11. end
  12. def setup
  13. ENV['TM_BUNDLE_SUPPORT'] = bundle_support
  14. end
  15. def intrinsic_base_path
  16. "#{bundle_support}/Data/completions/intrinsic"
  17. end
  18. def assert_method(cp,signature)
  19. assert(cp.methods.include?(signature), "Failed to find '#{signature}' method")
  20. end
  21. def assert_static_method(cp,signature)
  22. assert(cp.static_methods.include?(signature), "Failed to find '#{signature}' static method")
  23. end
  24. def assert_property(cp,signature)
  25. assert(cp.properties.include?(signature), "Failed to find '#{signature}' property")
  26. end
  27. def assert_static_property(cp,signature)
  28. assert(cp.static_properties.include?(signature), "Failed to find '#{signature}' static property")
  29. end
  30. def assert_gettersetter(cp,signature)
  31. assert(cp.gettersetters.include?(signature), "Failed to find '#{signature}' gettersetter")
  32. end
  33. def load_doc(class_path)
  34. File.new("#{intrinsic_base_path}/#{class_path}").read.strip
  35. end
  36. def get_parser_for(class_path,chain='this')
  37. f = load_doc(class_path)
  38. c = ClassParser.new
  39. c.load(f,chain)
  40. c
  41. end
  42. def get_interface_parser_for(class_path)
  43. f = load_doc(class_path)
  44. c = ClassParserInterfaceTester.new
  45. c.load_interface(f)
  46. c
  47. end
  48. end
  49. # Subclass of ClassParser that exposes internal functionality for testing.
  50. #
  51. class ClassParserInterfaceTester < ClassParser
  52. def load_interface(doc)
  53. reset
  54. doc = strip_comments(doc)
  55. add_interface(doc) if is_interface(doc)
  56. end
  57. end
  58. class TestClassMemberParsing < Test::Unit::TestCase
  59. include ClassParserHelpers
  60. def test_store_members_error_class
  61. c = get_parser_for('Error.as')
  62. assert_method(c,'getStackTrace():String')
  63. assert_method(c,'toString():String')
  64. assert_property(c,'message')
  65. assert_property(c,'name')
  66. assert_gettersetter(c,'errorID')
  67. assert(c.styles.nil?, "Styles should be nil.")
  68. assert(c.events.nil?, "Events should be nil.")
  69. assert(c.effects.nil?, "Effects should be nil.")
  70. end
  71. def test_store_members_math_class
  72. c = get_parser_for('Math.as')
  73. assert_static_property(c,'LOG10E')
  74. assert_static_property(c,'SQRT1_2')
  75. assert_static_method(c,'abs(val:Number):Number')
  76. assert_static_method(c,'max(val1:Number, val2:Number, ... rest):Number')
  77. assert_static_method(c,'sqrt(val:Number):Number')
  78. assert(c.styles.nil?, "Styles should be nil.")
  79. assert(c.events.nil?, "Events should be nil.")
  80. assert(c.effects.nil?, "Effects should be nil.")
  81. end
  82. def test_store_members_mouseevent_class
  83. c = get_parser_for("flash/events/MouseEvent.as")
  84. # Methods in the class
  85. assert_method(c,'updateAfterEvent():void')
  86. # Methods in the super class
  87. assert_method(c,'formatToString(className:String, ... arguments):String')
  88. # Getterseets in class
  89. assert_gettersetter(c,'stageX') #():Number
  90. assert_gettersetter(c,'stageY') #():Number
  91. assert_gettersetter(c,'shiftKey') #(value:Boolean):void')
  92. # Gettersetters in super class
  93. assert_gettersetter(c,'currentTarget') #():Object')
  94. assert_gettersetter(c,'bubbles') #():Boolean')
  95. # Static property in class
  96. assert_static_property(c,'CLICK')
  97. assert_static_property(c,'DOUBLE_CLICK')
  98. assert_static_property(c,'MOUSE_DOWN')
  99. assert_static_property(c,'MOUSE_MOVE')
  100. assert_static_property(c,'MOUSE_OUT')
  101. assert_static_property(c,'MOUSE_OVER')
  102. assert_static_property(c,'MOUSE_UP')
  103. assert_static_property(c,'MOUSE_WHEEL')
  104. assert_static_property(c,'ROLL_OUT')
  105. assert_static_property(c,'ROLL_OVER')
  106. # Static property in super class
  107. assert_static_property(c,'TAB_CHILDREN_CHANGE')
  108. assert_static_property(c,'RENDER')
  109. assert_static_property(c,'RESIZE')
  110. assert_static_property(c,'SCROLL')
  111. assert_static_property(c,'SELECT')
  112. assert(c.styles.nil?, "Styles should be nil.")
  113. assert(c.events.nil?, "Events should be nil.")
  114. assert(c.effects.nil?, "Effects should be nil.")
  115. end
  116. def test_store_members_stackframe_class
  117. c = get_parser_for("flash/sampler/StackFrame.as")
  118. # properties in the class
  119. assert_property(c,'file')
  120. assert_property(c,'line')
  121. assert_property(c,'name')
  122. assert(c.styles.nil?, "Styles should be nil.")
  123. assert(c.events.nil?, "Events should be nil.")
  124. assert(c.effects.nil?, "Effects should be nil.")
  125. end
  126. end
  127. class TestInterfaceMemberParsing < Test::Unit::TestCase
  128. include ClassParserHelpers
  129. def test_store_members_for_iexternalizable
  130. c = get_interface_parser_for('flash/utils/IExternalizable.as')
  131. # methods in the interface
  132. assert_method(c,'writeExternal(output:IDataOutput):void')
  133. assert_method(c,'readExternal(input:IDataInput):void')
  134. assert(c.styles.nil?, "Styles should be nil.")
  135. assert(c.events.nil?, "Events should be nil.")
  136. assert(c.effects.nil?, "Effects should be nil.")
  137. end
  138. def test_store_members_for_ieventdispatcher
  139. c = get_interface_parser_for('flash/events/IEventDispatcher.as')
  140. # methods in the interface
  141. assert_method(c,'removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void')
  142. assert_method(c,'hasEventListener(type:String):Boolean')
  143. assert_method(c,'dispatchEvent(event:Event):Boolean')
  144. assert_method(c,'addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void')
  145. assert(c.styles.nil?, "Styles should be nil.")
  146. assert(c.events.nil?, "Events should be nil.")
  147. assert(c.effects.nil?, "Effects should be nil.")
  148. end
  149. def test_store_members_for_ibitmapdrawable
  150. c = get_interface_parser_for('flash/display/IBitmapDrawable.as')
  151. assert(c.methods.nil?, "Methods should be nil.")
  152. assert(c.properties.nil?, "Properties should be nil.")
  153. assert(c.gettersetters.nil?, "GetterSetters should be nil.")
  154. assert(c.styles.nil?, "Styles should be nil.")
  155. assert(c.events.nil?, "Events should be nil.")
  156. assert(c.effects.nil?, "Effects should be nil.")
  157. end
  158. def test_idatainput
  159. c = get_interface_parser_for('flash/utils/IDataInput.as')
  160. assert_equal(14,c.methods.length)
  161. assert_equal(3, c.gettersetters.length)
  162. assert(c.properties.nil?, "Properties should be nil.")
  163. assert(c.styles.nil?, "Styles should be nil.")
  164. assert(c.events.nil?, "Events should be nil.")
  165. assert(c.effects.nil?, "Effects should be nil.")
  166. end
  167. end
  168. class TestClassTypeDetection < Test::Unit::TestCase
  169. include ClassParserHelpers
  170. def test_find_type_in_event
  171. d = load_doc('flash/events/Event.as')
  172. c = ClassParser.new
  173. assert_equal(nil, c.find_type(d,'foo'))
  174. assert_equal('Object', c.find_type(d,'currentTarget'))
  175. assert_equal(nil, c.find_type(d,'stopImmediatePropagation'))
  176. assert_equal(true, c.return_type_void)
  177. assert_equal('Boolean', c.find_type(d,'isDefaultPrevented'))
  178. assert_equal('String', c.find_type(d,'formatToString'))
  179. end
  180. def test_find_type_mouse_event
  181. d = load_doc('flash/events/MouseEvent.as')
  182. c = ClassParser.new
  183. # MouseEvent constants
  184. assert_equal('String', c.find_type(d,'CLICK'))
  185. assert_equal('String', c.find_type(d,'DOUBLE_CLICK'))
  186. assert_equal('String', c.find_type(d,'MOUSE_DOWN'))
  187. assert_equal('String', c.find_type(d,'MOUSE_MOVE'))
  188. assert_equal('String', c.find_type(d,'MOUSE_OUT'))
  189. assert_equal('String', c.find_type(d,'MOUSE_OVER'))
  190. assert_equal('String', c.find_type(d,'MOUSE_UP'))
  191. assert_equal('String', c.find_type(d,'MOUSE_WHEEL'))
  192. assert_equal('String', c.find_type(d,'ROLL_OUT'))
  193. assert_equal('String', c.find_type(d,'ROLL_OVER'))
  194. # Found in the superclass - Event
  195. found = c.find_type(d,'RENDER')
  196. assert_equal('String', found)
  197. assert_equal('String', c.find_type(d,'RESIZE'))
  198. assert_equal('String', c.find_type(d,'SCROLL'))
  199. assert_equal('String', c.find_type(d,'SELECT'))
  200. end
  201. def test_find_type_in_matrix
  202. d = load_doc('flash/geom/Matrix.as')
  203. c = ClassParser.new
  204. assert_equal(nil, c.find_type(d,'z'))
  205. assert_equal(false, c.return_type_void)
  206. assert_equal('Number', c.find_type(d,'a'))
  207. assert_equal(false, c.return_type_void)
  208. assert_equal('Number', c.find_type(d,'b'))
  209. assert_equal(false, c.return_type_void)
  210. assert_equal('Number', c.find_type(d,'c'))
  211. assert_equal(false, c.return_type_void)
  212. assert_equal('Number', c.find_type(d,'d'))
  213. assert_equal(false, c.return_type_void)
  214. assert_equal('Number', c.find_type(d,'tx'))
  215. assert_equal(false, c.return_type_void)
  216. assert_equal('Number', c.find_type(d,'ty'))
  217. assert_equal(false, c.return_type_void)
  218. assert_equal('Matrix', c.find_type(d,'clone'))
  219. assert_equal(false, c.return_type_void)
  220. assert_equal('Point', c.find_type(d,'deltaTransformPoint'))
  221. assert_equal(false, c.return_type_void)
  222. assert_equal(nil, c.find_type(d,'translate'))
  223. assert_equal(true, c.return_type_void)
  224. assert_equal(nil, c.find_type(d,'createGradientBox'))
  225. assert_equal(true, c.return_type_void)
  226. end
  227. def test_find_type_in_data
  228. d = load_doc('Date.as')
  229. c = ClassParser.new
  230. assert_equal(nil, c.find_type(d,'foo'))
  231. assert_equal('Number', c.find_type(d,'dateUTC'))
  232. assert_equal('Number', c.find_type(d,'millisecondsUTC'))
  233. assert_equal('Number', c.find_type(d,'getUTCMilliseconds'))
  234. assert_equal('String', c.find_type(d,'toTimeString'))
  235. assert_equal('Number', c.find_type(d,'UTC'))
  236. end
  237. def test_find_type_in_ieventdispatcher
  238. d = load_doc('flash/events/IEventDispatcher.as')
  239. c = ClassParser.new
  240. assert_equal(nil, c.find_type(d,'foo'))
  241. assert_equal('Boolean', c.find_type(d,'hasEventListener'))
  242. assert_equal(false, c.return_type_void)
  243. assert_equal('Boolean', c.find_type(d,'dispatchEvent'))
  244. assert_equal(false, c.return_type_void)
  245. assert_equal('Boolean', c.find_type(d,'willTrigger'))
  246. assert_equal(false, c.return_type_void)
  247. assert_equal(nil, c.find_type(d,'removeEventListener'))
  248. assert_equal(true, c.return_type_void)
  249. assert_equal(nil, c.find_type(d,'addEventListener'))
  250. assert_equal(true, c.return_type_void)
  251. end
  252. def test_find_type_in_idatainput
  253. d = load_doc('flash/utils/IDataInput.as')
  254. c = ClassParser.new
  255. assert_equal(nil, c.find_type(d,'foo'))
  256. assert_equal('uint', c.find_type(d,'objectEncoding'))
  257. assert_equal(false, c.return_type_void)
  258. assert_equal('String', c.find_type(d,'endian'))
  259. assert_equal(false, c.return_type_void)
  260. assert_equal('uint', c.find_type(d,'bytesAvailable'))
  261. assert_equal(false, c.return_type_void)
  262. assert_equal('Boolean', c.find_type(d,'readBoolean'))
  263. assert_equal(false, c.return_type_void)
  264. assert_equal('int', c.find_type(d,'readByte'))
  265. assert_equal(false, c.return_type_void)
  266. assert_equal(nil, c.find_type(d,'readBytes'))
  267. assert_equal(true, c.return_type_void)
  268. assert_equal('Number', c.find_type(d,'readDouble'))
  269. assert_equal(false, c.return_type_void)
  270. assert_equal('Number', c.find_type(d,'readFloat'))
  271. assert_equal(false, c.return_type_void)
  272. assert_equal('int', c.find_type(d,'readInt'))
  273. assert_equal(false, c.return_type_void)
  274. assert_equal('String', c.find_type(d,'readMultiByte'))
  275. assert_equal(false, c.return_type_void)
  276. assert_equal('*', c.find_type(d,'readObject'))
  277. assert_equal(false, c.return_type_void)
  278. assert_equal('int', c.find_type(d,'readShort'))
  279. assert_equal(false, c.return_type_void)
  280. assert_equal('uint', c.find_type(d,'readUnsignedByte'))
  281. assert_equal(false, c.return_type_void)
  282. assert_equal('uint', c.find_type(d,'readUnsignedInt'))
  283. assert_equal(false, c.return_type_void)
  284. assert_equal('uint', c.find_type(d,'readUnsignedShort'))
  285. assert_equal(false, c.return_type_void)
  286. assert_equal('String', c.find_type(d,'readUTF'))
  287. assert_equal(false, c.return_type_void)
  288. assert_equal('String', c.find_type(d,'readUTFBytes'))
  289. assert_equal(false, c.return_type_void)
  290. end
  291. end
  292. module HelvectorClassParserHelpers
  293. include ClassParserHelpers
  294. def helvector_test_base_path
  295. "#{bundle_support}/test/assets/cp/src"
  296. end
  297. def load_doc(class_path)
  298. File.new("#{helvector_test_base_path}/#{class_path}").read.strip
  299. end
  300. def get_parser_for(class_path,chain='this')
  301. f = load_doc(class_path)
  302. c = ClassParser.new
  303. c.load(f, chain)
  304. c
  305. end
  306. def get_interface_parser_for(class_path)
  307. f = load_doc(class_path)
  308. c = ClassParserInterfaceTester.new
  309. c.load_interface(f)
  310. c
  311. end
  312. end
  313. class TestHelvectorClassMemberParsing < Test::Unit::TestCase
  314. include HelvectorClassParserHelpers
  315. def test_store_members_for_textmatetests
  316. c = get_parser_for('TextMateTests.as')
  317. #We have private access to these class methods.
  318. assert_method(c,'initialize( event:Event , dummy:Boolean=false ):void')
  319. assert_method(c,'multilineMethodParams(one:Number,two:String):void')
  320. assert_method(c,'multilineMethodParamsReturning(one:Number,two:String):Event')
  321. assert_method(c,"overloadedMultilineMethodParams(zero:Number,one:Number=10,four:String=\"chalk\",two:String='cheese',six:String=CHEESE_EVENT,three:Boolean=true,seven:int=null):void")
  322. assert_method(c,"overloadedMultilineMethodParamsReturning(zero:Number,one:Number=10,four:String=\"chalk\",two:String='cheese',six:String=CHEESE_EVENT,three:Boolean=true,seven:int=null):Sprite")
  323. # Private access to properties
  324. assert_property(c,'_wensleydayle')
  325. assert_property(c,'cheddar')
  326. assert_property(c,'stilton')
  327. assert_property(c,'_edam')
  328. #Public and protected access to superclasses.
  329. assert_method(c,'areInaccessibleObjectsUnderPoint(point:Point):Boolean')
  330. assert_method(c,'getRect(targetCoordinateSpace:DisplayObject):Rectangle')
  331. assert_method(c,'startDrag(lockCenter:Boolean = false, bounds:Rectangle = null):void')
  332. assert_method(c,'setChildIndex(child:DisplayObject, index:int):void')
  333. #No styles, events or effects are defined.
  334. assert(c.styles.nil?, "Styles should be nil.")
  335. assert(c.events.nil?, "Events should be nil.")
  336. assert(c.effects.nil?, "Effects should be nil.")
  337. end
  338. def test_store_interface_members_for_isimple_extender
  339. c = get_interface_parser_for('org/helvector/textmate/interface/ISimpleExtender.as')
  340. # methods in the interface
  341. assert_method(c,'simpleExtederMethod():void')
  342. assert_method(c,'mulitlineParams(one:String,two:Number):void')
  343. # properties in the superclass
  344. assert_gettersetter(c,'simpleExtenderProperty')
  345. # methods in the superclass
  346. assert_method(c,'simpleMethod():void')
  347. # properties in the superclass
  348. assert_gettersetter(c,'simpleProperty')
  349. end
  350. def test_store_interface_members_for_imultipleinheritor
  351. c = get_interface_parser_for('org/helvector/textmate/interface/IMultipleInheritor.as')
  352. # methods in the interface
  353. assert_method(c,'testMethodA():IMultipleOne')
  354. assert_method(c,'testMethodB():void')
  355. assert_method(c,'testMethodC(one:Number,two:String):IMultipleThree')
  356. assert_method(c,'testMethodD():void')
  357. # properties in the class
  358. assert_gettersetter(c,'testPropertyA')
  359. assert_gettersetter(c,'testPropertyB')
  360. # methods in the superclass IMultipleOne
  361. assert_method(c,'testMultipleOneMethod():Sprite')
  362. assert_gettersetter(c,'testMultipleOneProperty')
  363. # methods in the superclass IMultipleTwo
  364. assert_method(c,'testMultipleTwoMethod():void')
  365. assert_gettersetter(c,'testMultipleTwoProperty')
  366. # methods in the superclass IMultipleThree
  367. assert_method(c,'testMultipleThreeMethod():Object')
  368. assert_gettersetter(c,'testMultipleThreeProperty')
  369. # methods in the superclass AltTwo, IMultipleTwo
  370. assert_method(c,'testAltTwoMethod():void')
  371. assert_gettersetter(c,'testAltTwoProperty')
  372. # methods in the superclass AltOne, IMultipleTwo
  373. assert_method(c,'testAltOneMethod():void')
  374. assert_gettersetter(c,'testAltOneProperty')
  375. end
  376. end
  377. class TestHelvectorClassTypeDetection < Test::Unit::TestCase
  378. include HelvectorClassParserHelpers
  379. def test_overloaded_multiline_method_params_return
  380. d = load_doc('TextMateTests.as')
  381. c = ClassParser.new
  382. assert_equal(nil, c.find_type(d,'foo'))
  383. assert_equal('Sprite', c.find_type(d,'overloadedMultilineMethodParamsReturning'))
  384. assert_equal(nil, c.find_type(d,'overloadedMultilineMethodParams'))
  385. end
  386. def test_multiline_method_params_return
  387. d = load_doc('TextMateTests.as')
  388. c = ClassParser.new
  389. assert_equal(nil, c.find_type(d,'foo'))
  390. assert_equal('Event', c.find_type(d,'multilineMethodParamsReturning'))
  391. assert_equal(nil, c.find_type(d,'multilineMethodParams'))
  392. end
  393. def test_store_interface_members_for_imultipleinheritor_type
  394. d = load_doc('org/helvector/textmate/interface/IMultipleInheritor.as')
  395. c = ClassParser.new
  396. assert_equal(nil, c.find_type(d,'foo'))
  397. # methods in the interface
  398. assert_equal('IMultipleOne', c.find_type(d,'testMethodA'))
  399. assert_equal(nil, c.find_type(d,'testMethodB'))
  400. assert_equal('IMultipleThree', c.find_type(d,'testMethodC'))
  401. assert_equal(nil, c.find_type(d,'testMethodD'))
  402. # properties in the class
  403. assert_equal('Object', c.find_type(d,'testPropertyA'))
  404. assert_equal('int', c.find_type(d,'testPropertyB'))
  405. # methods in the superclass IMultipleOne
  406. assert_equal('Sprite', c.find_type(d,'testMultipleOneMethod'))
  407. assert_equal('Object', c.find_type(d,'testMultipleOneProperty'))
  408. # methods in the superclass IMultipleTwo
  409. assert_equal(nil, c.find_type(d,'testMultipleTwoMethod'))
  410. assert_equal('Object', c.find_type(d,'testMultipleTwoProperty'))
  411. # methods in the superclass IMultipleThree
  412. assert_equal('Object', c.find_type(d,'testMultipleThreeMethod'))
  413. assert_equal('Math', c.find_type(d,'testMultipleThreeProperty'))
  414. # methods in the superclass AltTwo, IMultipleTwo
  415. assert_equal(nil, c.find_type(d,'testAltTwoMethod'))
  416. assert_equal('Object', c.find_type(d,'testAltTwoProperty'))
  417. # methods in the superclass AltOne, IMultipleTwo
  418. assert_equal(nil, c.find_type(d,'testAltOneMethod'))
  419. assert_equal('Object', c.find_type(d,'testAltOneProperty'))
  420. end
  421. end
  422. class TestHelvectorStaticClass < Test::Unit::TestCase
  423. include HelvectorClassParserHelpers
  424. def test_store_members_for_statictests
  425. c = get_parser_for('org/helvector/textmate/static/StaticTest.as')
  426. assert_static_property(c,'TEST_PRIVATE_STATIC_CONST')
  427. assert_static_property(c,'TEST_PRIVATE_STATIC_VAR')
  428. assert_static_property(c,'TEST_STATIC_PRIVATE_CONST')
  429. assert_static_property(c,'TEST_STATIC_PRIVATE_VAR')
  430. assert_static_property(c,'TEST_STATIC_PUBLIC_VAR')
  431. assert_static_property(c,'TEST_STATIC_PUBLIC_CONST')
  432. assert_static_property(c,'TEST_PUBLIC_STATIC_CONST')
  433. assert_static_property(c,'TEST_PUBLIC_STATIC_VAR')
  434. assert_static_method(c,'testPublicStaticFunction(param:*):void')
  435. assert_static_method(c,'testStaticPublicFunction():Event')
  436. assert_static_method(c,'testPrivateStaticFunction():void')
  437. assert_static_method(c,'testStaticMultilineMethod(one:Number,two:String,three:int):Object')
  438. assert_static_method(c,'testAltStaticMultilineMethod(one:Number=3,two:String="hello",three:int):*')
  439. assert_static_property(c,'testPublicStaticAccessor')
  440. assert_static_property(c,'testStaticPublicAccessor')
  441. assert_static_property(c,'testPrivateStaticAccessor')
  442. end
  443. def test_static_return_types
  444. d = load_doc('org/helvector/textmate/static/StaticTest.as')
  445. c = ClassParser.new
  446. assert_equal(nil, c.find_type(d,'foo'))
  447. # methods in the interface
  448. assert_equal('Event', c.find_type(d,'testStaticPublicFunction'))
  449. assert_equal('Object', c.find_type(d,'testStaticMultilineMethod'))
  450. assert_equal('Object', c.find_type(d,'testPublicStaticAccessor'))
  451. assert_equal('String', c.find_type(d,'TEST_PRIVATE_STATIC_CONST'))
  452. assert_equal('Number', c.find_type(d,'TEST_PUBLIC_STATIC_VAR'))
  453. assert_equal('String', c.find_type(d,'TEST_PUBLIC_STATIC_CONST'))
  454. end
  455. end