opal 1.8.0.alpha1 → 1.8.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +1 -0
  3. data/README.md +7 -7
  4. data/UNRELEASED.md +14 -0
  5. data/docs/releasing.md +8 -16
  6. data/lib/opal/cli_runners/chrome.rb +5 -1
  7. data/lib/opal/nodes/closure.rb +15 -7
  8. data/lib/opal/nodes/defined.rb +1 -1
  9. data/lib/opal/nodes/literal.rb +10 -6
  10. data/lib/opal/nodes/rescue.rb +1 -1
  11. data/lib/opal/simple_server.rb +2 -2
  12. data/lib/opal/version.rb +1 -1
  13. data/opal/corelib/array.rb +39 -21
  14. data/opal/corelib/class.rb +26 -8
  15. data/opal/corelib/complex.rb +1 -1
  16. data/opal/corelib/constants.rb +2 -2
  17. data/opal/corelib/enumerator/arithmetic_sequence.rb +1 -1
  18. data/opal/corelib/error.rb +10 -0
  19. data/opal/corelib/hash.rb +30 -18
  20. data/opal/corelib/kernel.rb +0 -1
  21. data/opal/corelib/module.rb +44 -5
  22. data/opal/corelib/number.rb +28 -1
  23. data/opal/corelib/range.rb +1 -1
  24. data/opal/corelib/rational.rb +1 -1
  25. data/opal/corelib/runtime.js +124 -42
  26. data/opal/corelib/string.rb +36 -8
  27. data/opal/corelib/struct.rb +1 -1
  28. data/opal/corelib/time.rb +1 -1
  29. data/spec/filters/bugs/array.rb +58 -0
  30. data/spec/filters/bugs/basicobject.rb +7 -0
  31. data/spec/filters/bugs/bigdecimal.rb +1 -2
  32. data/spec/filters/bugs/binding.rb +1 -0
  33. data/spec/filters/bugs/class.rb +2 -3
  34. data/spec/filters/bugs/complex.rb +3 -0
  35. data/spec/filters/bugs/date.rb +5 -2
  36. data/spec/filters/bugs/datetime.rb +1 -0
  37. data/spec/filters/bugs/delegate.rb +1 -2
  38. data/spec/filters/bugs/encoding.rb +1 -1
  39. data/spec/filters/bugs/enumerable.rb +11 -0
  40. data/spec/filters/bugs/enumerator.rb +15 -2
  41. data/spec/filters/bugs/exception.rb +9 -4
  42. data/spec/filters/bugs/file.rb +2 -0
  43. data/spec/filters/bugs/float.rb +1 -0
  44. data/spec/filters/bugs/freeze.rb +5 -49
  45. data/spec/filters/bugs/hash.rb +1 -0
  46. data/spec/filters/bugs/integer.rb +5 -6
  47. data/spec/filters/bugs/kernel.rb +12 -5
  48. data/spec/filters/bugs/language.rb +33 -15
  49. data/spec/filters/bugs/marshal.rb +63 -4
  50. data/spec/filters/bugs/method.rb +2 -10
  51. data/spec/filters/bugs/module.rb +18 -7
  52. data/spec/filters/bugs/objectspace.rb +2 -0
  53. data/spec/filters/bugs/pathname.rb +1 -0
  54. data/spec/filters/bugs/proc.rb +4 -2
  55. data/spec/filters/bugs/random.rb +0 -3
  56. data/spec/filters/bugs/range.rb +1 -1
  57. data/spec/filters/bugs/rational.rb +2 -0
  58. data/spec/filters/bugs/refinement.rb +19 -0
  59. data/spec/filters/bugs/regexp.rb +27 -5
  60. data/spec/filters/bugs/ruby-32.rb +0 -4
  61. data/spec/filters/bugs/set.rb +10 -2
  62. data/spec/filters/bugs/singleton.rb +0 -2
  63. data/spec/filters/bugs/string.rb +140 -1
  64. data/spec/filters/bugs/struct.rb +15 -5
  65. data/spec/filters/bugs/time.rb +56 -2
  66. data/spec/filters/bugs/trace_point.rb +1 -0
  67. data/spec/filters/bugs/unboundmethod.rb +4 -9
  68. data/spec/filters/bugs/warnings.rb +0 -1
  69. data/spec/filters/platform/firefox/exception.rb +3 -3
  70. data/spec/filters/platform/firefox/kernel.rb +1 -0
  71. data/spec/filters/platform/safari/exception.rb +2 -2
  72. data/spec/filters/platform/safari/float.rb +1 -0
  73. data/spec/filters/platform/safari/kernel.rb +1 -0
  74. data/spec/filters/platform/safari/literal_regexp.rb +2 -2
  75. data/spec/filters/unsupported/hash.rb +1 -1
  76. data/spec/lib/compiler_spec.rb +4 -0
  77. data/spec/opal/core/class/clone_spec.rb +36 -0
  78. data/spec/opal/core/object_id_spec.rb +0 -6
  79. data/spec/opal/language/predefined_spec.rb +20 -0
  80. data/spec/opal/language/yield_spec.rb +43 -0
  81. data/spec/ruby_specs +0 -2
  82. data/stdlib/bigdecimal.rb +2 -0
  83. data/stdlib/delegate.rb +3 -4
  84. data/stdlib/pathname.rb +1 -1
  85. data/stdlib/promise/v2.rb +22 -7
  86. data/stdlib/stringio.rb +2 -0
  87. data/tasks/testing.rake +15 -11
  88. data/test/opal/promisev2/test_always.rb +14 -0
  89. data/test/opal/unsupported_and_bugs.rb +0 -8
  90. metadata +10 -6
