jsi 0.4.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/CHANGELOG.md +15 -0
  4. data/README.md +105 -38
  5. data/lib/jsi/base.rb +349 -155
  6. data/lib/jsi/jsi_coder.rb +5 -4
  7. data/lib/jsi/metaschema_node/bootstrap_schema.rb +100 -0
  8. data/lib/jsi/metaschema_node.rb +156 -129
  9. data/lib/jsi/pathed_node.rb +47 -49
  10. data/lib/jsi/ptr.rb +292 -0
  11. data/lib/jsi/schema/application/child_application/contains.rb +16 -0
  12. data/lib/jsi/schema/application/child_application/draft04.rb +22 -0
  13. data/lib/jsi/schema/application/child_application/draft06.rb +29 -0
  14. data/lib/jsi/schema/application/child_application/draft07.rb +29 -0
  15. data/lib/jsi/schema/application/child_application/items.rb +18 -0
  16. data/lib/jsi/schema/application/child_application/properties.rb +25 -0
  17. data/lib/jsi/schema/application/child_application.rb +40 -0
  18. data/lib/jsi/schema/application/draft04.rb +8 -0
  19. data/lib/jsi/schema/application/draft06.rb +8 -0
  20. data/lib/jsi/schema/application/draft07.rb +8 -0
  21. data/lib/jsi/schema/application/inplace_application/dependencies.rb +28 -0
  22. data/lib/jsi/schema/application/inplace_application/draft04.rb +26 -0
  23. data/lib/jsi/schema/application/inplace_application/draft06.rb +27 -0
  24. data/lib/jsi/schema/application/inplace_application/draft07.rb +33 -0
  25. data/lib/jsi/schema/application/inplace_application/ifthenelse.rb +20 -0
  26. data/lib/jsi/schema/application/inplace_application/ref.rb +18 -0
  27. data/lib/jsi/schema/application/inplace_application/someof.rb +29 -0
  28. data/lib/jsi/schema/application/inplace_application.rb +46 -0
  29. data/lib/jsi/schema/application.rb +12 -0
  30. data/lib/jsi/schema/draft04.rb +14 -0
  31. data/lib/jsi/schema/draft06.rb +14 -0
  32. data/lib/jsi/schema/draft07.rb +14 -0
  33. data/lib/jsi/schema/issue.rb +36 -0
  34. data/lib/jsi/schema/ref.rb +159 -0
  35. data/lib/jsi/schema/schema_ancestor_node.rb +119 -0
  36. data/lib/jsi/schema/validation/array.rb +69 -0
  37. data/lib/jsi/schema/validation/const.rb +20 -0
  38. data/lib/jsi/schema/validation/contains.rb +25 -0
  39. data/lib/jsi/schema/validation/core.rb +39 -0
  40. data/lib/jsi/schema/validation/dependencies.rb +49 -0
  41. data/lib/jsi/schema/validation/draft04/minmax.rb +91 -0
  42. data/lib/jsi/schema/validation/draft04.rb +112 -0
  43. data/lib/jsi/schema/validation/draft06.rb +122 -0
  44. data/lib/jsi/schema/validation/draft07.rb +159 -0
  45. data/lib/jsi/schema/validation/enum.rb +25 -0
  46. data/lib/jsi/schema/validation/ifthenelse.rb +46 -0
  47. data/lib/jsi/schema/validation/items.rb +54 -0
  48. data/lib/jsi/schema/validation/not.rb +20 -0
  49. data/lib/jsi/schema/validation/numeric.rb +121 -0
  50. data/lib/jsi/schema/validation/object.rb +45 -0
  51. data/lib/jsi/schema/validation/pattern.rb +34 -0
  52. data/lib/jsi/schema/validation/properties.rb +101 -0
  53. data/lib/jsi/schema/validation/property_names.rb +32 -0
  54. data/lib/jsi/schema/validation/ref.rb +40 -0
  55. data/lib/jsi/schema/validation/required.rb +27 -0
  56. data/lib/jsi/schema/validation/someof.rb +90 -0
  57. data/lib/jsi/schema/validation/string.rb +47 -0
  58. data/lib/jsi/schema/validation/type.rb +49 -0
  59. data/lib/jsi/schema/validation.rb +51 -0
  60. data/lib/jsi/schema.rb +486 -133
  61. data/lib/jsi/schema_classes.rb +157 -42
  62. data/lib/jsi/schema_registry.rb +141 -0
  63. data/lib/jsi/schema_set.rb +141 -0
  64. data/lib/jsi/simple_wrap.rb +2 -2
  65. data/lib/jsi/typelike_modules.rb +52 -37
  66. data/lib/jsi/util/attr_struct.rb +106 -0
  67. data/lib/jsi/util.rb +141 -25
  68. data/lib/jsi/validation/error.rb +34 -0
  69. data/lib/jsi/validation/result.rb +210 -0
  70. data/lib/jsi/validation.rb +15 -0
  71. data/lib/jsi/version.rb +3 -1
  72. data/lib/jsi.rb +55 -9
  73. data/lib/schemas/json-schema.org/draft-04/schema.rb +8 -3
  74. data/lib/schemas/json-schema.org/draft-06/schema.rb +8 -3
  75. data/lib/schemas/json-schema.org/draft-07/schema.rb +12 -0
  76. data/readme.rb +138 -0
  77. data/{resources}/schemas/json-schema.org/draft-04/schema.json +149 -0
  78. data/{resources}/schemas/json-schema.org/draft-06/schema.json +154 -0
  79. data/{resources}/schemas/json-schema.org/draft-07/schema.json +168 -0
  80. metadata +69 -118
  81. data/.simplecov +0 -3
  82. data/Rakefile.rb +0 -9
  83. data/jsi.gemspec +0 -28
  84. data/lib/jsi/base/to_rb.rb +0 -128
  85. data/lib/jsi/json/node.rb +0 -203
  86. data/lib/jsi/json/pointer.rb +0 -419
  87. data/lib/jsi/json-schema-fragments.rb +0 -61
  88. data/lib/jsi/json.rb +0 -10
  89. data/resources/icons/AGPL-3.0.png +0 -0
  90. data/test/base_array_test.rb +0 -323
  91. data/test/base_hash_test.rb +0 -337
  92. data/test/base_test.rb +0 -486
  93. data/test/jsi_coder_test.rb +0 -85
  94. data/test/jsi_json_arraynode_test.rb +0 -150
  95. data/test/jsi_json_hashnode_test.rb +0 -132
  96. data/test/jsi_json_node_test.rb +0 -257
  97. data/test/jsi_json_pointer_test.rb +0 -102
  98. data/test/jsi_test.rb +0 -11
  99. data/test/jsi_typelike_as_json_test.rb +0 -53
  100. data/test/metaschema_node_test.rb +0 -19
  101. data/test/schema_module_test.rb +0 -21
  102. data/test/schema_test.rb +0 -208
  103. data/test/spreedly_openapi_test.rb +0 -8
  104. data/test/test_helper.rb +0 -97
  105. data/test/util_test.rb +0 -62
