1require 'test/unit' 2 3class TestRubyPrimitive < Test::Unit::TestCase 4 5 def test_not 6 assert_equal false, !true 7 assert_equal true, !false 8 assert_equal true, !nil 9 assert_equal false, !(1+1) 10 assert_equal false, !!nil 11 assert_equal true, !!1 12 end 13 14 def test_lvar 15 a = 1 16 assert_equal 1, a 17 b = 2 18 assert_equal 1, a 19 a = b = 3 20 assert_equal 3, a 21 assert_equal 3, b 22 a = b = c = 4 23 assert_equal 4, a 24 assert_equal 4, b 25 assert_equal 4, c 26 end 27 28 C = 1 29 class A 30 Const = 1 31 class B 32 Const = 2 33 class C 34 Const = 3 35 def const 36 Const 37 end 38 end 39 end 40 end 41 (1..2).map { 42 A::B::C::Const 43 } 44 45 def test_constant 46 assert_equal 1, C 47 assert_equal 1, C 48 assert_equal 1, A::Const 49 assert_equal 2, A::B::Const 50 assert_equal 3, A::B::C::Const 51 assert_equal 3, A::B::C.new.const 52 assert_equal 1, ::TestRubyPrimitive::A::Const 53 A::B::C.send(:remove_const, :Const) 54 assert_equal 2, A::B::C.new.const 55 assert_raise(TypeError) { 56 C::CONST 57 } 58 end 59 60 class A2 61 class B2 62 class C2 63 C = 7 64 end 65 end 66 end 67 68 def test_constant_cache 69 i = 0 70 while i < 3 71 r = A2::B2::C2::C 72 i += 1 73 end 74 assert_equal 7, r 75 end 76 77 class A3 78 class B3 79 C = 99 80 end 81 end 82 i = 0 83 while i < 3 84 r = A3::B3::C # cache 85 class A3::B3 86 remove_const :C 87 end 88 A3::B3::C = i ** i 89 i += 1 90 end 91 92 def test_constant_cache2 93 assert_equal 4, A3::B3::C 94 end 95 96 class A4 97 Const = 7 98 (1..3).map { 99 $test_ruby_primitive_constant_cache3 = self::Const 100 } 101 end 102 103 def test_constant_cache3 104 assert_equal 7, $test_ruby_primitive_constant_cache3 105 end 106 107 class A5 108 Const = 8 109 (1..3).map { 110 $test_ruby_primitive_constant_cache4 = eval('self')::Const 111 } 112 end 113 114 def test_constatant_cache4 115 assert_equal 8, $test_ruby_primitive_constant_cache4 116 end 117 118 class A6 119 Const = 0 120 def self.foo 121 self::Const 122 end 123 end 124 class B6 < A6 125 Const = 1 126 end 127 class C6 < B6 128 Const = 2 129 end 130 $test_ruby_primitive_constant_cache5 = [A6.foo, B6.foo, C6.foo] 131 132 def test_constant_cache5 133 assert_equal [0, 1, 2], $test_ruby_primitive_constant_cache5 134 end 135 136 def test_gvar 137 $test_ruby_primitive_gvar = 7 138 assert_equal 7, $test_ruby_primitive_gvar 139 assert_equal 7, $test_ruby_primitive_gvar 140 $test_ruby_primitive_gvar = 88 141 assert_equal 88, $test_ruby_primitive_gvar 142 assert_equal 88, $test_ruby_primitive_gvar 143 assert_equal 7, ($test_ruby_primitive_gvar = 7) 144 assert_equal 7, ($test_ruby_primitive_gvar = 7) 145 end 146 147 class A7 148 @@c = 1 149 def m 150 @@c += 1 151 end 152 end 153 154 def test_cvar_from_instance_method 155 assert_equal 2, A7.new.m 156 assert_equal 3, A7.new.m 157 assert_equal 4, A7.new.m 158 end 159 160 class A8 161 @@c = 1 162 class << self 163 def m 164 @@c += 1 165 end 166 end 167 end 168 169 def test_cvar_from_singleton_method 170 assert_equal 2, A8.m 171 assert_equal 3, A8.m 172 assert_equal 4, A8.m 173 end 174 175 class A9 176 @@c = 1 177 def self.m 178 @@c += 1 179 end 180 end 181 182 def test_cvar_from_singleton_method2 183 assert_equal 2, A9.m 184 assert_equal 3, A9.m 185 assert_equal 4, A9.m 186 end 187 188 class A10 189 attr_accessor :a 190 end 191 192 def test_opassign 193 i = 0 194 i += 1 195 assert_equal 1, i 196 197 @iv = 2 198 @iv += 2 199 assert_equal 4, @iv 200 201 @@cv ||= 1 202 assert_equal 1, @@cv 203 @@cv &&= 2 204 assert_equal 2, @@cv 205 @@cv ||= 99 206 assert_equal 2, @@cv 207 208 $gv = 3 209 $gv += 4 210 assert_equal 7, $gv 211 212 obj = A10.new 213 obj.a = 9 214 obj.a &&= 7 215 assert_equal 7, obj.a 216 217 obj.a = nil 218 obj.a ||= 2 219 assert_equal 2, obj.a 220 221 obj.a &&= 3 222 assert_equal 3, obj.a 223 224 a = [] 225 a[0] ||= 3 226 assert_equal 3, a[0] 227 a[0] &&= 7 228 assert_equal 7, a[0] 229 a[0] ||= 3 230 assert_equal 7, a[0] 231 232 a = [0, 1, nil, 3, 4] 233 a[*[2]] ||= :foo 234 assert_equal [0, 1, :foo, 3, 4], a 235 a[*[1,3]] &&= [:bar] 236 assert_equal [0, :bar, 4], a 237 end 238 239 def test_opassign_and_or 240 a = 1 241 a ||= 2 242 assert_equal 1, a 243 a = nil 244 a ||= 2 245 assert_equal 2, a 246 a = 1 247 a &&= 3 248 assert_equal 3, a 249 a = nil 250 a &&= 4 251 assert_nil a 252 253 h = {} 254 h[0] ||= 1 255 assert_equal 1, h[0] 256 h = {} 257 h[0] &&= 1 258 assert_nil h[0] 259 h = {0 => 7} 260 h[0] ||= 1 261 assert_equal 7, h[0] 262 h = {0 => 7} 263 h[0] &&= 1 264 assert_equal 1, h[0] 265 end 266 267 def test_backref 268 /a(b)(c)d/ =~ 'xyzabcdefgabcdefg' 269 assert_equal 'b', $1 270 assert_equal 'c', $2 271 assert_nil $3 272 assert_instance_of MatchData, $~ 273 assert_equal 'abcd', $& 274 assert_equal 'xyz', $` 275 assert_equal 'efgabcdefg', $' 276 assert_equal 'c', $+ 277 278 /(?!)/ =~ 'xyzabcdefgabcdefg' 279 assert_nil $1 280 assert_nil $2 281 assert_nil $3 282 assert_nil $~ 283 assert_nil $& 284 assert_nil $` 285 assert_nil $' 286 assert_nil $+ 287 end 288 289 def test_fact 290 assert_equal 306057512216440636035370461297268629388588804173576999416776741259476533176716867465515291422477573349939147888701726368864263907759003154226842927906974559841225476930271954604008012215776252176854255965356903506788725264321896264299365204576448830388909753943489625436053225980776521270822437639449120128678675368305712293681943649956460498166450227716500185176546469340112226034729724066333258583506870150169794168850353752137554910289126407157154830282284937952636580145235233156936482233436799254594095276820608062232812387383880817049600000000000000000000000000000000000000000000000000000000000000000000000000, fact(300) 291 end 292 293 def fact(n) 294 if n > 1 295 n * fact(n - 1) 296 else 297 1 298 end 299 end 300 301 def test_mul 302 assert_equal 0, 2 * 0 303 assert_equal 0, 0 * 2 304 assert_equal 4, 2 * 2 305 end 306 307 class MyNum 308 def /(a) 309 a * 100 310 end 311 end 312 313 def test_div 314 assert_equal 1, 3 / 2 315 assert_equal 1.5, 3.0 / 2.0 316 assert_equal 300, MyNum.new / 3 317 end 318 319 class MyArr 320 def length 321 'string' 322 end 323 end 324 325 def test_length 326 assert_equal 0, [].length 327 assert_equal 1, [1].length 328 assert_equal 2, [1,2].length 329 assert_equal 0, {}.length 330 assert_equal 1, {1=>1}.length 331 assert_equal 2, {1=>1, 2=>2}.length 332 assert_equal 'string', MyArr.new.length 333 end 334 335 class MyNum2 336 def %(a) 337 a * 100 338 end 339 end 340 341 def test_mod 342 assert_equal 2, 5 % 3 343 assert_equal 1.0, 3.0 % 2.0 344 assert_equal 300, MyNum2.new % 3 345 end 346 347 class MyObj 348 def [](*args) 349 args 350 end 351 352 def []=(*args) 353 args 354 end 355 end 356 357 def test_aref 358 a = [0,1] 359 assert_equal 0, a[0] 360 assert_equal 1, a[1] 361 assert_nil a[2] 362 h = {0=>0, 1=>1} 363 obj = MyObj.new 364 assert_equal 0, h[0] 365 assert_equal 1, h[1] 366 assert_nil h[2] 367 assert_equal [0], obj[0] 368 assert_equal [0,1], obj[0,1] 369 assert_equal [0,1,2], obj[0,1,2] 370 end 371 372 def test_aset 373 obj = MyObj.new 374 assert_equal 7, (obj[0] = 7) 375 assert_equal 7, (obj[0,1] = 7) 376 assert_equal 7, (obj[0,1,2] = 7) 377 end 378 379 class MyObj2 380 def attr=(*args) 381 args 382 end 383 end 384 385 def test_attr_setter 386 obj = MyObj2.new 387 assert_equal 1, (obj.attr = 1) 388 end 389 390 def test_list_expand 391 a = [] 392 assert_equal [0], [0, *a] 393 a = [1] 394 assert_equal [0,1], [0, *a] 395 a = [1,2] 396 assert_equal [0,1,2], [0, *a] 397 a = [1,2,3] 398 assert_equal [0,1,2,3], [0, *a] 399 #a = [1,2,3] 400 #assert_equal [0,1,2,3,4], [0, *a, 4] 401 end 402 403 def test_concatarray_ruby_dev_41933 404 bug3658 = '[ruby-dev:41933]' 405 [0, *x=1] 406 assert_equal(1, x, bug3658) 407 [0, *x=1, 2] 408 assert_equal(1, x, bug3658) 409 class << (x = Object.new) 410 attr_accessor :to_a_called 411 def to_a 412 @to_a_called = true 413 [self] 414 end 415 end 416 x.to_a_called = false 417 [0, *x] 418 assert(x.to_a_called, bug3658) 419 x.to_a_called = false 420 [0, *x, 2] 421 assert(x.to_a_called, bug3658) 422 end 423end 424