@@ -1,4 +1,5 @@
1
1
  # backtick_javascript: true
2
+ # use_strict: true
2
3
 
3
4
  require 'corelib/numeric'
4
5
 
@@ -6,6 +7,7 @@ class ::Number < ::Numeric
6
7
  ::Opal.bridge(`Number`, self)
7
8
  `Opal.prop(self.$$prototype, '$$is_number', true)`
8
9
  `self.$$is_number_class = true`
10
+ `var number_id_map = new Map()`
9
11
 
10
12
  class << self
11
13
  def allocate
@@ -36,7 +38,32 @@ class ::Number < ::Numeric
36
38
  end
37
39
 
38
40
  def __id__
39
- `(self * 2) + 1`
41
+ %x{
42
+ // Binary-safe integers
43
+ if (self|0 === self) {
44
+ return (self * 2) + 1;
45
+ }
46
+ else {
47
+ if (number_id_map.has(self)) {
48
+ return number_id_map.get(self);
49
+ }
50
+ var id = Opal.uid();
51
+ number_id_map.set(self, id);
52
+ return id;
53
+ }
54
+ }
55
+ end
56
+
57
+ def hash
58
+ %x{
59
+ // Binary-safe integers
60
+ if (self|0 === self) {
61
+ return #{__id__}
62
+ }
63
+ else {
64
+ return self.toString().$hash();
65
+ }
66
+ }
40
67
  end
41
68
 
42
69
  def +(other)
@@ -315,7 +315,7 @@ class ::Range
315
315
  end
316
316
 
317
317
  def hash
318
- [@begin, @end, @excl].hash
318
+ [::Range, @begin, @end, @excl].hash
319
319
  end
320
320
 
321
321
  alias == eql?
@@ -244,7 +244,7 @@ class ::Rational < ::Numeric
244
244
  end
245
245
 
246
246
  def hash
247
- "Rational:#{@num}:#{@den}"
247
+ [::Rational, @num, @den].hash
248
248
  end
249
249
 
250
250
  def inspect
@@ -119,14 +119,16 @@
119
119
 
120
120
  // @private
121
121
  // Pops an exception from the stack and updates `$!`.
122
- Opal.pop_exception = function() {
122
+ Opal.pop_exception = function(rescued_exception) {
123
123
  var exception = Opal.exceptions.pop();
124
- if (exception) {
124
+ if (exception === rescued_exception) {
125
+ // Current $! is raised in the rescue block, so we don't update it
126
+ }
127
+ else if (exception) {
125
128
  $gvars["!"] = exception;
126
- $gvars["@"] = exception.$backtrace();
127
129
  }
128
130
  else {
129
- $gvars["!"] = $gvars["@"] = nil;
131
+ $gvars["!"] = nil;
130
132
  }
131
133
  };
132
134
 
@@ -152,6 +154,14 @@
152
154
  }
153
155
  }
154
156
 
157
+ // Reuse the same object for performance/memory sake
158
+ var prop_options = {
159
+ value: undefined,
160
+ enumerable: false,
161
+ configurable: true,
162
+ writable: true
163
+ };
164
+
155
165
  function $prop(object, name, initialValue) {
156
166
  if (typeof(object) === "string") {
157
167
  // Special case for:
@@ -163,12 +173,8 @@
163
173
  // numbers, true, false and null do not support it.
164
174
  object[name] = initialValue;
165
175
  } else {
166
- Object.defineProperty(object, name, {
167
- value: initialValue,
168
- enumerable: false,
169
- configurable: true,
170
- writable: true
171
- });
176
+ prop_options.value = initialValue;
177
+ Object.defineProperty(object, name, prop_options);
172
178
  }
173
179
  }
174
180
 
@@ -607,6 +613,7 @@
607
613
  $prop(klass, '$$ancestors', []);
608
614
  $prop(klass, '$$ancestors_cache_version', null);
609
615
  $prop(klass, '$$subclasses', []);
616
+ $prop(klass, '$$cloned_from', []);
610
617
 
611
618
  $prop(klass.$$prototype, '$$class', klass);
612
619
 
@@ -774,6 +781,7 @@
774
781
  $prop(module, '$$own_prepended_modules', []);
775
782
  $prop(module, '$$ancestors', [module]);
776
783
  $prop(module, '$$ancestors_cache_version', null);
784
+ $prop(module, '$$cloned_from', []);
777
785
 
778
786
  $set_proto(module, Opal.Module.prototype);
779
787
 
@@ -1606,15 +1614,22 @@
1606
1614
 
1607
1615
  // Super dispatcher
