diametric 0.1.1-java → 0.1.2-java

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.
@@ -1,6 +1,5 @@
1
1
  package diametric;
2
2
 
3
- import java.io.FileNotFoundException;
4
3
  import java.io.FileReader;
5
4
  import java.io.IOException;
6
5
  import java.io.Reader;
@@ -8,8 +7,10 @@ import java.util.ArrayList;
8
7
  import java.util.Collections;
9
8
  import java.util.Date;
10
9
  import java.util.HashMap;
10
+ import java.util.HashSet;
11
11
  import java.util.List;
12
12
  import java.util.Map;
13
+ import java.util.Set;
13
14
  import java.util.UUID;
14
15
 
15
16
  import org.jruby.Ruby;
@@ -30,6 +31,11 @@ import org.jruby.javasupport.util.RuntimeHelpers;
30
31
  import org.jruby.runtime.ThreadContext;
31
32
  import org.jruby.runtime.builtin.IRubyObject;
32
33
 
34
+ import clojure.lang.APersistentVector;
35
+ import clojure.lang.IPersistentSet;
36
+ import clojure.lang.LazySeq;
37
+ import clojure.lang.PersistentHashSet;
38
+ import clojure.lang.PersistentVector;
33
39
  import datomic.Util;
34
40
 
35
41
  @JRubyModule(name="Diametric::Persistence::Utils")
@@ -71,6 +77,7 @@ public class DiametricUtils {
71
77
  }
72
78
 
