PageRenderTime 51ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/test/testCornerCases.rb

https://bitbucket.org/nicksieger/jruby
Ruby | 257 lines | 153 code | 67 blank | 37 comment | 0 complexity | b0b5cc1b62909a39e31642a7fc60038a MD5 | raw file
Possible License(s): GPL-3.0, JSON
  1. require 'test/unit'
  2. class TestClassCornerCases < Test::Unit::TestCase
  3. def setup
  4. super
  5. @cls = Class
  6. @mod = Module
  7. end
  8. class AllocatedClassSubclass < Class.allocate;end
  9. class NewClassSubclass < Class.new;end
  10. def test_class_allocate
  11. assert_nothing_raised{@cls.allocate}
  12. # uninitialized class
  13. assert_raise(TypeError){@cls.allocate.superclass}
  14. # can't instantiate uninitialized class
  15. assert_raise(TypeError){@cls.allocate.new}
  16. # allocator undefined for AllocatedClassSubclass
  17. assert_raise(TypeError){AllocatedClassSubclass.new}
  18. assert_raise(TypeError){AllocatedClassSubclass.allocate}
  19. assert_nothing_raised{@cls.allocate.dup}
  20. assert_nothing_raised{@cls.allocate.clone}
  21. end
  22. def test_class_initialize
  23. @allocated = Class.allocate
  24. assert_nothing_raised{@allocated.send(:initialize, String)}
  25. assert_equal(@allocated.superclass, String)
  26. # already initialized class
  27. assert_raise(TypeError){@allocated.send(:initialize, String)}
  28. end
  29. def test_class_initialize_copy
  30. @allocated = Class.allocate
  31. assert_nothing_raised{@allocated.send(:initialize_copy, String)}
  32. assert_equal(@allocated.superclass, Object)
  33. @allocated = Class.allocate
  34. # initialize_copy should take same class object
  35. assert_raise(TypeError){@allocated.send(:initialize_copy,"")}
  36. end
  37. def test_class_new
  38. assert_nothing_raised{@cls.new.allocate}
  39. assert_nothing_raised{@cls.new(@cls)}
  40. assert_nothing_raised{@cls.new(@mod).new}
  41. # wrong instance allocation
  42. assert_raise(TypeError){@cls.new(@cls).new}
  43. assert_raise(TypeError){@cls.new(@cls).allocate}
  44. # superclass must be a class
  45. assert_raise(TypeError){@cls.new("")}
  46. # wrong intance allocation
  47. assert_raise(TypeError){@cls.dup.new("")}
  48. assert_raise(TypeError){@cls.clone.new("")}
  49. # allocator undefined for #<Class:0x...>
  50. assert_raise(TypeError){@cls.new(@cls.allocate.dup).new}
  51. assert_raise(TypeError){@cls.new(@cls.allocate.clone).new}
  52. assert_nothing_raised{NewClassSubclass.new}
  53. assert_nothing_raised{NewClassSubclass.allocate}
  54. end
  55. def test_singleton_class
  56. o = Object.new
  57. s = class<<Object;self;end
  58. # can't create instance of virtual class
  59. assert_raise(TypeError){s.allocate}
  60. assert_raise(TypeError){s.new}
  61. assert_raise(TypeError){eval "class Class < class<<Object;self;end;end"}
  62. # can't copy singleton class
  63. assert_raise(TypeError){s.dup}
  64. assert_raise(TypeError){s.clone}
  65. # already initialized class (TypeError)
  66. assert_raise(TypeError){s.send(:initialize)}
  67. assert_raise(TypeError){s.send(:initialize_copy,"")}
  68. # can't make subclass of virtual class
  69. assert_raise(TypeError){@cls.new(s)}
  70. end
  71. end
  72. class TestConstantCornerCases < Test::Unit::TestCase
  73. def test_parent_not_changed_on_constant_assignemnt
  74. assert_equal("M::A", eval( <<-EOF
  75. $a=Class.new
  76. module M
  77. A=$a
  78. end
  79. module N
  80. B=$a
  81. end
  82. return N::B.to_s
  83. EOF
  84. ))
  85. end
  86. def teardown
  87. $a = nil
  88. end
  89. end
  90. class TestInheritanceAndReopeningCornerCases < Test::Unit::TestCase
  91. module AModule;end
  92. class AClass;end
  93. def test_class_module_reopen
  94. assert_nothing_raised{eval "module AModule;end"}
  95. assert_nothing_raised{eval "class AClass;end"}
  96. # AModule is not a class
  97. assert_raise(TypeError){eval "class AModule;end"}
  98. # AClass is not a module
  99. assert_raise(TypeError){eval "module AClass;end"}
  100. # superclass mismatch for class AClass
  101. assert_raise(TypeError){eval "class AClass<String;end"}
  102. # superclass must be a Class (Fixnum given)
  103. assert_raise(TypeError){eval "class AClass<1;end"}
  104. end
  105. def test_weird_things_allowed_by_parser
  106. # can't make subclass of virtual class
  107. assert_raise(TypeError){eval "class AClass<class<<self;self;end;end"}
  108. assert_nothing_raised{"class C < Class.new(Class.allocate.dup);end"}
  109. # allocator undefined for C
  110. assert_nothing_raised{"class C < Class.new(Class.allocate.dup);end;C.new"}
  111. end
  112. end
  113. class TestMarshalCornerCases < Test::Unit::TestCase
  114. class AClass;end
  115. OldClass = AClass
  116. class AModule;end
  117. AnInstance = AClass.new
  118. ASingleton = class<<AnInstance;self;end
  119. def setup
  120. end
  121. def marshal_dump(*obj)
  122. Marshal.dump obj
  123. end
  124. def marshal_load(*str)
  125. Marshal.load *str
  126. end
  127. def marshal_dump_and_load(*obj)
  128. Marshal.load(Marshal.dump(obj))
  129. end
  130. def test_marshal_singleton
  131. # can't dump anonymous class #<Class:0x28404fc>
  132. assert_raise(TypeError){marshal_dump Class.new}
  133. assert_raise(TypeError){marshal_dump Class.allocate}
  134. # can't dump anonymous module #<Module:01xcd2e33>
  135. assert_raise(TypeError){marshal_dump Module.allocate}
  136. assert_nothing_raised{marshal_dump Object.new}
  137. assert_nothing_raised{marshal_dump Object.allocate}
  138. assert_nothing_raised{marshal_dump AClass}
  139. # a class that that has a singleton without ivars can be dumped
  140. assert_nothing_raised{marshal_dump AnInstance}
  141. # singleton class can't be dumped
  142. assert_raise(TypeError){marshal_dump ASingleton}
  143. ASingleton.instance_eval{@foo=:blah}
  144. # singleton can't be dumped
  145. assert_raise(TypeError){marshal_dump AnInstance}
  146. end
  147. class AnotherClass;end
  148. module AnotherModule;end
  149. module AnotherModule2;end
  150. $set_class = lambda{|c|AnotherClass=c}
  151. $set_module = lambda{|c|AnotherModule=c}
  152. $set_module2 = lambda{|c|AnotherModule2=c}
  153. def test_incomplete_type_system_unmarshal_sanity
  154. stream = marshal_dump(AnotherClass.new)
  155. #p AnotherClass
  156. $set_class[nil]
  157. # TestMarshalCornerCases::AnotherClass does not refer class/module
  158. assert_raise(TypeError){marshal_load(stream)}
  159. $set_class[Kernel]
  160. # TestMarshalCornerCases::AnotherClass does not refer class
  161. assert_raise(ArgumentError){marshal_load(stream)}
  162. #$set_class[String]
  163. # # dump format error
  164. #assert_raise(ArgumentError){marshal_load(stream)}
  165. stream = marshal_dump(AnotherModule)
  166. $set_module[nil]
  167. # TestMarshalCornerCases::AnotherClass does not refer class/module
  168. assert_raise(TypeError){marshal_load(stream)}
  169. stream = marshal_dump(AnotherModule2)
  170. $set_module2[String]
  171. # TestMarshalCornerCases::AnotherModule2 does not refer module
  172. assert_raise(ArgumentError){marshal_load(stream)}
  173. end
  174. def teardown
  175. $set_class = $set_module = $set_module2 = nil
  176. end
  177. end
  178. class TestBuiltinClassesOverwrittenCornerCases < Test::Unit::TestCase
  179. def test_core_constants_removed_sanity
  180. # we will have to fire a separate runtime here for this
  181. # the runtime should either use Constants cached in runtime or use Ruby.getClassFromPath
  182. # and raise TypeErrors if appropriate
  183. # Object.constants.each{|c|Object.const_set(c, nil) unless ["Object", "Module", "Class"].include? c}
  184. end
  185. end
  186. class TestUninitializedInstanceSanity < Test::Unit::TestCase
  187. def test_uninitialized_core_classe
  188. # core class instance sanity after calling plain #allocate without initialization
  189. end
  190. end