PageRenderTime 41ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/Languages/Ruby/Tests/Interop/net/method/binding/other_concerns_spec.rb

http://github.com/IronLanguages/main
Ruby | 243 lines | 234 code | 9 blank | 0 comment | 7 complexity | 153da5fc4c265e648c317a7f0f51d851 MD5 | raw file
Possible License(s): CPL-1.0, BSD-3-Clause, ISC, GPL-2.0, MPL-2.0-no-copyleft-exception
  1. require File.dirname(__FILE__) + "/../../spec_helper"
  2. require File.dirname(__FILE__) + "/../fixtures/classes"
  3. describe "Method parameter binding with misc parameters" do
  4. @keys = [:ClassWithMethodsArg, :GenericArg, :OutNonByRefInt32Arg, :IDictionaryOfIntIntArg, :HashtableArg, :ListOfIntArg, :IEnumerableIteratingArg, :IEnumeratorIteratingArg, :IEnumerableOfCharIteratingArg, :IEnumeratorOfCharIteratingArg, :IEnumerableOfIntIteratingArg, :IEnumeratorOfIntIteratingArg, :DelegateArg, :IntIntDelegateArg, :RefByteArrArg, :RefStructImplementsIInterfaceArg, :OutStructImplementsIInterfaceArg, :RefImplementsIInterfaceArg, :RefBooleanArg, :OutBooleanArg, :ParamsIInterfaceArrTestArg, :IListOfIntArg2, :IListOfCharArg, :IListArg]
  5. @matrix = {
  6. "ClassWithMethods" => { :ClassWithMethodsArg => "ClassWithMethodsArg",
  7. :GenericArg => "GenericArg[ClassWithMethods]",
  8. :RefBooleanArg => "RefBooleanArg"},
  9. "int" => { :GenericArg => "GenericArg[System.Int32]", :OutNonByRefInt32Arg => "OutNonByRefInt32Arg",
  10. :RefBooleanArg => "RefBooleanArg"},
  11. "nil" => { :ClassWithMethodsArg => "ClassWithMethodsArg",
  12. :GenericArg => "GenericArg[System.Object]",
  13. :IDictionaryOfIntIntArg => "IDictionaryOfIntIntArg",
  14. :HashtableArg => "HashtableArg", :ListOfIntArg => "ListOfIntArg",
  15. :RefByteArrArg => "RefByteArrArg",
  16. :RefImplementsIInterfaceArg => "RefImplementsIInterfaceArg",
  17. :RefBooleanArg => "RefBooleanArg"},
  18. "hash" => { :GenericArg => "GenericArg[IronRuby.Builtins.Hash]",
  19. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  20. :RefBooleanArg => "RefBooleanArg"},
  21. "Dictionary[obj,obj]" => { :GenericArg => "GenericArg[System.Collections.Generic.Dictionary`2[System.Object,System.Object]]",
  22. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  23. :RefBooleanArg => "RefBooleanArg"},
  24. "Dictionary[int,str]" => { :GenericArg => "GenericArg[System.Collections.Generic.Dictionary`2[System.Int32,System.String]]",
  25. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  26. :RefBooleanArg => "RefBooleanArg"},
  27. "Dictionary[int,int]" => { :GenericArg => "GenericArg[System.Collections.Generic.Dictionary`2[System.Int32,System.Int32]]",
  28. :IDictionaryOfIntIntArg => "IDictionaryOfIntIntArg",
  29. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  30. :RefBooleanArg => "RefBooleanArg"},
  31. "hashtable" => { :GenericArg => "GenericArg[System.Collections.Hashtable]",
  32. :HashtableArg => "HashtableArg", :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  33. :RefBooleanArg => "RefBooleanArg"},
  34. "List[int]" => { :GenericArg => "GenericArg[System.Collections.Generic.List`1[System.Int32]]",
  35. :ListOfIntArg => "ListOfIntArg", :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  36. :IEnumerableOfIntIteratingArg => "IEnumerableOfIntIteratingArg",
  37. :RefBooleanArg => "RefBooleanArg", :IListArg => "IListArg", :IListOfIntArg2 => "IListOfIntArg2"},
  38. "List[obj]" => { :GenericArg => "GenericArg[System.Collections.Generic.List`1[System.Object]]",
  39. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  40. :RefBooleanArg => "RefBooleanArg", :IListArg => "IListArg"},
  41. "Array[int]" => { :GenericArg => "GenericArg[System.Int32[]]",
  42. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  43. :IEnumerableOfIntIteratingArg => "IEnumerableOfIntIteratingArg",
  44. :RefBooleanArg => "RefBooleanArg", :IListArg => "IListArg", :IListOfIntArg2 => "IListOfIntArg2"},
  45. "String" => { :GenericArg => "GenericArg[IronRuby.Builtins.MutableString]",
  46. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  47. :RefByteArrArg => "RefByteArrArg",
  48. :RefBooleanArg => "RefBooleanArg"},
  49. "Array" => { :GenericArg => "GenericArg[IronRuby.Builtins.RubyArray]",
  50. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  51. :RefBooleanArg => "RefBooleanArg", :IListArg => "IListArg"},
  52. "Array[Char]" => { :GenericArg => "GenericArg[System.Char[]]",
  53. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  54. :IEnumerableOfCharIteratingArg => "IEnumerableOfCharIteratingArg",
  55. :RefBooleanArg => "RefBooleanArg", :IListArg => "IListArg", :IListOfCharArg => "IListOfCharArg"},
  56. "System::String" => { :GenericArg => "GenericArg[System.String]",
  57. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  58. :IEnumerableOfCharIteratingArg => "IEnumerableOfCharIteratingArg"},
  59. "Array[System::String]" => { :GenericArg => "GenericArg[System.String[]]",
  60. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  61. :RefBooleanArg => "RefBooleanArg", :IListArg => "IListArg", :IListOfCharArg => "IListOfCharArg"},
  62. "ArrayList" => { :GenericArg => "GenericArg[System.Collections.ArrayList]",
  63. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  64. :RefBooleanArg => "RefBooleanArg", :IListArg => "IListArg"},
  65. "List[Char]" => { :GenericArg => "GenericArg[System.Collections.Generic.List`1[System.Char]]",
  66. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  67. :IEnumerableOfCharIteratingArg => "IEnumerableOfCharIteratingArg",
  68. :RefBooleanArg => "RefBooleanArg", :IListArg => "IListArg", :IListOfCharArg => "IListOfCharArg"},
  69. "IEnumerator" => { :GenericArg => /GenericArg\[IronRuby\.Classes\.Object\$\d{1,3}\]/,
  70. :IEnumeratorIteratingArg => "IEnumeratorIteratingArg",
  71. :RefBooleanArg => "RefBooleanArg"},
  72. "IEnumerator[int]" => { :GenericArg => /GenericArg\[IronRuby\.Classes\.Object\$\d{1,3}\]/,
  73. :IEnumeratorIteratingArg => "IEnumeratorIteratingArg",
  74. :IEnumeratorOfIntIteratingArg => "IEnumeratorOfIntIteratingArg",
  75. :RefBooleanArg => "RefBooleanArg"},
  76. "IEnumerator[Char]" => { :GenericArg => /GenericArg\[IronRuby\.Classes\.Object\$\d{1,3}\]/,
  77. :IEnumeratorIteratingArg => "IEnumeratorIteratingArg",
  78. :IEnumeratorOfCharIteratingArg => "IEnumeratorOfCharIteratingArg",
  79. :RefBooleanArg => "RefBooleanArg"},
  80. "IntIntDelegate" => { :GenericArg => "GenericArg[IntIntDelegate]",
  81. :DelegateArg => "DelegateArg",
  82. :IntIntDelegateArg => "IntIntDelegateArg",
  83. :RefBooleanArg => "RefBooleanArg"},
  84. "lambda" => { :GenericArg => "GenericArg[IronRuby.Builtins.Proc]",
  85. :DelegateArg => "DelegateArg",
  86. :IntIntDelegateArg => "IntIntDelegateArg",
  87. :RefBooleanArg => "RefBooleanArg"},
  88. "proc" => { :GenericArg => "GenericArg[IronRuby.Builtins.Proc]",
  89. :DelegateArg => "DelegateArg",
  90. :IntIntDelegateArg => "IntIntDelegateArg",
  91. :RefBooleanArg => "RefBooleanArg"},
  92. "method" => { :GenericArg => "GenericArg[IronRuby.Builtins.RubyMethod]",
  93. :DelegateArg => "DelegateArg",
  94. :IntIntDelegateArg => "IntIntDelegateArg",
  95. :RefBooleanArg => "RefBooleanArg"},
  96. "unboundmethod" => { :GenericArg => "GenericArg[IronRuby.Builtins.UnboundMethod]", :RefBooleanArg => "RefBooleanArg"},
  97. "bool" => { :GenericArg => "GenericArg[System.Boolean]",
  98. :RefBooleanArg => "RefBooleanArg"},
  99. "Array[byte]" => { :GenericArg => "GenericArg[System.Byte[]]",
  100. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  101. :RefByteArrArg => "RefByteArrArg", :RefBooleanArg => "RefBooleanArg", :IListArg => "IListArg"},
  102. "List[byte]" => { :GenericArg => "GenericArg[System.Collections.Generic.List`1[System.Byte]]",
  103. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  104. :RefBooleanArg => "RefBooleanArg", :IListArg => "IListArg"},
  105. "self" => { :GenericArg => "GenericArg[IronRuby.Builtins.MutableString]",
  106. :IEnumerableIteratingArg => "IEnumerableIteratingArg",
  107. :RefByteArrArg => "RefByteArrArg",
  108. :RefBooleanArg => "RefBooleanArg"},
  109. "StructImplementsIInterfaceInstance" => { :GenericArg => "GenericArg[StructImplementsIInterface]",
  110. :RefStructImplementsIInterfaceArg => "RefStructImplementsIInterfaceArg",
  111. :RefBooleanArg => "RefBooleanArg", :ParamsIInterfaceArrTestArg => "ParamsIInterfaceArrTestArg"},
  112. "RubyImplementsIInterfaceInstance" => { :GenericArg => /GenericArg\[IronRuby\.Classes\.Object\$\d{1,3}\]/,
  113. :RefBooleanArg => "RefBooleanArg", :ParamsIInterfaceArrTestArg => "ParamsIInterfaceArrTestArg"},
  114. "ImplementsIInterfaceInstance" => { :GenericArg => "GenericArg[ImplementsIInterface]",
  115. :RefImplementsIInterfaceArg => "RefImplementsIInterfaceArg",
  116. :RefBooleanArg => "RefBooleanArg", :ParamsIInterfaceArrTestArg =>"ParamsIInterfaceArrTestArg"},
  117. "NoArg" => (Hash.new(AE).merge({
  118. :OutStructImplementsIInterfaceArg => "OutStructImplementsIInterfaceArg",
  119. :OutBooleanArg => "OutBooleanArg", :ParamsIInterfaceArrTestArg => "ParamsIInterfaceArrTestArg"}))
  120. }
  121. before(:each) do
  122. @target = ClassWithMethods.new
  123. @target2 = RubyClassWithMethods.new
  124. @values = Helper.args
  125. end
  126. after(:each) do
  127. ClassWithMethods.StaticReset
  128. RubyClassWithMethods.StaticReset
  129. end
  130. @matrix.each do |input, results|
  131. Helper.run_matrix(results, input, @keys)
  132. end
  133. [ClassWithMethods, RubyClassWithMethods].each do |target|
  134. it "binds 'StaticMethodNoArg' for '' with 'StaticMethodNoArg' (#{target})" do
  135. target.StaticMethodNoArg.should == "StaticMethodNoArg"
  136. target.StaticTracker.should == [ nil ]
  137. end
  138. [@target, @target2, Class.new(ClassWithMethods).new, nil].each do |obj|
  139. it "binds 'StaticMethodClassWithMethodsArg' for '#{obj.inspect}' with 'StaticMethodNoArg' (#{target})" do
  140. target.StaticMethodClassWithMethodsArg(obj).should == "StaticMethodClassWithMethodsArg"
  141. end
  142. it "passes the correct input (#{obj.inspect}) into the method 'StaticMethodClassWithMethodsArg'" do
  143. target.StaticMethodClassWithMethodsArg(obj)
  144. target.StaticTracker.should == [obj]
  145. end
  146. end
  147. [1, "", Object.new, CStruct.new, CustomEnum.A, true, false].each do |obj|
  148. it "binds 'StaticMethodClassWithMethodsArg' for '#{obj.inspect}' with 'TypeError' (#{target})" do
  149. lambda {target.send(:StaticMethodClassWithMethodsArg, obj)}.should raise_error TypeError
  150. end
  151. end
  152. end
  153. it "doesn't special case keyword args" do
  154. %w{this self class public}.each do |arg|
  155. [@target, @target2].each do |target|
  156. target.KeywordsArgs(1, target, arg).should == ["KeywordsArgs", arg.upcase]
  157. target.tracker.should == arg.upcase
  158. target.reset
  159. end
  160. end
  161. end
  162. it "binds ref out and regular params correctly" do
  163. %w{RefOutInt32Args RefInt32OutArgs Int32RefOutArgs}.each do
  164. [@target, @target2].each do |target|
  165. target.RefOutInt32Args(1,2).should == ["RefOutInt32Args", 2, 2]
  166. target.tracker.should == [2,2,2]
  167. target.reset
  168. target.RefInt32OutArgs(1,2).should == ["RefInt32OutArgs", 2, 2]
  169. target.tracker.should == [2,2,2]
  170. target.reset
  171. target.Int32RefOutArgs(1,2).should == ["Int32RefOutArgs", 1, 1]
  172. target.tracker.should == [1,1,1]
  173. target.reset
  174. target.RefInt32Int32OutInt32Arg(1,2).should == ["RefInt32Int32OutInt32Arg", 100, 3]
  175. target.tracker.should == [100, 2, 3]
  176. target.reset
  177. end
  178. end
  179. end
  180. it "binds Byte[] and Ref Byte[] methods" do
  181. input = System::Array.of(System::Byte).new(2, System::Byte.new(1))
  182. [@target, @target].each do |target|
  183. target.ByteArrRefByteArrArg(input , System::Array.of(System::Byte).new(2, System::Byte.new(3))).should == ["ByteArrRefByteArrArg", input]
  184. target.tracker.should == [input]
  185. target.reset
  186. end
  187. end
  188. it "binds the proper number of arguments" do
  189. a = [1,2,3,4,5,6,7,8]
  190. 0.upto(6) do |i|
  191. lambda{ @target.send(:EightArgs, *(a[0..i])) }.should raise_error AE
  192. end
  193. lambda { @target.EightArgs }.should raise_error AE
  194. @target.EightArgs(*a).should == "EightArgs"
  195. @target.tracker.should == a
  196. end
  197. end
  198. describe "Generic class methods" do
  199. it "bind correctly" do
  200. target = GenericClassWithMethods.of(Fixnum).new
  201. [100, Bignum.Zero, 4.5].each do |param|
  202. target.GenericArg(param).should == "GenericArg"
  203. target.tracker.should == param.to_i
  204. target.reset
  205. end
  206. end
  207. end
  208. describe "Binding methods" do
  209. #This is a temporary regression until I rewrite these specs.
  210. it "StrongBox works" do
  211. require 'microsoft.scripting.core'
  212. SI = System::Runtime::CompilerServices::StrongBox[Fixnum]
  213. cwm = ClassWithMethods.new
  214. si = SI.new(0)
  215. si.value.should == 0
  216. cwm.RefInt32Arg(si).should == "RefInt32Arg"
  217. si.value.should == 1
  218. end
  219. it "OutNonByRef works" do
  220. cwm = ClassWithMethods.new
  221. lambda {cwm.OutNonByRefInt32Arg}.should raise_error
  222. cwm.OutNonByRefInt32Arg(1).should == 'OutNonByRefInt32Arg'
  223. cwm.tracker.should == [1]
  224. cwm.OutNonByRefInt32Arg(2)
  225. cwm.tracker.should == [1,1]
  226. end
  227. end