73
79
  static Object convertRubyToJava(ThreadContext context, IRubyObject value) {
80
+ if (value instanceof RubyNil) return null;
74
81
  if (value instanceof RubyString) {
75
82
  String str = (String)((RubyString)value).toJava(String.class);
76
83
  try {
@@ -97,26 +104,39 @@ public class DiametricUtils {
97
104
  RubyTime tmvalue = (RubyTime)RuntimeHelpers.invoke(context, value, "to_time");
98
105
  return (Object)tmvalue.getJavaDate();
99
106
  }
107
+ // needs to check Set since Set responses to "to_a"
108
+ if (value.respondsTo("intersection")) {
109
+ return getPersistentSet(context, value);
110
+ }
100
111
  //System.out.println("NOT YET CONVERTED");
101
112
  //System.out.println("RESPONDSTO? TO_A:" + value.respondsTo("to_a"));
102
113
  if (value.respondsTo("to_a")) { // might be Set for cardinality many type
103
- RubyArray ruby_array = (RubyArray)RuntimeHelpers.invoke(context, value, "to_a");
104
- List<Object> list = new ArrayList<Object>();
105
- while (true) {
106
- IRubyObject element = ruby_array.shift(context);
107
- if (element.isNil()) break;
108
- list.add(DiametricUtils.convertRubyToJava(context, element));
109
- }
110
- return Collections.unmodifiableList(list);
114
+ return getList(context, value);
111
115
  }
112
116
  if (value instanceof DiametricObject) {
113
117
  return ((DiametricObject)value).toJava();
114
118
  }
115
119
  return (Object)value.toJava(Object.class);
116
120
  }
117
-
121
+
122
+ static IPersistentSet getPersistentSet(ThreadContext context, IRubyObject value) {
123
+ return PersistentHashSet.create((List)value.callMethod(context, "to_a"));
124
+ }
125
+
126
+ static List<Object> getList(ThreadContext context, IRubyObject value) {
127
+ RubyArray ruby_array = (RubyArray)RuntimeHelpers.invoke(context, value, "to_a");
128
+ List<Object> list = new ArrayList<Object>();
129
+ while (true) {
130
+ IRubyObject element = ruby_array.shift(context);
131
+ if (element.isNil()) break;
132
+ list.add(DiametricUtils.convertRubyToJava(context, element));
133
+ }
134
+ return Collections.unmodifiableList(list);
135
+ }
136
+
118
137
  static IRubyObject convertJavaToRuby(ThreadContext context, Object value) {
119
138
  Ruby runtime = context.getRuntime();
139
+ if (value == null) return context.getRuntime().getNil();
120
140
  if (value instanceof String) return RubyString.newString(runtime, (String)value);
121
141
  if (value instanceof Boolean) return RubyBoolean.newBoolean(runtime, (Boolean)value);
122
142
  if (value instanceof Long) return RubyFixnum.newFixnum(runtime, (Long)value);
@@ -126,6 +146,14 @@ public class DiametricUtils {
126
146
  if (value instanceof java.math.BigInteger) return RubyBignum.newBignum(runtime, ((java.math.BigInteger)value).longValue());
127
147
  if (value instanceof Double) return RubyFloat.newFloat(runtime, (Double)value);
128
148
  if (value instanceof Date) return RubyTime.newTime(runtime, ((Date)value).getTime());
149
+ if (value instanceof Set) {
150
+ return getDiametricSet(context, (Set)value);
151
+ }
152
+ if ((value instanceof APersistentVector) ||
153
+ (value instanceof LazySeq) ||
154
+ (value instanceof PersistentVector.ChunkedSeq)){
155
+ return getDiametricCollection(context, (List)value);
156
+ }
129
157
  if (value instanceof java.util.UUID) {
130
158
  RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::UUID");
131
159
  DiametricUUID diametric_uuid = (DiametricUUID)clazz.allocate();
@@ -135,6 +163,20 @@ public class DiametricUtils {
135
163
  return JavaUtil.convertJavaToUsableRubyObject(runtime, value);
136
164
  }
137
165
 
166
+ static IRubyObject getDiametricSet(ThreadContext context, Set value) {
167
+ RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Set");
168
+ DiametricSet diametric_set = (DiametricSet)clazz.allocate();
169
+ diametric_set.init(value);
170
+ return diametric_set;
171
+ }
172
+
173
+ static IRubyObject getDiametricCollection(ThreadContext context, List value) {
174
+ RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Collection");
175
+ DiametricCollection diametric_collection = (DiametricCollection)clazz.allocate();
176
+ diametric_collection.init((List)value);
177
+ return diametric_collection;
178
+ }
179
+
138
180
  static List<Object> convertRubyTxDataToJava(ThreadContext context, IRubyObject arg) {
139
181
  List<Object> tx_data = null;
140
182
  if (arg instanceof RubyArray) {
@@ -317,12 +317,12 @@ module Diametric
317
317
  if parent.class.attributes[e][:value_type] == "ref"
318
318
  ref = parent.instance_variable_get("@#{e.to_s}")
319
319
  if ref.is_a?(Fixnum) || ref.is_a?(Java::DatomicQuery::EntityMap)
320
- child = from_dbid_or_entity(ref, connection)
320
+ child = reify(ref, connection)
321
321
  child = resolve_ref_dbid(child, connection)
322
322
  parent.instance_variable_set("@#{e.to_s}", child)
323
323
  elsif ref.is_a?(Set)
324
324
  children = ref.inject(Set.new) do |memo, entity|
325
- child = from_dbid_or_entity(entity, connection)
325
+ child = reify(entity, connection)
326
326
  memo.add(child)
327
327
  memo
328
328
  end
@@ -333,7 +333,7 @@ module Diametric
333
333
  parent
334
334
  end
335
335
 
336
- def from_dbid_or_entity(thing, conn_or_db=nil, resolve=false)
336
+ def reify(thing, conn_or_db=nil, resolve=false)
337
337
  conn_or_db ||= Diametric::Persistence::Peer.connect.db
338
338
 
339
339
  if conn_or_db.respond_to?(:db)
@@ -350,6 +350,8 @@ module Diametric
350
350
  else
351
351
  entity = conn_or_db.entity(dbid)
352
352
  end
353
+ elsif thing.kind_of? java.lang.Long
354
+ entity = conn_or_db.entity(Diametric::Persistence::Object.new(thing))
353
355
  elsif thing.respond_to?(:to_java)
354
356
  dbid = thing.to_java
355
357
  entity = conn_or_db.entity(dbid)
@@ -365,7 +367,7 @@ module Diametric
365
367
  match_data = /:([a-zA-Z0-9_]+)\/([a-zA-Z0-9_]+)/.match(key)
366
368
  instance.send("#{match_data[2]}=", entity[key])
367
369
  end
368
- instance.send("dbid=", Diametric::Persistence::Object.new(dbid))
370
+ instance.send("dbid=", Diametric::Persistence::Object.new(entity.get("db/id")))
369
371
 
370
372
  if resolve
371
373
  instance = resolve_ref_dbid(instance, conn_or_db)
@@ -378,7 +380,7 @@ module Diametric
378
380
  if self.instance_variable_get("@peer")
379
381
  connection ||= Diametric::Persistence::Peer.connect
380
382
  end
381
- from_dbid_or_entity(id, connection)
383
+ reify(id, connection)
382
384
  end
383
385
 
384
386
  # Returns the prefix for this model used in Datomic. Can be
@@ -45,21 +45,21 @@ module Diametric
45
45
  end
46
46
  end
47
47
 
48
- def all(connection=nil, resolve=false)
48
+ def all(connection=nil, resolve=true)
49
49
  if self.instance_variable_get("@peer")
50
50
  connection ||= Diametric::Persistence::Peer.connect
51
51
  end
52
52
  Diametric::Query.new(self, connection, resolve).all
53
53
  end
54
54
 
55
- def first(conditions = {}, connection=nil, resolve=false)
55
+ def first(conditions = {}, connection=nil, resolve=true)
56
56
  if self.instance_variable_get("@peer")
57
57
  connection ||= Diametric::Persistence::Peer.connect
58
58
  end
59
59
  where(conditions, connection, resolve).first
60
60
  end
61
61
 
62
- def where(conditions = {}, connection=nil, resolve=false)
62
+ def where(conditions = {}, connection=nil, resolve=true)
63
63
  if self.instance_variable_get("@peer")
64
64
  connection ||= Diametric::Persistence::Peer.connect
65
65
  end
@@ -102,7 +102,6 @@ module Diametric
102
102
  child.instance_variable_set("@previously_changed", child.changes)
103
103
  child.changed_attributes.clear
104
104
  child.dbid = resolve_tempid(map, child.dbid)
105
- child.instance_variable_set("@tx_map", map)
106
105
  end
107
106
  resolve_changes(queue, map) unless queue.empty?
108
107
  end
@@ -116,7 +115,7 @@ module Diametric
116
115
  if result
117
116
  query_string = ":#{result[1]}/_#{result[2]}"
118
117
  entities = Diametric::Persistence::Peer.reverse_q(args[0].db, self.dbid, query_string)
119
- entities.collect {|e| self.class.from_dbid_or_entity(e, args[0])}
118
+ entities.collect {|e| self.class.reify(e, args[0])}
120
119
  else
121
120
  super
122
121
  end
@@ -127,7 +126,7 @@ module Diametric
127
126
  entity = self.new
128
127
  dbid = dbid.to_i if dbid.is_a?(String)
129
128
  connection ||= Diametric::Persistence::Peer.connect
130
- entity = self.from_dbid_or_entity(dbid, connection, resolve)
129
+ entity = self.reify(dbid, connection, resolve)
131
130
  entity
132
131
  end
133
132
 
@@ -138,15 +137,7 @@ module Diametric
138
137
  else
139
138
  db = conn_or_db
140
139
  end
141
-
142
- results = Diametric::Persistence::Peer.q(query, db, args)
143
- # Diametric query expects the first element of each array in
144
- # results is dbid. Wraps dbid here by
145
- # Diametric::Persistence::Object to make it consistent
146
- results.each do |r|
147
- r[0] = Diametric::Persistence::Object.new(r[0])
148
- end
149
- results
140
+ Diametric::Persistence::Peer.q(query, db, args)
150
141
  end
151
142
  end
152
143
  end
@@ -7,7 +7,7 @@ module Diametric
7
7
  module Persistence
8
8
  module REST
9
9
  @connection = nil
10
- @persisted_classes = Set.new
10
+ @persisted_classes = ::Set.new
11
11
 
12
12
  def self.included(base)
13
13
  base.send(:include, Diametric::Persistence::Common)
@@ -81,23 +81,22 @@ module Diametric
81
81
  filter = filter.map { |e| convert_filter_element(e) }
82
82
  filter = EDN::Type::List.new(*filter)
83
83
  end
84
-
85
84
  query.filters += [[filter]]
86
85
  query
87
86
  end
88
87
 
89
88
  def peer_filter(*filter)
90
89
  query = self.dup
91
-
92
90
  if filter.first.is_a?(Array)
93
91
  filter = filter.first
94
92
  end
95
93
  filter_attrs << filter[1].to_s
96
- filter[1] = "?#{filter[1].to_s}"
97
- filter = filter.tap {|e| e.to_s }.join(" ")
98
- filter = "[(#{filter})]"
99
-
100
- query.filters << filter
94
+ query_filter = []
95
+ query_filter << filter[0].to_s
96
+ query_filter << "?#{filter[1].to_s}"
97
+ query_filter << filter[2..-1]
98
+ query_filter = query_filter.flatten
99
+ query.filters += [query_filter]
101
100
  query
102
101
  end
103
102
 
@@ -113,9 +112,9 @@ module Diametric
113
112
  res = model.q(*data, @conn_or_db)
114
113
  collapse_results(res).each do |entity|
115
114
  if self.model.instance_variable_get("@peer") && @resolve
116
- yield model.from_dbid_or_entity(entity.first.to_java, @conn_or_db, @resolve)
115
+ yield model.reify(entity.first, @conn_or_db, @resolve)
117
116
  elsif self.model.instance_variable_get("@peer")
118
- yield entity.first.to_java
117
+ yield entity
119
118
  # The map is for compatibility with Java peer persistence.
120
119
  # TODO remove if possible
121
120
  else
@@ -127,8 +126,13 @@ module Diametric
127
126
  # Return all query results.
128
127
  #
129
128
  # @return [Array<Entity>] Query results.
130
- def all
131
- map { |x| x }
129
+ # or Set([Array<dbid>]) for Peer without resolve option
130
+ def all(conn_or_db=@conn_or_db)
131
+ if self.model.instance_variable_get("@peer") && !@resolve
132
+ model.q(*data, conn_or_db)
133
+ else
134
+ map { |x| x }
135
+ end
132
136
  end
133
137
 
134
138
  # Create a Datomic query from the conditions and filters passed to this
@@ -177,7 +181,7 @@ EOQ
177
181
  clauses = conditions.keys.inject("") do |memo, attribute|
178
182
  memo + "[?e " + model.namespace(model.prefix, attribute) + " ?#{attribute} ] "
179
183
  end
180
- from = conditions.inject("[") {|memo, kv| memo + "?#{kv.shift} "} +"]"
184
+ from = conditions.inject("") {|memo, kv| memo + "?#{kv.shift} "}
181
185
  args = conditions.map { |_, v| v }
182
186
  end
183
187
 
@@ -186,8 +190,16 @@ EOQ
186
190
  clauses = filter_attrs.inject(clauses) do |memo, attribute|
187
191
  memo + "[?e " + model.namespace(model.prefix, attribute) + " ?#{attribute} ] "
188
192
  end
193
+ from ||= ""
194
+ from = filter_attrs.inject(from) {|from, attr| from + "?#{attr}_value "}
195
+ filter_query =
196
+ "[" +
197
+ filters.inject("") {|memo, filter| memo + "(#{filter[0]} #{filter[1]} #{filter[1]}_value) "} +
198
+ "]"
199
+ args ||= []
200
+ args = filters.inject(args) {|args, filter| args + filter[2..-1]}
189
201
  end
190
- query = "[:find ?e :in $ #{from} :where #{clauses} #{filters.join}]"
202
+ query = "[:find ?e :in $ [#{from}] :where #{clauses} #{filter_query}]"
191
203
  end
192
204
 
193
205
  [query, args]
@@ -216,7 +228,7 @@ EOQ
216
228
  end
217
229
 
218
230
  def collapse_results(res)
219
- return res unless @resolve
231
+ return res if self.model.instance_variable_get("@peer")
220
232
 
221
233
  res.group_by(&:first).map do |dbid, results|
222
234
  # extract dbid from results
@@ -1,3 +1,3 @@
1
1
  module Diametric
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
Binary file
@@ -55,7 +55,7 @@ describe Developer, :jruby => true do
55
55
  result = query.all
56
56
  result.size.should == 1
57
57
 
58
- developer = Developer.from_dbid_or_entity(result.first, @conn.db, false)
58
+ developer = Developer.reify(result.first.first, @conn.db, false)
59
59
  friends = developer.friends
60
60
  friends.each do |f|
61
61
  f.should be_a(Java::DatomicQuery::EntityMap)
@@ -77,7 +77,7 @@ describe Developer, :jruby => true do
77
77
  query = Diametric::Query.new(Developer, @conn)
78
78
  result = query.all
79
79
  result.size.should == 3
80
- resolved_result = result.map {|m| Developer.from_dbid_or_entity(m, @conn)}
80
+ resolved_result = result.map {|m| Developer.reify(m.first, @conn)}
81
81
  resolved_result.collect(&:nerd_rate).should =~ [50, 98, 80]
82
82
  end
83
83
 
@@ -94,7 +94,7 @@ describe Developer, :jruby => true do
94
94
  ryan.save(@conn)
95
95
 
96
96
  query = Diametric::Query.new(Developer, @conn).filter(:>, :nerd_rate, 70)
97
- query_data = "[:find ?e :in $ :where [?e :developer/nerd_rate ?nerd_rate] [(> ?nerd_rate 70)]]"
97
+ query_data = "[:find ?e :in $ [?nerd_rate_value] :where [?e :developer/nerd_rate ?nerd_rate] [(> ?nerd_rate ?nerd_rate_value)]]"
98
98
  query.data.first.gsub(" ", "").should == query_data.gsub(" ", "")
99
99
  result = query.all
100
100
  result.size.should == 2
@@ -99,7 +99,7 @@ if is_jruby?
99
99
 
100
100
  it 'should get ids from datomic' do
101
101
  results = Diametric::Persistence::Peer.q("[:find ?c :where [?c :person/name]]", @connection.db)
102
- results.class.should == Array
102
+ results.class.should == Diametric::Persistence::Set
103
103
  results.size.should be >= 3
104
104
  #puts results.inspect
105
105
  end
@@ -107,23 +107,21 @@ if is_jruby?
107
107
  it 'should get names from datomic' do
108
108
  results = Diametric::Persistence::Peer.q("[:find ?c ?name :where [?c :person/name ?name]]\
109
109
  ", @connection.db)
110
- results.flatten.should include("Alice")
111
- results.flatten.should include("Bob")
112
- results.flatten.should include("Chris")
113
- #puts results.inspect
110
+ results.collect { |r| r[1] }.should =~ ["Alice", "Bob", "Chris"]
111
+ results.collect { |r| r if r.include?("Alice") }.compact.size.should == 1
114
112
  end
115
113
 
116
114
  it 'should get entity by id' do
117
115
  results = Diametric::Persistence::Peer.q("[:find ?c :where [?c :person/name]]",\
118
116
  @connection.db)
119
- id = results[0][0]
117
+ id = results.first.first
120
118
  @connection.db.entity(id).should be_true
121
119
  end
122
120
 
123
121
  it 'should get keys from entity id' do
124
122
  results = Diametric::Persistence::Peer.q("[:find ?c :where [?c :person/name]]",\
125
123
  @connection.db)
126
- id = results[0][0]
124
+ id = results.first.first
127
125
  entity = @connection.db.entity(id)
128
126
  entity.keys.should include(":person/name")
129
127
  #puts entity.keys
@@ -132,13 +130,432 @@ if is_jruby?
132
130
  it 'should get value from entity id' do
133
131
  results = Diametric::Persistence::Peer.q("[:find ?c :where [?c :person/name]]",\
134
132
  @connection.db)
135
- id = results[0][0]
133
+ id = results.first.first
136
134
  entity = @connection.db.entity(id)
137
135
  value = entity.get(entity.keys[0])
138
136
  value.should match(/Alice|Bob|Chris/)
139
137
  #puts value
140
138
  end
141
139
  end
140
+
141
+ context Diametric::Persistence::Collection do
142
+ before(:all) do
143
+ vector = Java::ClojureLang::PersistentVector.create(12, 23, 34, 45, 56, 67)
144
+ @collection = Diametric::Persistence::Collection.wrap(vector)
145
+ @seq = Diametric::Persistence::Collection.be_lazy(vector)
146
+ vector2 = Java::ClojureLang::PersistentVector.create(12, false, 23, nil, 34, 45, nil, 56, nil, false, 67)
147
+ @collection2 = Diametric::Persistence::Collection.wrap(vector2)
148
+ @seq2 = Diametric::Persistence::Collection.be_lazy(vector2)
149
+ empty_vector = Java::ClojureLang::PersistentVector.create()
150
+ @empty_collection = Diametric::Persistence::Collection.wrap(empty_vector)
151
+ @empty_seq = Diametric::Persistence::Collection.be_lazy(empty_vector)
152
+ end
153
+
154
+ it 'should raise error for & method' do
155
+ expect { @collection & [100, 200] }.to raise_error(RuntimeError)
156
+ end
157
+
158
+ it 'should raise error for assoc method' do
159
+ expect { @collection.assoc("something") }.to raise_error(RuntimeError)
160
+ end
161
+
162
+ it 'should repeat elements by * method' do
163
+ @collection.*(2).should == [12, 23, 34, 45, 56, 67, 12, 23, 34, 45, 56, 67]
164
+ @collection.*(",").should == "12,23,34,45,56,67"
165
+ end
166
+
167
+ it 'should concat other array' do
168
+ @collection.+([100, 200]).should == [12, 23, 34, 45, 56, 67, 100, 200]
169
+ end
170
+
171
+ it 'should get difference from other array' do
172
+ @collection.-([12, 45, 67]).should == [23, 34, 56]
173
+ end
174
+
175
+ it 'should return length' do
176
+ @collection.length.should == 6
177
+ @collection.size.should == 6
178
+ @seq.length.should == 6
179
+ @seq.size.should == 6
180
+ end
181
+
182
+ it 'should return string expression' do
183
+ @collection.to_s.should == "[12, 23, 34, 45, 56, 67]"
184
+ @seq.to_s.should == "[12, 23, 34, 45, 56, 67]"
185
+ end
186
+
187
+ it 'should return object or nil for [index]' do
188
+ @collection[0].should == 12
189
+ @collection[4].should == 56
190
+ @collection[6].should == nil
191
+ @collection[-3].should == 45
192
+ @collection[0].should == 12
193
+ @collection[4].should == 56
194
+ @collection[6].should == nil
195
+ @collection[-3].should == 45
196
+
197
+ @seq[0].should == 12
198
+ @seq[4].should == 56
199
+ @seq[6].should == nil
200
+ @seq[-3].should == 45
201
+ @seq[0].should == 12
202
+ @seq[4].should == 56
203
+ @seq[6].should == nil
204
+ @seq[-3].should == 45
205
+ end
206
+
207
+ it 'should return new collection or nil for [start, length]' do
208
+ @collection[1, 2].should == [23, 34]
209
+ @collection[7, 1].should == nil
210
+ @collection[6, 1].should == []
211
+ @collection[-2, 5].should == [56, 67]
212
+ @collection[3, -1].should == nil
213
+
214
+ @seq[1, 2].should == [23, 34]
215
+ @seq[7, 1].should == nil
216
+ @seq[6, 1].should == []
217
+ @seq[-2, 5].should == [56, 67]
218
+ @seq[3, -1].should == nil
219
+ end
220
+
221
+ it 'should return new collection or nil for [range]' do
222
+ @collection[1..3].should == [23, 34, 45]
223
+ @collection[1...3].should == [23, 34]
224
+ @collection[5..10].should == [67]
225
+ @collection[6..10].should == []
226
+ @collection[7..10].should == nil
227
+
228
+ @seq[1..3].should == [23, 34, 45]
229
+ @seq[1...3].should == [23, 34]
230
+ @seq[5..10].should == [67]
231
+ @seq[6..10].should == []
232
+ @seq[7..10].should == nil
233
+ end
234
+
235
+ it 'should return object or nil at(index)' do
236
+ @collection.at(4).should == 56
237
+ @collection.at(-1).should == 67
238
+
239
+ @seq.at(4).should == 56
240
+ @seq.at(-1).should == 67
241
+ end
242
+
243
+ it 'should raise error for bsearch method' do
244
+ expect { @collection.bsearch {|x| x} }.to raise_error(RuntimeError)
245
+ end
246
+
247
+ it 'should raise error for clear method' do
248
+ expect { @collection.clear }.to raise_error(RuntimeError)
249
+ end
250
+
251
+ it 'should return new array for collect or map method' do
252
+ @collection.collect {|x| x > 40 }.should == [false, false, false, true, true, true]
253
+ @collection.map(&:to_s).should == ["12", "23", "34", "45", "56", "67"]
254
+
255
+ @seq.collect {|x| x > 40 }.should == [false, false, false, true, true, true]
256
+ @seq.map(&:to_s).should == ["12", "23", "34", "45", "56", "67"]
257
+ end
258
+
259
+ it 'should raise error for collect! or map! method' do
260
+ expect { @collection.collect! {|x| x > 40 } }.to raise_error(RuntimeError)
261
+ expect { @collection.map!(&:to_s) }.to raise_error(RuntimeError)
262
+ end
263
+
264
+ it 'should strip nil element out from vector but not false for compact method' do
265
+ @collection2.compact.should == [12, false, 23, 34, 45, 56, false, 67]
266
+
267
+ @seq2.compact.should == [12, false, 23, 34, 45, 56, false, 67]
268
+ end
269
+
270
+ it 'should raise error for compact! method' do
271
+ expect { @collection.compact! }.to raise_error(RuntimeError)
272
+ end
273
+
274
+ it 'should raise error for concat method' do
275
+ expect { @collection.concat([100, 200]) }.to raise_error(RuntimeError)
276
+ end
277
+
278
+ it 'should count speicfied object for count method' do
279
+ @collection.count.should == 6
280
+ @collection2.count(false).should == 2
281
+ @collection2.count(100).should == 0
282
+ @collection2.count(67).should == 1
283
+ @collection2.count(nil).should == 3
284
+
285
+ @seq.count.should == 6
286
+ @seq2.count(false).should == 2
287
+ @seq2.count(100).should == 0
288
+ @seq2.count(67).should == 1
289
+ @seq2.count(nil).should == 3
290
+ end
291
+
292
+ it 'should raise error for cycle method' do
293
+ expect { @collection.cycle { |x| x } }.to raise_error(RuntimeError)
294
+ expect { @collection.cycle(2) { |x| x } }.to raise_error(RuntimeError)
295
+ end
296
+
297
+ it 'should raise error for delete method' do
298
+ expect { @collection.delete(12) }.to raise_error(RuntimeError)
299
+ expect { @collection.delete(100) { "not found" } }.to raise_error(RuntimeError)
300
+ end
301
+
302
+ it 'should raise error for delete_at and slice! method' do
303
+ expect { @collection.delete_at(2) }.to raise_error(RuntimeError)
304
+ expect { @collection.slice!(2) }.to raise_error(RuntimeError)
305
+ expect { @collection.slice!(2, 2) }.to raise_error(RuntimeError)
306
+ expect { @collection.slice!(2, 2) }.to raise_error(RuntimeError)
307
+ expect { @collection.slice!(0...2) }.to raise_error(RuntimeError)
308
+ end
309
+
310
+ it 'should raise error for delete_if and reject! method' do
311
+ expect { @collection.delete_if {|x| x > 30} }.to raise_error(RuntimeError)
312
+ expect { @collection.reject! {|x| x < 30} }.to raise_error(RuntimeError)
313
+ end
314
+
315
+ it 'should drop or take elements' do
316
+ @collection.drop(2).should == [34, 45, 56, 67]
317
+ @collection.take(3).should == [45, 56, 67]
318
+
319
+ @seq.drop(2).should == [34, 45, 56, 67]
320
+ @seq.take(3).should == [45, 56, 67]
321
+ end
322
+
323
+ it 'should drop or take elements while block returns true' do
324
+ @collection.drop_while {|x| x < 30}.should == [34, 45, 56, 67]
325
+ @collection2.take_while {|x| x != nil}.should == [nil, 34, 45, nil, 56, nil, false, 67]
326
+
327
+ @seq.drop_while {|x| x < 30}.should == [34, 45, 56, 67]
328
+ @seq2.take_while {|x| x != nil}.should == [nil, 34, 45, nil, 56, nil, false, 67]
329
+ end
330
+
331
+ it 'should iterate elements' do
332
+ result = []
333
+ @collection.each {|e| result << e.to_s}
334
+ result.should == ["12", "23", "34", "45", "56", "67"]
335
+
336
+ result = []
337
+ @collection.each_index {|e| result << e.to_s}
338
+ result.should == ["0", "1", "2", "3", "4", "5"]
339
+
340
+ result = []
341
+ @seq.each {|e| result << e.to_s}
342
+ result.should == ["12", "23", "34", "45", "56", "67"]
343
+
344
+ result = []
345
+ @seq.each_index {|e| result << e.to_s}
346
+ result.should == ["0", "1", "2", "3", "4", "5"]
347
+ end
348
+
349
+ it 'should return true or false for empty test' do
350
+ @collection.empty?.should == false
351
+ @empty_collection.empty?.should == true
352
+
353
+ @seq.empty?.should == false
354
+ @empty_seq.empty?.should == true
355
+ end
356
+
357
+ it 'should return true or false for eql? test' do
358
+ @collection.eql?([12, 23, 34, 45, 56, 67]).should be_true
359
+ @collection.eql?(@collection2).should be_false
360
+
361
+ @seq.eql?([12, 23, 34, 45, 56, 67]).should be_true
362
+ @seq.eql?(@seq2).should be_false
363
+ end
364
+
365
+ it 'should fetch a value or raise IndexError/default/block value' do
366
+ @collection.fetch(1).should == 23
367
+ @collection.fetch(-1).should == 67
368
+ @collection.fetch(100, "have a nice day").should == "have a nice day"
369
+ message = ""
370
+ @collection.fetch(-100) {|i| message = "#{i} is out of bounds"}
371
+ message.should == "-100 is out of bounds"
372
+
373
+ @seq.fetch(1).should == 23
374
+ @seq.fetch(-1).should == 67
375
+ @seq.fetch(100, "have a nice day").should == "have a nice day"
376
+ message = ""
377
+ @seq.fetch(-100) {|i| message = "#{i} is out of bounds"}
378
+ message.should == "-100 is out of bounds"
379
+ end
380
+
381
+ it 'should raise error for fill method' do
382
+ expect { @collection.fill("x") }.to raise_error(RuntimeError)
383
+ expect { @collection.fill("z", 2, 2) }.to raise_error(RuntimeError)
384
+ expect { @collection.fill("y", 0..1) }.to raise_error(RuntimeError)
385
+ expect { @collection.fill {|i| i*i} }.to raise_error(RuntimeError)
386
+ expect { @collection.fill(-2) {|i| i*i} }.to raise_error(RuntimeError)
387
+ end
388
+
389
+ it 'should return index of the first matched object' do
390
+ @collection.find_index(34).should == 2
391
+ @collection2.find_index(nil).should == 3
392
+ @collection.find_index(100).should == nil
393
+ @collection.find_index { |x| x % 7 == 0 }.should == 4
394
+ @collection.find_index { |x| x < 0 }.should == nil
395
+ @collection.index(45).should == 3
396
+ @collection2.index(false).should == 1
397
+ @collection2.index(true).should == nil
398
+ @collection.index { |x| x.odd? }.should == 1
399
+ @collection.index { |x| x > 100 }.should == nil
400
+
401
+ @seq.find_index(34).should == 2
402
+ @seq2.find_index(nil).should == 3
403
+ @seq.find_index(100).should == nil
404
+ @seq.find_index { |x| x % 7 == 0 }.should == 4
405
+ @seq.find_index { |x| x < 0 }.should == nil
406
+ @seq.index(45).should == 3
407
+ @seq2.index(false).should == 1
408
+ @seq2.index(true).should == nil
409
+ @seq.index { |x| x.odd? }.should == 1
410
+ @seq.index { |x| x > 100 }.should == nil
411
+ end
412
+
413
+ it 'should return first element or first n elements' do
414
+ @collection.first.should == 12
415
+ @collection.first(3).should == [12, 23, 34]
416
+ @collection.first(100).should == [12, 23, 34, 45, 56, 67]
417
+
418
+ @seq.first.should == 12
419
+ @seq.first(3).should == [12, 23, 34]
420
+ @seq.first(100).should == [12, 23, 34, 45, 56, 67]
421
+ end
422
+
423
+ it 'should raise error for flatten/flatten! methods' do
424
+ expect { @collection.flatten }.to raise_error(RuntimeError)
425
+ expect { @collection.flatten(2) }.to raise_error(RuntimeError)
426
+ expect { @collection.flatten! }.to raise_error(RuntimeError)
427
+ expect { @collection.flatten(100) }.to raise_error(RuntimeError)
428
+ end
429
+
430
+ it 'should return true from frozen? method' do
431
+ @collection.frozen?.should == true
432
+
433
+ @seq.frozen?.should == true
434
+ end
435
+
436
+ it 'should return truethiness for include? method' do
437
+ @collection.include?(56).should be_true
438
+ @collection2.include?(nil).should be_true
439
+ @collection2.include?(false).should be_true
440
+ @collection.include?("a").should be_false
441
+
442
+ @seq.include?(56).should be_true
443
+ @seq2.include?(nil).should be_true
444
+ @seq2.include?(false).should be_true
445
+ @seq.include?("a").should be_false
446
+ end
447
+
448
+ it 'should raise error for replace method' do
449
+ expect { @collection.replace(["x", "y", "z"]) }.to raise_error(RuntimeError)
450
+ end
451
+
452
+ it 'should raise error for insert method' do
453
+ expect { @collection.insert(2, 99) }.to raise_error(RuntimeError)
454
+ expect { @collection.insert(-2, 1, 2, 3) }.to raise_error(RuntimeError)
455
+ end
456
+
457
+ it 'should return string representation' do
458
+ @collection.inspect.should == "[12, 23, 34, 45, 56, 67]"
459
+
460
+ @seq.inspect.should == "[12, 23, 34, 45, 56, 67]"
461
+ end
462
+
463
+ it 'should return joined string' do
464
+ @collection.join.should == "122334455667"
465
+ @collection.join(", ").should == "12, 23, 34, 45, 56, 67"
466
+
467
+ @seq.join.should == "122334455667"
468
+ @seq.join(", ").should == "12, 23, 34, 45, 56, 67"
469
+ end
470
+
471
+ it 'should raise error for keep_if and select! methods' do
472
+ expect { @collection.keep_if {|v| v == 0} }.to raise_error(RuntimeError)
473
+ expect { @collection.keep_if }.to raise_error(RuntimeError)
474
+ expect { @collection.select! {|v| v == 0} }.to raise_error(RuntimeError)
475
+ expect { @collection.select! }.to raise_error(RuntimeError)
476
+ end
477
+
478
+ it 'should return last elements' do
479
+ @collection.last.should == 67
480
+ @collection.last(2).should == [56, 67]
481
+
482
+ @seq.last.should == 67
483
+ @seq.last(2).should == [56, 67]
484
+ end
485
+ end
486
+
487
+ context Diametric::Persistence::Set do
488
+ before(:each) do
489
+ java_set = java.util.HashSet.new([0, 1, 2, 3, 4, 5, 6])
490
+ @set = Diametric::Persistence::Set.wrap(java_set)
491
+ java_set2 = java.util.HashSet.new([0, 11, 2, 3, 44, 5, 66])
492
+ @set2 = Diametric::Persistence::Set.wrap(java_set)
493
+ end
494
+
495
+ it 'should return intersection' do
496
+ @set.&(Set.new([3, 6, 9])).should == [3, 6].to_set
497
+ @set.intersection(Set.new([0, 4, 8])).should == [0, 4].to_set
498
+ end
499
+
500
+ it 'should return union' do
501
+ @set.|(Set.new([3, 6, 9])).should == [0, 1, 2, 3, 4, 5, 6, 9].to_set
502
+ @set.union(Set.new([0, 4, 8])).should == [0, 1, 2, 3, 4, 5, 6, 8].to_set
503
+ end
504
+
505
+ it 'should return length' do
506
+ @set.length.should == 7
507
+ @set.size.should == 7
508
+ end
509
+
510
+ it 'should return false for empty test' do
511
+ @set.empty?.should == false
512
+ end
513
+
514
+ it 'should test inclusion' do
515
+ @set.include?(3).should == true
516
+ @set.include?(-1).should == false
517
+ end
518
+
519
+ it 'should return first element' do
520
+ [0, 1, 2, 3, 4, 5, 6].should include(@set.first)
521
+ end
522
+
523
+ it 'should iterate elements' do
524
+ @set.each do |e|
525
+ [0, 1, 2, 3, 4, 5, 6].should include(e)
526
+ end
527
+ end
528
+
529
+ it 'should return collected array' do
530
+ ret = @set.collect { |i| i * i }
531
+ ret.should =~ [0, 1, 4, 9, 16, 25, 36]
532
+ end
533
+
534
+ it 'should group the element' do
535
+ ret = @set.group_by { |i| i % 3 }
536
+ ret[0].should =~ [0, 3, 6]
537
+ ret[1].should =~ [1, 4]
538
+ ret[2].should =~ [2, 5]
539
+ end
540
+
541
+ it 'should group by the length' do
542
+ s = java.util.HashSet.new(["Homer", "Marge", "Bart", "Lisa", "Abraham", "Herb"])
543
+ set_of_words = Diametric::Persistence::Set.wrap(s)
544
+ ret = set_of_words.group_by {|w| w.length }
545
+ ret[4].should =~ ["Bart", "Lisa", "Herb"]
546
+ ret[5].should =~ ["Homer", "Marge"]
547
+ ret[7].should =~ ["Abraham"]
548
+ end
549
+
550
+ it 'should group each array by the first element' do
551
+ s = java.util.HashSet.new([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
552
+ set_of_ary = Diametric::Persistence::Set.wrap(s)
553
+ ret = set_of_ary.group_by(&:first)
554
+ ret[1].should == [[1, 2, 3]]
555
+ ret[4].should == [[4, 5, 6]]
556
+ ret[7].should == [[7, 8, 9]]
557
+ end
558
+ end
142
559
  end
143
560
  end
144
561