1608
1616
  Opal.find_super = function(obj, mid, current_func, defcheck, allow_stubs) {
1609
- var jsid = $jsid(mid), ancestors, super_method;
1617
+ var jsid = $jsid(mid), ancestors, ancestor, super_method, method_owner, current_index = -1, i;
1610
1618
 
1611
1619
  ancestors = get_ancestors(obj);
1620
+ method_owner = current_func.$$owner;
1612
1621
 
1613
- var current_index = ancestors.indexOf(current_func.$$owner);
1622
+ for (i = 0; i < ancestors.length; i++) {
1623
+ ancestor = ancestors[i];
1624
+ if (ancestor === method_owner || ancestor.$$cloned_from.indexOf(method_owner) !== -1) {
1625
+ current_index = i;
1626
+ break;
1627
+ }
1628
+ }
1614
1629
 
1615
- for (var i = current_index + 1; i < ancestors.length; i++) {
1616
- var ancestor = ancestors[i],
1617
- proto = ancestor.$$prototype;
1630
+ for (i = current_index + 1; i < ancestors.length; i++) {
1631
+ ancestor = ancestors[i];
1632
+ var proto = ancestor.$$prototype;
1618
1633
 
1619
1634
  if (proto.hasOwnProperty('$$dummy')) {
1620
1635
  proto = proto.$$define_methods_on;
@@ -1662,6 +1677,17 @@
1662
1677
  // @deprecated
1663
1678
  Opal.find_iter_super_dispatcher = Opal.find_block_super;
1664
1679
 
1680
+ function call_lambda(block, arg, ret) {
1681
+ try {
1682
+ block(arg);
1683
+ } catch (e) {
1684
+ if (e === ret) {
1685
+ return ret.$v;
1686
+ }
1687
+ throw e;
1688
+ }
1689
+ }
1690
+
1665
1691
  // handles yield calls for 1 yielded arg
1666
1692
  Opal.yield1 = function(block, arg) {
1667
1693
  if (typeof(block) !== "function") {
@@ -1669,16 +1695,23 @@
1669
1695
  }
1670
1696
 
1671
1697
  var has_mlhs = block.$$has_top_level_mlhs_arg,
1672
- has_trailing_comma = block.$$has_trailing_comma_in_args;
1698
+ has_trailing_comma = block.$$has_trailing_comma_in_args,
1699
+ is_returning_lambda = block.$$is_lambda && block.$$ret;
1673
1700
 
1674
1701
  if (block.length > 1 || ((has_mlhs || has_trailing_comma) && block.length === 1)) {
1675
1702
  arg = Opal.to_ary(arg);
1676
1703
  }
1677
1704
 
1678
1705
  if ((block.length > 1 || (has_trailing_comma && block.length === 1)) && arg.$$is_array) {
1706
+ if (is_returning_lambda) {
1707
+ return call_lambda(block.apply.bind(block, null), arg, block.$$ret);
1708
+ }
1679
1709
  return block.apply(null, arg);
1680
1710
  }
1681
1711
  else {
1712
+ if (is_returning_lambda) {
1713
+ return call_lambda(block, arg, block.$$ret);
1714
+ }
1682
1715
  return block(arg);
1683
1716
  }
1684
1717
  };
@@ -1691,10 +1724,13 @@
1691
1724
 
1692
1725
  if (block.length > 1 && args.length === 1) {
1693
1726
  if (args[0].$$is_array) {
1694
- return block.apply(null, args[0]);
1727
+ args = args[0];
1695
1728
  }
1696
1729
  }
1697
1730
 
1731
+ if (block.$$is_lambda && block.$$ret) {
1732
+ return call_lambda(block.apply.bind(block, null), args, block.$$ret);
1733
+ }
1698
1734
  return block.apply(null, args);
1699
1735
  };
1700
1736
 
@@ -1854,9 +1890,14 @@
1854
1890
  }
1855
1891
 
1856
1892
  // Optimization for a costly operation of prepending '$' to method names
1857
- var jsid_cache = {}
1893
+ var jsid_cache = new Map();
1858
1894
  function $jsid(name) {
1859
- return jsid_cache[name] || (jsid_cache[name] = '$' + name);
1895
+ var jsid = jsid_cache.get(name);
1896
+ if (!jsid) {
1897
+ jsid = '$' + name;
1898
+ jsid_cache.set(name, jsid);
1899
+ }
1900
+ return jsid;
1860
1901
  }
1861
1902
  Opal.jsid = $jsid;
1862
1903
 
@@ -2166,10 +2207,23 @@
2166
2207
 
2167
2208
  // We need a wrapper because otherwise properties
2168
2209
  // would be overwritten on the original body.
2169
- alias = function() {
2170
- var block = alias.$$p, i, ii;
2210
+ alias = Opal.wrapMethodBody(body);
2211
+
2212
+ // Try to make the browser pick the right name
2213
+ alias.displayName = name;
2214
+ alias.$$alias_of = body;
2215
+ alias.$$alias_name = name;
2216
+
2217
+ Opal.defn(obj, id, alias);
2171
2218
 
2172
- alias.$$p = null;
2219
+ return obj;
2220
+ };
2221
+
2222
+ Opal.wrapMethodBody = function(body) {
2223
+ var wrapped = function() {
2224
+ var block = wrapped.$$p;
2225
+
2226
+ wrapped.$$p = null;
2173
2227
 
2174
2228
  return Opal.send(this, body, arguments, block);
2175
2229
  };
@@ -2179,21 +2233,14 @@
2179
2233
  // It doesn't work in older browsers (like Chrome 38), where
2180
2234
  // an exception is thrown breaking Opal altogether.
2181
2235
  try {
2182
- Object.defineProperty(alias, 'length', { value: body.length });
2236
+ Object.defineProperty(wrapped, 'length', { value: body.length });
2183
2237
  } catch (e) {}
2184
2238
 
2185
- // Try to make the browser pick the right name
2186
- alias.displayName = name;
2187
-
2188
- alias.$$arity = body.$$arity == null ? body.length : body.$$arity;
2189
- alias.$$parameters = body.$$parameters;
2190
- alias.$$source_location = body.$$source_location;
2191
- alias.$$alias_of = body;
2192
- alias.$$alias_name = name;
2239
+ wrapped.$$arity = body.$$arity == null ? body.length : body.$$arity;
2240
+ wrapped.$$parameters = body.$$parameters;
2241
+ wrapped.$$source_location = body.$$source_location;
2193
2242
 
2194
- Opal.defn(obj, id, alias);
2195
-
2196
- return obj;
2243
+ return wrapped;
2197
2244
  };
2198
2245
 
2199
2246
  Opal.alias_gvar = function(new_name, old_name) {
@@ -2264,7 +2311,7 @@
2264
2311
  object;
2265
2312
 
2266
2313
  for (var i=0; i<objects.length; i++) {
2267
- object = objects[0];
2314
+ object = objects[i];
2268
2315
  if (key === object || key['$eql?'](object)) {
2269
2316
  hash.set(object, value);
2270
2317
  return;
@@ -2922,6 +2969,20 @@
2922
2969
  return array;
2923
2970
  }
2924
2971
 
2972
+ // Opal32-checksum algorithm for #hash
2973
+ // -----------------------------------
2974
+ Opal.opal32_init = $return_val(0x4f70616c);
2975
+
2976
+ function $opal32_ror(n, d) {
2977
+ return (n << d)|(n >>> (32 - d));
2978
+ };
2979
+
2980
+ Opal.opal32_add = function(hash, next) {
2981
+ hash ^= next;
2982
+ hash = $opal32_ror(hash, 1);
2983
+ return hash;
2984
+ };
2985
+
2925
2986
  // Initialization
2926
2987
  // --------------
2927
2988
  Opal.BasicObject = BasicObject = $allocate_class('BasicObject', null);
@@ -2993,16 +3054,37 @@
2993
3054
  Object.seal(nil);
2994
3055
 
2995
3056
  Opal.thrower = function(type) {
2996
- var thrower = { message: 'unexpected '+type };
2997
- thrower.$thrower_type = type;
2998
- thrower.$throw = function(value) {
2999
- if (value == null) value = nil;
3000
- thrower.$v = value;
3001
- throw thrower;
3002
- };
3057
+ var thrower = {
3058
+ $thrower_type: type,
3059
+ $throw: function(value, called_from_lambda) {
3060
+ if (value == null) value = nil;
3061
+ if (this.is_orphan && !called_from_lambda) {
3062
+ $raise(Opal.LocalJumpError, 'unexpected ' + type, value, type.$to_sym());
3063
+ }
3064
+ this.$v = value;
3065
+ throw this;
3066
+ },
3067
+ is_orphan: false
3068
+ }
3003
3069
  return thrower;
3004
3070
  };
3005
3071
 
3072
+ // Define a "$@" global variable, which would compute and return a backtrace on demand.
3073
+ Object.defineProperty($gvars, "@", {
3074
+ enumerable: true,
3075
+ configurable: true,
3076
+ get: function() {
3077
+ if ($truthy($gvars["!"])) return $gvars["!"].$backtrace();
3078
+ return nil;
3079
+ },
3080
+ set: function(bt) {
3081
+ if ($truthy($gvars["!"]))
3082
+ $gvars["!"].$set_backtrace(bt);
3083
+ else
3084
+ $raise(Opal.ArgumentError, "$! not set");
3085
+ }
3086
+ });
3087
+
3006
3088
  Opal.t_eval_return = Opal.thrower("return");
3007
3089
 
3008
3090
  TypeError.$$super = Error;
@@ -1,4 +1,4 @@
1
- # helpers: coerce_to, respond_to, global_multiline_regexp, prop
1
+ # helpers: coerce_to, respond_to, global_multiline_regexp, prop, opal32_init, opal32_add
2
2
  # backtick_javascript: true
3
3
 
4
4
  require 'corelib/comparable'
@@ -9,11 +9,43 @@ class ::String < `String`
9
9
 
10
10
  %x{
11
11
  Opal.prop(#{self}.$$prototype, '$$is_string', true);
12
+
13
+ var string_id_map = new Map();
12
14
  }
13
15
 
14
- def __id__
15
- `self.toString()`
16
- end
16
+ # Force strict mode to suppress autoboxing of `this`
17
+ %x{
18
+ (function() {
19
+ 'use strict';
20
+ #{
21
+ def __id__
22
+ %x{
23
+ if (typeof self === 'object') {
24
+ return #{super}
25
+ }
26
+ if (string_id_map.has(self)) {
27
+ return string_id_map.get(self);
28
+ }
29
+ var id = Opal.uid();
30
+ string_id_map.set(self, id);
31
+ return id;
32
+ }
33
+ end
34
+
35
+ def hash
36
+ %x{
37
+ var hash = $opal32_init(), i, length = self.length;
38
+ hash = $opal32_add(hash, 0x5);
39
+ hash = $opal32_add(hash, length);
40
+ for (i = 0; i < length; i++) {
41
+ hash = $opal32_add(hash, self.charCodeAt(i));
42
+ }
43
+ return hash;
44
+ }
45
+ end
46
+ }
47
+ })();
48
+ }
17
49
 
18
50
  def self.try_convert(what)
19
51
  ::Opal.coerce_to?(what, ::String, :to_str)
@@ -562,10 +594,6 @@ class ::String < `String`
562
594
  }
563
595
  end
564
596
 
565
- def hash
566
- `self.toString()`
567
- end
568
-
569
597
  def hex
570
598
  to_i 16
571
599
  end
@@ -130,7 +130,7 @@ class ::Struct
130
130
  end
131
131
 
132
132
  def hash
133
- Hash.new(`self.$$data`).hash
133
+ [self.class, to_a].hash
134
134
  end
135
135
 
136
136
  def [](name)
data/opal/corelib/time.rb CHANGED
@@ -389,7 +389,7 @@ class ::Time < `Date`
389
389
  end
390
390
 
391
391
  def hash
392
- `'Time:' + self.getTime()`
392
+ [::Time, `self.getTime()`].hash
393
393
  end
394
394
 
395
395
  def inspect
@@ -7,32 +7,90 @@ opal_filter "Array" do
7
7
  fails "Array#[] raises TypeError if to_int returns non-integer" # Expected TypeError but no exception was raised ([1, 2, 3, 4] was returned)
8
8
  fails "Array#[] raises a RangeError if passed a range with a bound that is too large" # Expected RangeError but no exception was raised (nil was returned)
9
9
  fails "Array#[] raises a type error if a range is passed with a length" # Expected TypeError but no exception was raised ([2, 3] was returned)
10
+ fails "Array#all? ignores the block if there is an argument" # Expected warning to match: /given block not used/ but got: ""
11
+ fails "Array#all? tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
12
+ fails "Array#any? when given a pattern argument ignores the block if there is an argument" # Expected warning to match: /given block not used/ but got: ""
13
+ fails "Array#any? with a block given tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
14
+ fails "Array#collect tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
15
+ fails "Array#collect! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
16
+ fails "Array#count when a block argument given tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
17
+ fails "Array#delete_if tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
10
18
  fails "Array#drop raises a TypeError when the passed argument isn't an integer and #to_int returns non-Integer" # Expected TypeError but no exception was raised ([1, 2] was returned)
19
+ fails "Array#drop_while tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
11
20
  fails "Array#each does not yield elements deleted from the end of the array" # Expected [2, 3, nil] == [2, 3] to be truthy but was false
21
+ fails "Array#each tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
12
22
  fails "Array#each yields each element to the block even if the array is changed during iteration" # Expected [1, 2, 3, 4, 5] == [1, 2, 3, 4, 5, 7, 9] to be truthy but was false
13
23
  fails "Array#each yields elements added to the end of the array by the block" # Expected [2] == [2, 0, 0] to be truthy but was false
14
24
  fails "Array#each yields elements based on an internal index" # NoMethodError: undefined method `even?' for nil
15
25
  fails "Array#each yields only elements that are still in the array" # NoMethodError: undefined method `even?' for nil
16
26
  fails "Array#each yields the same element multiple times if inserting while iterating" # Expected [1, 1] == [1, 1, 2] to be truthy but was false
27
+ fails "Array#each_index tolerates increasing an array size during iteration" # Expected [0, 1, 2] == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102] to be truthy but was false
17
28
  fails "Array#fill with (filler, index, length) raises a TypeError when the length is not numeric" # Expected TypeError (/no implicit conversion of Symbol into Integer/) but got: TypeError (no implicit conversion of String into Integer)
18
29
  fails "Array#fill with (filler, range) works with endless ranges" # Expected [1, 2, 3, 4] == [1, 2, 3, "x"] to be truthy but was false
19
30
  fails "Array#filter returns a new array of elements for which block is true" # Expected [1] == [1, 4, 6] to be truthy but was false
31
+ fails "Array#filter tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
32
+ fails "Array#filter! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
33
+ fails "Array#find_index tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
20
34
  fails "Array#flatten does not call #to_ary on elements beyond the given level" # Mock '1' expected to receive to_ary("any_args") exactly 0 times but received it 1 times
21
35
  fails "Array#flatten performs respond_to? and method_missing-aware checks when coercing elements to array" # NoMethodError: undefined method `respond_to?' for #<BasicObject:0x2698>
22
36
  fails "Array#flatten with a non-Array object in the Array calls #method_missing if defined" # Expected [#<MockObject:0x2730 @name="Array#flatten", @null=nil>] == [1, 2, 3] to be truthy but was false
37
+ fails "Array#index tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
38
+ fails "Array#initialize with no arguments does not use the given block" # Expected warning to match: /ruby\/core\/array\/initialize_spec.rb:57: warning: given block not used/ but got: ""
23
39
  fails "Array#inspect does not call #to_str on the object returned from #to_s when it is not a String" # Exception: Cannot convert object to primitive value
40
+ fails "Array#intersect? tries to convert the passed argument to an Array using #to_ary" # Expected false == true to be truthy but was false
41
+ fails "Array#keep_if tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
42
+ fails "Array#map tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
43
+ fails "Array#map! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
44
+ fails "Array#none? ignores the block if there is an argument" # Expected warning to match: /given block not used/ but got: ""
45
+ fails "Array#none? tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
46
+ fails "Array#one? ignores the block if there is an argument" # Expected warning to match: /given block not used/ but got: ""
47
+ fails "Array#one? tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
48
+ fails "Array#pack with format 'A' ignores comments in the format string" # RuntimeError: Unsupported pack directive "m" (no chunk reader defined)
49
+ fails "Array#pack with format 'A' warns that a directive is unknown" # Expected warning to match: /unknown pack directive 'R'/ but got: ""
50
+ fails "Array#pack with format 'C' ignores comments in the format string" # RuntimeError: Unsupported pack directive "m" (no chunk reader defined)
51
+ fails "Array#pack with format 'C' warns that a directive is unknown" # Expected warning to match: /unknown pack directive 'R'/ but got: ""
52
+ fails "Array#pack with format 'L' ignores comments in the format string" # RuntimeError: Unsupported pack directive "m" (no chunk reader defined)
53
+ fails "Array#pack with format 'L' warns that a directive is unknown" # Expected warning to match: /unknown pack directive 'R'/ but got: ""
54
+ fails "Array#pack with format 'U' ignores comments in the format string" # RuntimeError: Unsupported pack directive "m" (no chunk reader defined)
55
+ fails "Array#pack with format 'U' warns that a directive is unknown" # Expected warning to match: /unknown pack directive 'R'/ but got: ""
56
+ fails "Array#pack with format 'a' ignores comments in the format string" # RuntimeError: Unsupported pack directive "m" (no chunk reader defined)
57
+ fails "Array#pack with format 'a' warns that a directive is unknown" # Expected warning to match: /unknown pack directive 'R'/ but got: ""
58
+ fails "Array#pack with format 'c' ignores comments in the format string" # RuntimeError: Unsupported pack directive "m" (no chunk reader defined)
59
+ fails "Array#pack with format 'c' warns that a directive is unknown" # Expected warning to match: /unknown pack directive 'R'/ but got: ""
60
+ fails "Array#pack with format 'l' ignores comments in the format string" # RuntimeError: Unsupported pack directive "m" (no chunk reader defined)
61
+ fails "Array#pack with format 'l' warns that a directive is unknown" # Expected warning to match: /unknown pack directive 'R'/ but got: ""
24
62
  fails "Array#pack with format 'u' calls #to_str to convert an Object to a String" # Mock 'pack u string' expected to receive to_str("any_args") exactly 1 times but received it 0 times
63
+ fails "Array#pack with format 'u' ignores comments in the format string" # RuntimeError: Unsupported pack directive "u" (no chunk reader defined)
64
+ fails "Array#pack with format 'u' warns that a directive is unknown" # RuntimeError: Unsupported pack directive "u" (no chunk reader defined)
25
65
  fails "Array#pack with format 'u' will not implicitly convert a number to a string" # Expected TypeError but got: RuntimeError (Unsupported pack directive "u" (no chunk reader defined))
26
66
  fails "Array#partition returns in the left array values for which the block evaluates to true" # Expected [[0], [1, 2, 3, 4, 5]] == [[0, 1, 2], [3, 4, 5]] to be truthy but was false
67
+ fails "Array#product returns converted arguments using :method_missing" # TypeError: no implicit conversion of ArraySpecs::ArrayMethodMissing into Array
27
68
  fails "Array#rassoc calls elem == obj on the second element of each contained array" # Expected [1, "foobar"] == [2, #<MockObject:0x4a6b4 @name="foobar", @null=nil>] to be truthy but was false
28
69
  fails "Array#rassoc does not check the last element in each contained but specifically the second" # Expected [1, "foobar", #<MockObject:0x4a37e @name="foobar", @null=nil>] == [2, #<MockObject:0x4a37e @name="foobar", @null=nil>, 1] to be truthy but was false
70
+ fails "Array#reject tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
71
+ fails "Array#reject! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
72
+ fails "Array#reverse_each tolerates increasing an array size during iteration" # Expected ["c", "b", "a"] == ["c", "a", 1] to be truthy but was false
29
73
  fails "Array#sample returns nil for an empty array when called without n and a Random is given" # ArgumentError: invalid argument - 0
30
74
  fails "Array#select returns a new array of elements for which block is true" # Expected [1] == [1, 4, 6] to be truthy but was false
75
+ fails "Array#select tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
76
+ fails "Array#select! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
77
+ fails "Array#shuffle! matches CRuby with random:" # Expected [7, 4, 5, 0, 3, 9, 2, 8, 10, 1, 6] == [2, 6, 8, 5, 7, 10, 3, 1, 0, 4, 9] to be truthy but was false
78
+ fails "Array#shuffle! matches CRuby with srand" # Expected ["d", "j", "g", "f", "i", "e", "c", "k", "b", "h", "a"] == ["a", "e", "f", "h", "i", "j", "d", "b", "g", "k", "c"] to be truthy but was false
31
79
  fails "Array#slice can be sliced with Enumerator::ArithmeticSequence has endless range with start outside of array's bounds" # Expected [] == nil to be truthy but was false
32
80
  fails "Array#slice can be sliced with Enumerator::ArithmeticSequence has range with bounds outside of array" # Expected RangeError but no exception was raised ([0, 2, 4] was returned)
33
81
  fails "Array#slice raises TypeError if to_int returns non-integer" # Expected TypeError but no exception was raised ([1, 2, 3, 4] was returned)
34
82
  fails "Array#slice raises a RangeError if passed a range with a bound that is too large" # Expected RangeError but no exception was raised (nil was returned)
35
83
  fails "Array#slice raises a type error if a range is passed with a length" # Expected TypeError but no exception was raised ([2, 3] was returned)
84
+ fails "Array#sort_by! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
85
+ fails "Array#sum calls + on the init value" # NoMethodError: undefined method `-' for #<MockObject:0x7f7c2 @name="b" @null=nil>
86
+ fails "Array#sum tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
87
+ fails "Array#take_while tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
88
+ fails "Array#to_h tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
36
89
  fails "Array#to_s does not call #to_str on the object returned from #to_s when it is not a String" # Exception: Cannot convert object to primitive value
90
+ fails "Array#uniq tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
37
91
  fails "Array#uniq! properly handles recursive arrays" # Expected [1, "two", 3, [...], [...], [...]] == [1, "two", 3, [1, "two", 3, [...], [...], [...]]] to be truthy but was false
92
+ fails "Array#uniq! tolerates increasing an array size during iteration" # Expected [1, 2, 3] == [1, 2, 3, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] to be truthy but was false
93
+ fails "Array#zip raises TypeError when some argument isn't Array and doesn't respond to #to_ary and #to_enum" # Expected TypeError (wrong argument type Object (must respond to :each)) but got: NoMethodError (undefined method `each' for #<Object:0x6273e>)
94
+ fails "Array.new with no arguments does not use the given block" # Expected warning to match: /warning: given block not used/ but got: ""
95
+ fails "Array.try_convert sends #to_ary to the argument and raises TypeError if it's not a kind of Array" # Expected TypeError (can't convert MockObject to Array (MockObject#to_ary gives Object)) but got: TypeError (can't convert MockObject into Array (MockObject#to_ary gives Object))
38
96
  end
@@ -2,6 +2,12 @@
2
2
  opal_filter "BasicObject" do
3
3
  fails "BasicObject raises NoMethodError for nonexistent methods after #method_missing is removed" # NoMethodError: undefined method `tmp' for #<MSpecEnv:0xb5dc8>
4
4
  fails "BasicObject#initialize does not accept arguments" # NoMethodError: undefined method `class' for #<BasicObject:0x99f0>
5
+ fails "BasicObject#instance_eval class variables lookup does not have access to class variables in the receiver class when called with a String" # Expected NameError (/uninitialized class variable @@cvar/) but no exception was raised ("value_defined_in_receiver_scope" was returned)
6
+ fails "BasicObject#instance_eval class variables lookup gets class variables in the caller class when called with a String" # Expected "value_defined_in_receiver_scope" == "value_defined_in_caller_scope" to be truthy but was false
7
+ fails "BasicObject#instance_eval class variables lookup sets class variables in the caller class when called with a String" # NameError: uninitialized class variable @@cvar in BasicObjectSpecs::InstEval::CVar::Set::CallerScope
8
+ fails "BasicObject#instance_eval constants lookup when a String given looks in the caller class next" # Expected "ReceiverParent" == "Caller" to be truthy but was false
9
+ fails "BasicObject#instance_eval constants lookup when a String given looks in the caller outer scopes next" # Expected "ReceiverParent" == "CallerScope" to be truthy but was false
10
+ fails "BasicObject#instance_eval constants lookup when a String given looks in the receiver singleton class first" # Expected "Receiver" == "singleton_class" to be truthy but was false
5
11
  fails "BasicObject#instance_eval converts filename argument with #to_str method" # Expected "<internal" == "file.rb" to be truthy but was false
6
12
  fails "BasicObject#instance_eval converts lineno argument with #to_int method" # Expected "corelib/kernel.rb>" == "15" to be truthy but was false
7
13
  fails "BasicObject#instance_eval converts string argument with #to_str method" # NoMethodError: undefined method `encoding' for #<Object:0x72810>
@@ -10,6 +16,7 @@ opal_filter "BasicObject" do
10
16
  fails "BasicObject#instance_eval has access to the caller's local variables" # Expected nil == "value" to be truthy but was false
11
17
  fails "BasicObject#instance_eval raises ArgumentError if returned value is not Integer" # Expected TypeError (/can't convert Object to Integer/) but got: RuntimeError ()
12
18
  fails "BasicObject#instance_eval raises ArgumentError if returned value is not String" # Expected TypeError (/can't convert Object to String/) but got: NoMethodError (undefined method `encoding' for #<Object:0x72a4a>)
19
+ fails "BasicObject#instance_eval raises TypeError for frozen objects when tries to set receiver's instance variables" # Expected FrozenError (can't modify frozen NilClass: nil) but no exception was raised (42 was returned)
13
20
  fails "BasicObject#instance_eval raises an ArgumentError when a block and normal arguments are given" # Expected ArgumentError (wrong number of arguments (given 2, expected 0)) but got: ArgumentError (wrong number of arguments (2 for 0))
14
21
  fails "BasicObject#instance_eval raises an ArgumentError when more than 3 arguments are given" # Expected ArgumentError (wrong number of arguments (given 4, expected 1..3)) but got: ArgumentError (wrong number of arguments (0 for 1..3))
15
22
  fails "BasicObject#instance_eval raises an ArgumentError when no arguments and no block are given" # Expected ArgumentError (wrong number of arguments (given 0, expected 1..3)) but got: ArgumentError (wrong number of arguments (0 for 1..3))
@@ -5,7 +5,6 @@ opal_filter "BigDecimal" do
5
5
  fails "BidDecimal#hash two BigDecimal objects with the same value should have the same hash for infinite values" # Expected 27530 == 27534 to be truthy but was false
6
6
  fails "BidDecimal#hash two BigDecimal objects with the same value should have the same hash for ordinary values" # Expected 27574 == 27578 to be truthy but was false
7
7
  fails "BidDecimal#hash two BigDecimal objects with the same value should have the same hash for zero values" # Expected 27442 == 27446 to be truthy but was false
8
- fails "BigDecimal constants defines a VERSION value" # Expected false to be true
9
8
  fails "BigDecimal constants exception-related constants has a EXCEPTION_ALL value" # NameError: uninitialized constant BigDecimal::EXCEPTION_ALL
10
9
  fails "BigDecimal constants exception-related constants has a EXCEPTION_INFINITY value" # NameError: uninitialized constant BigDecimal::EXCEPTION_INFINITY
11
10
  fails "BigDecimal constants exception-related constants has a EXCEPTION_NaN value" # NameError: uninitialized constant BigDecimal::EXCEPTION_NaN
@@ -176,7 +175,7 @@ opal_filter "BigDecimal" do
176
175
  fails "BigDecimal#to_s can use conventional floating point notation" # NoMethodError: undefined method `default_internal' for Encoding
177
176
  fails "BigDecimal#to_s can use engineering notation" # NoMethodError: undefined method `default_internal' for Encoding
178
177
  fails "BigDecimal#to_s does not add an exponent for zero values" # NoMethodError: undefined method `default_internal' for Encoding
179
- fails "BigDecimal#to_s inserts a space every n chars, if integer n is supplied" # NoMethodError: undefined method `default_internal' for Encoding
178
+ fails "BigDecimal#to_s inserts a space every n chars to fraction part, if integer n is supplied" # NoMethodError: undefined method `default_internal' for Encoding
180
179
  fails "BigDecimal#to_s removes trailing spaces in floating point notation" # NoMethodError: undefined method `default_internal' for Encoding
181
180
  fails "BigDecimal#to_s return type is of class String" # NoMethodError: undefined method `default_internal' for Encoding
182
181
  fails "BigDecimal#to_s returns a String in US-ASCII encoding when Encoding.default_internal is nil" # NoMethodError: undefined method `default_internal' for Encoding
@@ -23,4 +23,5 @@ opal_filter "Binding" do
23
23
  fails "Binding#local_variables includes local variables defined after calling binding.local_variables" # Expected [] == ["a", "b"] to be truthy but was false
24
24
  fails "Binding#local_variables includes local variables of inherited scopes and eval'ed context" # Expected ["c"] == ["c", "a", "b", "p"] to be truthy but was false
25
25
  fails "Binding#local_variables includes new variables defined in the binding" # Expected ["b"] == ["a", "b"] to be truthy but was false
26
+ fails "Binding#source_location works for eval with a given line" # Expected ["foo", 1] == ["foo", 100] to be truthy but was false
26
27
  end
@@ -1,13 +1,12 @@
1
1
  # NOTE: run bin/format-filters after changing this file
2
2
  opal_filter "Class" do
3
3
  fails "Class#allocate raises TypeError for #superclass" # Expected TypeError but no exception was raised (nil was returned)
4
- fails "Class#dup duplicates both the class and the singleton class" # Exception: self.$$constructor is not a constructor
5
- fails "Class#dup retains an included module in the ancestor chain for the singleton class" # NoMethodError: undefined method `hello' for #<Module:0x402e6>
6
- fails "Class#dup retains the correct ancestor chain for the singleton class" # Exception: self.$$constructor is not a constructor
4
+ fails "Class#dup raises TypeError if called on BasicObject" # Expected TypeError (can't copy the root class) but got: Exception (Cannot read properties of null (reading '$$is_number'))
7
5
  fails "Class#initialize raises a TypeError when called on BasicObject" # Expected TypeError but no exception was raised (nil was returned)
8
6
  fails "Class#initialize raises a TypeError when called on already initialized classes" # Expected TypeError but no exception was raised (nil was returned)
9
7
  fails "Class#initialize when given the Class raises a TypeError" # Expected TypeError but got: ArgumentError ([.initialize] wrong number of arguments (given 1, expected 0))
10
8
  fails "Class#new uses the internal allocator and does not call #allocate" # RuntimeError: allocate should not be called
9
+ fails "Class#subclasses works when creating subclasses concurrently" # NotImplementedError: Thread creation not available
11
10
  fails "Class.new raises a TypeError if passed a metaclass" # Expected TypeError but no exception was raised (#<Class:0x34cae> was returned)
12
11
  fails_badly "Class#descendants returns a list of classes descended from self (excluding self)" # GC/Spec order issue. Expected [#<Class:0x2e77c>, #<Class:0x2e79a>, #<Class:0x37368>, ModuleSpecs::Child, ModuleSpecs::Child2, ModuleSpecs::Grandchild] == [ModuleSpecs::Child, ModuleSpecs::Child2, ModuleSpecs::Grandchild] to be truthy but was false
13
12
  fails_badly "Class#subclasses returns a list of classes directly inheriting from self" # GC/Spec order issue. Expected [#<Class:0x2e77c>, #<Class:0x2e79a>, #<Class:0x37368>, ModuleSpecs::Child, ModuleSpecs::Child2] == [ModuleSpecs::Child, ModuleSpecs::Child2] to be truthy but was false