@@ -1,323 +0,0 @@
1
- require_relative 'test_helper'
2
-
3
- base = {
4
- 'description' => 'named array schema',
5
- 'type' => 'array',
6
- 'items' => [
7
- {'type' => 'string'},
8
- {'type' => 'object'},
9
- {'type' => 'array', 'items' => {}},
10
- ],
11
- }
12
- NamedArrayInstance = JSI::Schema.new(base).jsi_schema_class
13
- NamedIdArrayInstance = JSI::Schema.new({'$id' => 'https://schemas.jsi.unth.net/test/base/named_array_schema'}.merge(base)).jsi_schema_class
14
-
15
- describe 'JSI::Base array' do
16
- let(:instance) { ['foo', {'lamp' => [3]}, ['q', 'r'], {'four' => 4}] }
17
- let(:schema_content) do
18
- {
19
- 'description' => 'hash schema',
20
- 'type' => 'array',
21
- 'items' => [
22
- {'type' => 'string'},
23
- {'type' => 'object'},
24
- {'type' => 'array', 'items' => {}},
25
- ],
26
- }
27
- end
28
- let(:schema) { JSI::Schema.new(schema_content) }
29
- let(:subject) { schema.new_jsi(instance) }
30
-
31
- describe '#[] with a default that is a basic type' do
32
- let(:schema_content) do
33
- {
34
- 'type' => 'array',
35
- 'items' => {'default' => 'foo'},
36
- }
37
- end
38
- describe 'default value' do
39
- let(:instance) { [1] }
40
- it 'returns the default value' do
41
- assert_equal('foo', subject[2])
42
- end
43
- end
44
- describe 'nondefault value (basic type)' do
45
- let(:instance) { ['who'] }
46
- it 'returns the nondefault value' do
47
- assert_equal('who', subject[0])
48
- end
49
- end
50
- describe 'nondefault value (nonbasic type)' do
51
- let(:instance) { [[2]] }
52
- it 'returns the nondefault value' do
53
- assert_is_a(schema.items.jsi_schema_module, subject[0])
54
- assert_equal([2], subject[0].as_json)
55
- end
56
- end
57
- end
58
- describe '#[] with a default that is a nonbasic type' do
59
- let(:schema_content) do
60
- {
61
- 'type' => 'array',
62
- 'items' => {'default' => {'foo' => 2}},
63
- }
64
- end
65
- describe 'default value' do
66
- let(:instance) { [{'bar' => 3}] }
67
- it 'returns the default value' do
68
- assert_is_a(schema.items.jsi_schema_module, subject[1])
69
- assert_equal({'foo' => 2}, subject[1].as_json)
70
- end
71
- end
72
- describe 'nondefault value (basic type)' do
73
- let(:instance) { [true, 'who'] }
74
- it 'returns the nondefault value' do
75
- assert_equal('who', subject[1])
76
- end
77
- end
78
- describe 'nondefault value (nonbasic type)' do
79
- let(:instance) { [true, [2]] }
80
- it 'returns the nondefault value' do
81
- assert_is_a(schema.items.jsi_schema_module, subject[1])
82
- assert_equal([2], subject[1].as_json)
83
- end
84
- end
85
- end
86
- describe 'arraylike []=' do
87
- it 'sets an index' do
88
- orig_2 = subject[2]
89
-
90
- subject[2] = {'y' => 'z'}
91
-
92
- assert_equal({'y' => 'z'}, subject[2].as_json)
93
- assert_is_a(schema.items[2].jsi_schema_module, orig_2)
94
- assert_is_a(schema.items[2].jsi_schema_module, subject[2])
95
- end
96
- it 'modifies the instance, visible to other references to the same instance' do
97
- orig_instance = subject.jsi_instance
98
-
99
- subject[2] = {'y' => 'z'}
100
-
101
- assert_equal(orig_instance, subject.jsi_instance)
102
- assert_equal({'y' => 'z'}, orig_instance[2])
103
- assert_equal({'y' => 'z'}, subject.jsi_instance[2])
104
- assert_equal(orig_instance.class, subject.jsi_instance.class)
105
- end
106
- describe 'when the instance is not arraylike' do
107
- let(:instance) { nil }
108
- it 'errors' do
109
- err = assert_raises(NoMethodError) { subject[2] = 0 }
110
- assert_equal("cannot assign subcript (using token: 2) to instance: nil", err.message)
111
- end
112
- end
113
- describe '#inspect' do
114
- it 'inspects' do
115
- assert_equal("#[<JSI> \"foo\", \#{<JSI> \"lamp\" => [3]}, #[<JSI> \"q\", \"r\"], {\"four\"=>4}]", subject.inspect)
116
- end
117
- end
118
- describe '#pretty_print' do
119
- it 'pretty_prints' do
120
- assert_equal("#[<JSI> \"foo\", \#{<JSI> \"lamp\" => [3]}, #[<JSI> \"q\", \"r\"], {\"four\"=>4}]\n", subject.pretty_inspect)
121
- end
122
- end
123
- describe '#inspect SortOfArray' do
124
- let(:subject) { schema.new_jsi(SortOfArray.new(instance)) }
125
- it 'inspects' do
126
- assert_equal("#[<JSI SortOfArray> \"foo\", \#{<JSI> \"lamp\" => [3]}, #[<JSI> \"q\", \"r\"], {\"four\"=>4}]", subject.inspect)
127
- end
128
- end
129
- describe '#pretty_print SortOfArray' do
130
- let(:subject) { schema.new_jsi(SortOfArray.new(instance)) }
131
- it 'pretty_prints' do
132
- assert_equal("#[<JSI SortOfArray>\n \"foo\",\n \#{<JSI> \"lamp\" => [3]},\n #[<JSI> \"q\", \"r\"],\n {\"four\"=>4}\n]\n", subject.pretty_inspect)
133
- end
134
- end
135
- describe '#inspect named' do
136
- let(:subject) { NamedArrayInstance.new(instance) }
137
- it 'inspects' do
138
- assert_equal("#[<NamedArrayInstance> \"foo\", \#{<JSI> \"lamp\" => [3]}, #[<JSI> \"q\", \"r\"], {\"four\"=>4}]", subject.inspect)
139
- end
140
- end
141
- describe '#pretty_print named' do
142
- let(:subject) { NamedArrayInstance.new(instance) }
143
- it 'inspects' do
144
- assert_equal("#[<NamedArrayInstance>\n \"foo\",\n \#{<JSI> \"lamp\" => [3]},\n #[<JSI> \"q\", \"r\"],\n {\"four\"=>4}\n]\n", subject.pretty_inspect)
145
- end
146
- end
147
- describe '#inspect named SortOfArray' do
148
- let(:subject) { NamedArrayInstance.new(SortOfArray.new(instance)) }
149
- it 'inspects' do
150
- assert_equal("#[<NamedArrayInstance SortOfArray> \"foo\", \#{<JSI> \"lamp\" => [3]}, #[<JSI> \"q\", \"r\"], {\"four\"=>4}]", subject.inspect)
151
- end
152
- end
153
- describe '#pretty_print named SortOfArray' do
154
- let(:subject) { NamedArrayInstance.new(SortOfArray.new(instance)) }
155
- it 'inspects' do
156
- assert_equal("#[<NamedArrayInstance SortOfArray>\n \"foo\",\n \#{<JSI> \"lamp\" => [3]},\n #[<JSI> \"q\", \"r\"],\n {\"four\"=>4}\n]\n", subject.pretty_inspect)
157
- end
158
- end
159
- describe '#inspect named with id' do
160
- let(:subject) { NamedIdArrayInstance.new(instance) }
161
- it 'inspects' do
162
- assert_equal("#[<NamedIdArrayInstance> \"foo\", \#{<JSI (https://schemas.jsi.unth.net/test/base/named_array_schema#/items/1)> \"lamp\" => [3]}, #[<JSI (https://schemas.jsi.unth.net/test/base/named_array_schema#/items/2)> \"q\", \"r\"], {\"four\"=>4}]", subject.inspect)
163
- end
164
- end
165
- describe '#pretty_print named with id' do
166
- let(:subject) { NamedIdArrayInstance.new(instance) }
167
- it 'inspects' do
168
- assert_equal("#[<NamedIdArrayInstance>\n \"foo\",\n \#{<JSI (https://schemas.jsi.unth.net/test/base/named_array_schema#/items/1)>\n \"lamp\" => [3]\n },\n #[<JSI (https://schemas.jsi.unth.net/test/base/named_array_schema#/items/2)>\n \"q\",\n \"r\"\n ],\n {\"four\"=>4}\n]\n", subject.pretty_inspect)
169
- end
170
- end
171
- describe '#inspect named with id SortOfArray' do
172
- let(:subject) { NamedIdArrayInstance.new(SortOfArray.new(instance)) }
173
- it 'inspects' do
174
- assert_equal("#[<NamedIdArrayInstance SortOfArray> \"foo\", \#{<JSI (https://schemas.jsi.unth.net/test/base/named_array_schema#/items/1)> \"lamp\" => [3]}, #[<JSI (https://schemas.jsi.unth.net/test/base/named_array_schema#/items/2)> \"q\", \"r\"], {\"four\"=>4}]", subject.inspect)
175
- end
176
- end
177
- describe '#pretty_print named with id SortOfArray' do
178
- let(:subject) { NamedIdArrayInstance.new(SortOfArray.new(instance)) }
179
- it 'inspects' do
180
- assert_equal("#[<NamedIdArrayInstance SortOfArray>\n \"foo\",\n \#{<JSI (https://schemas.jsi.unth.net/test/base/named_array_schema#/items/1)>\n \"lamp\" => [3]\n },\n #[<JSI (https://schemas.jsi.unth.net/test/base/named_array_schema#/items/2)>\n \"q\",\n \"r\"\n ],\n {\"four\"=>4}\n]\n", subject.pretty_inspect)
181
- end
182
- end
183
- describe '#inspect with id' do
184
- let(:schema_content) { {'$id' => 'https://schemas.jsi.unth.net/base_array_test/withid', 'items' => [{}, {}, {}]} }
185
- let(:subject) { schema.new_jsi(instance) }
186
- it 'inspects' do
187
- assert_equal("#[<JSI (https://schemas.jsi.unth.net/base_array_test/withid#)> \"foo\", \#{<JSI (https://schemas.jsi.unth.net/base_array_test/withid#/items/1)> \"lamp\" => [3]}, #[<JSI (https://schemas.jsi.unth.net/base_array_test/withid#/items/2)> \"q\", \"r\"], {\"four\"=>4}]", subject.inspect)
188
- end
189
- end
190
- describe '#pretty_print with id' do
191
- let(:schema_content) { {'$id' => 'https://schemas.jsi.unth.net/base_array_test/withid', 'items' => [{}, {}, {}]} }
192
- let(:subject) { schema.new_jsi(instance) }
193
- it 'pretty prints' do
194
- assert_equal("#[<JSI (https://schemas.jsi.unth.net/base_array_test/withid#)>\n \"foo\",\n \#{<JSI (https://schemas.jsi.unth.net/base_array_test/withid#/items/1)>\n \"lamp\" => [3]\n },\n #[<JSI (https://schemas.jsi.unth.net/base_array_test/withid#/items/2)>\n \"q\",\n \"r\"\n ],\n {\"four\"=>4}\n]\n", subject.pretty_inspect)
195
- end
196
- end
197
- describe '#inspect with id SortOfArray' do
198
- let(:schema_content) { {'$id' => 'https://schemas.jsi.unth.net/base_array_test/withid', 'items' => [{}, {}, {}]} }
199
- let(:subject) { schema.new_jsi(SortOfArray.new(instance)) }
200
- it 'inspects' do
201
- assert_equal("#[<JSI (https://schemas.jsi.unth.net/base_array_test/withid#) SortOfArray> \"foo\", \#{<JSI (https://schemas.jsi.unth.net/base_array_test/withid#/items/1)> \"lamp\" => [3]}, #[<JSI (https://schemas.jsi.unth.net/base_array_test/withid#/items/2)> \"q\", \"r\"], {\"four\"=>4}]", subject.inspect)
202
- end
203
- end
204
- describe '#pretty_print with id SortOfArray' do
205
- let(:schema_content) { {'$id' => 'https://schemas.jsi.unth.net/base_array_test/withid', 'items' => [{}, {}, {}]} }
206
- let(:subject) { schema.new_jsi(SortOfArray.new(instance)) }
207
- it 'inspects' do
208
- assert_equal("#[<JSI (https://schemas.jsi.unth.net/base_array_test/withid#) SortOfArray>\n \"foo\",\n \#{<JSI (https://schemas.jsi.unth.net/base_array_test/withid#/items/1)>\n \"lamp\" => [3]\n },\n #[<JSI (https://schemas.jsi.unth.net/base_array_test/withid#/items/2)>\n \"q\",\n \"r\"\n ],\n {\"four\"=>4}\n]\n", subject.pretty_inspect)
209
- end
210
- end
211
- describe '#inspect Node' do
212
- let(:subject) { schema.new_jsi(JSI::JSON::Node.new_doc(instance)) }
213
- it 'inspects' do
214
- assert_equal("#[<JSI JSI::JSON::ArrayNode #> \"foo\", \#{<JSI JSI::JSON::HashNode #/1> \"lamp\" => #[<JSI::JSON::ArrayNode #/1/lamp> 3]}, #[<JSI JSI::JSON::ArrayNode #/2> \"q\", \"r\"], \#{<JSI::JSON::HashNode #/3> \"four\" => 4}]", subject.inspect)
215
- end
216
- end
217
- describe '#pretty_print Node' do
218
- let(:subject) { schema.new_jsi(JSI::JSON::Node.new_doc(instance)) }
219
- it 'pretty_prints' do
220
- assert_equal("#[<JSI JSI::JSON::ArrayNode #>\n \"foo\",\n \#{<JSI JSI::JSON::HashNode #/1>\n \"lamp\" => #[<JSI::JSON::ArrayNode #/1/lamp> 3]\n },\n #[<JSI JSI::JSON::ArrayNode #/2> \"q\", \"r\"],\n \#{<JSI::JSON::HashNode #/3> \"four\" => 4}\n]\n", subject.pretty_inspect)
221
- end
222
- end
223
- end
224
- # these methods just delegate to Array so not going to test excessively
225
- describe 'index only methods' do
226
- it('#each_index') { assert_equal([0, 1, 2, 3], subject.each_index.to_a) }
227
- it('#empty?') { assert_equal(false, subject.empty?) }
228
- it('#length') { assert_equal(4, subject.length) }
229
- it('#size') { assert_equal(4, subject.size) }
230
- end
231
- describe 'index + element methods' do
232
- it('#|') { assert_equal(['foo', subject[1], subject[2], subject[3], 0], subject | [0]) }
233
- it('#&') { assert_equal(['foo'], subject & ['foo']) }
234
- it('#*') { assert_equal(subject.to_a, subject * 1) }
235
- it('#+') { assert_equal(subject.to_a, subject + []) }
236
- it('#-') { assert_equal([subject[1], subject[2], subject[3]], subject - ['foo']) }
237
- it('#<=>') { assert_equal(1, subject <=> []) }
238
- it('#<=>') { assert_equal(-1, [] <=> subject) }
239
- require 'abbrev'
240
- it('#abbrev') { assert_equal({'a' => 'a'}, schema.new_jsi(['a']).abbrev) }
241
- it('#assoc') { assert_equal(['q', 'r'], subject.assoc('q')) }
242
- it('#at') { assert_equal('foo', subject.at(0)) }
243
- it('#bsearch') { assert_equal(nil, subject.bsearch { false }) }
244
- it('#bsearch_index') { assert_equal(nil, subject.bsearch_index { false }) } if [].respond_to?(:bsearch_index)
245
- it('#combination') { assert_equal([['foo'], [subject[1]], [subject[2]], [subject[3]]], subject.combination(1).to_a) }
246
- it('#count') { assert_equal(1, subject.count('foo')) }
247
- it('#cycle') { assert_equal(subject.to_a, subject.cycle(1).to_a) }
248
- it('#dig') { assert_equal(3, subject.dig(1, 'lamp', 0)) } if [].respond_to?(:dig)
249
- it('#drop') { assert_equal([subject[2], subject[3]], subject.drop(2)) }
250
- it('#drop_while') { assert_equal([subject[1], subject[2], subject[3]], subject.drop_while { |e| e == 'foo' }) }
251
- it('#fetch') { assert_equal('foo', subject.fetch(0)) }
252
- it('#find_index') { assert_equal(0, subject.find_index { true }) }
253
- it('#first') { assert_equal('foo', subject.first) }
254
- it('#include?') { assert_equal(true, subject.include?('foo')) }
255
- it('#index') { assert_equal(0, subject.index('foo')) }
256
- it('#join') { assert_equal('a b', schema.new_jsi(['a', 'b']).join(' ')) }
257
- it('#last') { assert_equal(subject[3], subject.last) }
258
- it('#pack') { assert_equal(' ', schema.new_jsi([32]).pack('c')) }
259
- it('#permutation') { assert_equal([['foo'], [subject[1]], [subject[2]], [subject[3]]], subject.permutation(1).to_a) }
260
- it('#product') { assert_equal([], subject.product([])) }
261
- # due to differences in implementation between #assoc and #rassoc, the reason for which
262
- # I cannot begin to fathom, assoc works but rassoc does not because rassoc has different
263
- # type checking than assoc for the array(like) array elements.
264
- # compare:
265
- # assoc: https://github.com/ruby/ruby/blob/v2_5_0/array.c#L3780-L3813
266
- # rassoc: https://github.com/ruby/ruby/blob/v2_5_0/array.c#L3815-L3847
267
- # for this reason, rassoc is NOT defined on Arraylike and we call #jsi_instance to use it.
268
- it('#rassoc') { assert_equal(['q', 'r'], subject.jsi_instance.rassoc('r')) }
269
- it('#repeated_combination') { assert_equal([[]], subject.repeated_combination(0).to_a) }
270
- it('#repeated_permutation') { assert_equal([[]], subject.repeated_permutation(0).to_a) }
271
- it('#reverse') { assert_equal([subject[3], subject[2], subject[1], 'foo'], subject.reverse) }
272
- it('#reverse_each') { assert_equal([subject[3], subject[2], subject[1], 'foo'], subject.reverse_each.to_a) }
273
- it('#rindex') { assert_equal(0, subject.rindex('foo')) }
274
- it('#rotate') { assert_equal([subject[1], subject[2], subject[3], 'foo'], subject.rotate) }
275
- it('#sample') { assert_equal('a', schema.new_jsi(['a']).sample) }
276
- it('#shelljoin') { assert_equal('a', schema.new_jsi(['a']).shelljoin) } if [].respond_to?(:shelljoin)
277
- it('#shuffle') { assert_equal(4, subject.shuffle.size) }
278
- it('#slice') { assert_equal(['foo'], subject.slice(0, 1)) }
279
- it('#sort') { assert_equal(['a'], schema.new_jsi(['a']).sort) }
280
- it('#take') { assert_equal(['foo'], subject.take(1)) }
281
- it('#take_while') { assert_equal([], subject.take_while { false }) }
282
- it('#transpose') { assert_equal([], schema.new_jsi([]).transpose) }
283
- it('#uniq') { assert_equal(subject.to_a, subject.uniq) }
284
- it('#values_at') { assert_equal(['foo'], subject.values_at(0)) }
285
- it('#zip') { assert_equal([['foo', 'foo'], [subject[1], subject[1]], [subject[2], subject[2]], [subject[3], subject[3]]], subject.zip(subject)) }
286
- end
287
- describe 'with an instance that has to_ary but not other ary instance methods' do
288
- let(:instance) { SortOfArray.new(['foo', {'lamp' => SortOfArray.new([3])}, SortOfArray.new(['q', 'r'])]) }
289
- describe 'delegating instance methods to #to_ary' do
290
- it('#each_index') { assert_equal([0, 1, 2], subject.each_index.to_a) }
291
- it('#size') { assert_equal(3, subject.size) }
292
- it('#count') { assert_equal(1, subject.count('foo')) }
293
- it('#slice') { assert_equal(['foo'], subject.slice(0, 1)) }
294
- it('#[]') { assert_equal(SortOfArray.new(['q', 'r']), subject[2].jsi_instance) }
295
- it('#as_json') { assert_equal(['foo', {'lamp' => [3]}, ['q', 'r']], subject.as_json) }
296
- end
297
- end
298
- describe 'modified copy methods' do
299
- it('#reject') { assert_equal(schema.new_jsi(['foo']), subject.reject { |e| e != 'foo' }) }
300
- it('#reject block var') do
301
- subj_a = subject.to_a
302
- subject.reject { |e| assert_equal(e, subj_a.shift) }
303
- end
304
- it('#select') { assert_equal(schema.new_jsi(['foo']), subject.select { |e| e == 'foo' }) }
305
- it('#select block var') do
306
- subj_a = subject.to_a
307
- subject.select { |e| assert_equal(e, subj_a.shift) }
308
- end
309
- it('#compact') { assert_equal(subject, subject.compact) }
310
- describe 'at a depth' do
311
- it('#select') do
312
- expected = schema.new_jsi(['foo', {'lamp' => [3]}, ['r'], {'four' => 4}])[2]
313
- actual = subject[2].select { |e| e == 'r' }
314
- assert_equal(expected, actual)
315
- end
316
- end
317
- end
318
- JSI::Arraylike::DESTRUCTIVE_METHODS.each do |destructive_method_name|
319
- it("does not respond to destructive method #{destructive_method_name}") do
320
- assert(!subject.respond_to?(destructive_method_name))
321
- end
322
- end
323
- end