divine 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/README.md +285 -2
  4. data/divine.gemspec +2 -2
  5. data/lib/divine.rb +0 -0
  6. data/lib/divine/code_generators/code_generator.rb +0 -0
  7. data/lib/divine/code_generators/csharp.rb +24 -50
  8. data/lib/divine/code_generators/java.rb +22 -28
  9. data/lib/divine/code_generators/javascript.rb +19 -33
  10. data/lib/divine/code_generators/ruby.rb +17 -34
  11. data/lib/divine/dsl.rb +47 -8
  12. data/lib/divine/graph_generator/graph_generator.rb +0 -0
  13. data/lib/divine/version.rb +1 -1
  14. data/test/basic_complex_test/basic_complex_test.rb +0 -0
  15. data/test/basic_complex_test/java_test/JavaTest.java +0 -0
  16. data/test/basic_complex_test/js_test/js_testBasic.js +1 -5
  17. data/test/basic_complex_test/js_test/js_testComplex.js +1 -5
  18. data/test/basic_complex_test/ruby_test/ruby_test.rb +0 -0
  19. data/test/binaryTree_test/binaryTree_test.rb +1 -0
  20. data/test/binaryTree_test/csharp_test/csharp_test.cs +8 -0
  21. data/test/binaryTree_test/graph.png +0 -0
  22. data/test/binaryTree_test/java_test/JavaTest.java +9 -0
  23. data/test/binaryTree_test/js_test/js_test.js +9 -5
  24. data/test/binaryTree_test/ruby_test/ruby_test.rb +10 -2
  25. data/test/complex_test/complex_test.rb +0 -0
  26. data/test/complex_test/csharp_test/csharp_test.cs +0 -0
  27. data/test/complex_test/graph.png +0 -0
  28. data/test/complex_test/java_test/JavaTest.java +0 -0
  29. data/test/complex_test/js_test/js_test.js +1 -5
  30. data/test/complex_test/ruby_test/ruby_test.rb +0 -0
  31. data/test/dynamic_int_test/csharp_test/csharp_test.cs +0 -0
  32. data/test/dynamic_int_test/dynamic_int_test.rb +0 -0
  33. data/test/dynamic_int_test/java_test/JavaTest.java +0 -0
  34. data/test/dynamic_int_test/js_test/js_test.js +1 -5
  35. data/test/dynamic_int_test/ruby_test/ruby_test.rb +0 -0
  36. data/test/ipv6_test/csharp_test/csharp_test.cs +0 -0
  37. data/test/ipv6_test/ipv6_test.rb +0 -0
  38. data/test/ipv6_test/java_test/JavaTest.java +0 -0
  39. data/test/ipv6_test/js_test/js_test.js +1 -5
  40. data/test/ipv6_test/ruby_test/ruby_test.rb +0 -0
  41. data/test/lib/csharp/nunit.framework.dll +0 -0
  42. data/test/lib/java/junit.jar +0 -0
  43. data/test/signed_int_test/csharp_test/csharp_test.cs +0 -0
  44. data/test/signed_int_test/java_test/JavaTest.java +0 -0
  45. data/test/signed_int_test/js_test/js_test.js +1 -5
  46. data/test/signed_int_test/ruby_test/ruby_test.rb +0 -0
  47. data/test/signed_int_test/signed_int_test.rb +0 -0
  48. data/test/unify_test/unify_test.rb +0 -0
  49. metadata +18 -34
  50. data/test/basic_complex_test/graph.jpg +0 -0
  51. data/test/dynamic_int_test/graph.jpg +0 -0
  52. data/test/ipv6_test/graph.jpg +0 -0
  53. data/test/signed_int_test/graph.jpg +0 -0
@@ -81,7 +81,7 @@ abstract class Divine <%= toplevel_class %> {
81
81
 
82
82
  protected String readString(ByteArrayInputStream data) throws IOException {
83
83
  // Force utf8
84
- return new String(readBytes(readInt16(data), data), UTF8);
84
+ return new String(readBytes((int)readDint63(data), data), UTF8);
85
85
  }
86
86
 
87
87
  private byte[] readBytes(int size, ByteArrayInputStream data) throws IOException {
@@ -91,19 +91,15 @@ abstract class Divine <%= toplevel_class %> {
91
91
  }
92
92
 
93
93
  protected byte[] readBinary(ByteArrayInputStream data) throws IOException {
94
- long c = readInt32(data);
94
+ long c = readDint63(data);
95
95
  if (c > Integer.MAX_VALUE) {
96
96
  throw new IndexOutOfBoundsException("Binary data to big for java");
97
97
  }
98
98
  return readBytes((int) c, data);
99
99
  }
100
100
 
101
- protected byte[] readShortBinary(ByteArrayInputStream data) throws IOException {
102
- return readBytes(readInt8(data), data);
103
- }
104
-
105
101
  protected String readIpNumber(ByteArrayInputStream data) throws IOException {
106
- byte[] ips = readShortBinary(data);
102
+ byte[] ips = readBytes(readInt8(data), data);
107
103
  if(ips.length == 4){
108
104
  return readIpv4Number(ips);
109
105
  } else{
@@ -207,8 +203,10 @@ abstract class Divine <%= toplevel_class %> {
207
203
 
208
204
  for (int i = bytes.length - 1; i >= 0; i--){
209
205
  String s = bytes[i];
210
- s += new String(new char[7 - s.length()]).replace("\\\\0", "0") + Math.min(i, 1);
211
- int t = Integer.parseInt(new StringBuffer(s).reverse().toString(), 2);
206
+ char[] zeros = new char[ 7 - s.length()];
207
+ Arrays.fill(zeros, '0');
208
+ s += new String(zeros) + Math.min(i, 1);
209
+ int t = Integer.parseInt(new StringBuffer(s).reverse().toString(), 2);
212
210
  this.writeInt8(t, out);
213
211
  }
214
212
  }
@@ -222,7 +220,7 @@ abstract class Divine <%= toplevel_class %> {
222
220
  if (bs.length > 0xFFFF) {
223
221
  raiseError("Too large string: " + bs.length + " bytes");
224
222
  }
225
- writeInt16(bs.length, out);
223
+ writeDint63(bs.length, out);
226
224
  out.write(bs);
227
225
  }
228
226
 
@@ -230,7 +228,7 @@ abstract class Divine <%= toplevel_class %> {
230
228
  if (v.length > 0xFFFFFFFFL) {
231
229
  raiseError("Too large binary: " + v.length + " bytes");
232
230
  }
233
- writeInt32(v.length, out);
231
+ writeDint63(v.length, out);
234
232
  out.write(v);
235
233
  }
236
234
 
@@ -245,14 +243,6 @@ abstract class Divine <%= toplevel_class %> {
245
243
  }
246
244
  }
247
245
 
248
- protected void writeShortBinary(byte[] v, ByteArrayOutputStream out) throws IOException {
249
- if (v.length > 0xFF) {
250
- raiseError("Too large short_binary: " + v.length + " bytes");
251
- }
252
- writeInt8(v.length, out);
253
- out.write(v);
254
- }
255
-
256
246
  protected void writeIpNumber(String v, ByteArrayOutputStream out) throws IOException {
257
247
  if(v.contains(":")){
258
248
  writeIpv6Number( v, out);
@@ -271,7 +261,8 @@ abstract class Divine <%= toplevel_class %> {
271
261
  }
272
262
  }
273
263
  if (ss.length == 0 || ss.length == 4) {
274
- writeShortBinary(ss, out);
264
+ writeInt8(ss.length, out);
265
+ out.write(ss);
275
266
  } else {
276
267
  raiseError("Unknown IP v4 number " + v); // Only IPv4 for now
277
268
  }
@@ -423,7 +414,6 @@ EOS
423
414
  # * string --> ""
424
415
  # * ip_number--> ""
425
416
  # * binary --> new Byte[0]
426
- # * short_binary --> new Byte[0]
427
417
  # * list --> new ArrayList<type>()
428
418
  # * map --> new HashMap<keyType, valueType>()
429
419
 
@@ -446,7 +436,7 @@ EOS
446
436
 
447
437
  else
448
438
  case types
449
- when :binary, :short_binary
439
+ when :binary
450
440
  is_reference_type ? "new Byte[0]" : "new byte[0]"
451
441
  when :int8, :int16, :sint32
452
442
  "0"
@@ -454,6 +444,8 @@ EOS
454
444
  "0L"
455
445
  when :string, :ip_number
456
446
  "\"\""
447
+ when :bool
448
+ false
457
449
  else
458
450
  if $all_structs[types]
459
451
  types
@@ -476,7 +468,6 @@ EOS
476
468
  # * string --> String
477
469
  # * ip_number--> String
478
470
  # * binary --> Byte[]
479
- # * short_binary --> Byte[]
480
471
  # * list --> ArrayList<type>
481
472
  # * map --> HashMap<keyType, valueType>
482
473
 
@@ -502,7 +493,7 @@ EOS
502
493
 
503
494
  else
504
495
  case types
505
- when :binary, :short_binary
496
+ when :binary
506
497
  is_reference_type ? "Byte[]" : "byte[]"
507
498
  when :int8, :int16, :sint32
508
499
  is_reference_type ? "Integer" : "int"
@@ -510,6 +501,8 @@ EOS
510
501
  is_reference_type ? "Long" : "long"
511
502
  when :string, :ip_number
512
503
  "String"
504
+ when :bool
505
+ "boolean"
513
506
  else
514
507
  if $all_structs[types]
515
508
  types
@@ -532,7 +525,7 @@ EOS
532
525
  nv = get_fresh_variable_name
533
526
  idx = get_fresh_variable_name
534
527
  return [
535
- "writeInt32(#{var}.size(), baos);",
528
+ "writeDint63(#{var}.size(), baos);",
536
529
  "for(int #{idx}=0; #{idx}<#{var}.size(); #{idx}++) {",
537
530
  :indent,
538
531
  "#{java_get_type_declaration types[1]} #{nv} = #{var}.get(#{idx});",
@@ -544,7 +537,7 @@ EOS
544
537
  nv1 = get_fresh_variable_name
545
538
  nv2 = get_fresh_variable_name
546
539
  return [
547
- "writeInt32(#{var}.size(), baos);",
540
+ "writeDint63(#{var}.size(), baos);",
548
541
  "for(#{java_get_type_declaration types[1]} #{nv1} : #{var}.keySet()) {",
549
542
  :indent,
550
543
  "#{java_get_type_declaration types[2]} #{nv2} = #{var}.get(#{nv1});",
@@ -583,7 +576,7 @@ EOS
583
576
  iter = get_fresh_variable_name
584
577
  return [
585
578
  "#{"#{java_get_type_declaration(types)} " unless var.include? "this."}#{var} = #{java_get_empty_declaration(types)};",
586
- "int #{count} = (int)this.readInt32(bais);",
579
+ "int #{count} = (int)this.readDint63(bais);",
587
580
  "for(int #{iter}=0; #{iter}<#{count}; #{iter}++) {",
588
581
  :indent,
589
582
  java_deserialize_internal(nv, types[1]),
@@ -597,7 +590,7 @@ EOS
597
590
  nv2 = get_fresh_variable_name
598
591
  iter = get_fresh_variable_name
599
592
  return ["#{"#{java_get_type_declaration(types)} " unless var.include? "this."}#{var} = #{java_get_empty_declaration(types)};",
600
- "int #{count} = (int)readInt32(bais);",
593
+ "int #{count} = (int)readDint63(bais);",
601
594
  "for(int #{iter}=0; #{iter}<#{count}; #{iter}++) {",
602
595
  :indent,
603
596
  java_deserialize_internal(nv1, types[1]),
@@ -684,6 +677,7 @@ EOS
684
677
  "java.io.ByteArrayOutputStream",
685
678
  "java.io.IOException",
686
679
  "java.util.ArrayList",
680
+ "java.util.Arrays",
687
681
  "java.util.HashMap",
688
682
  "java.util.regex.Pattern",
689
683
  "java.nio.charset.Charset"
@@ -150,16 +150,16 @@ DivineHelper.prototype.read_dint63 = function (data) {
150
150
  return val;
151
151
  }
152
152
 
153
- DivineHelper.prototype.read_binary = function (data) {
154
- return data.read(this.read_int32(data));
155
- };
153
+ DivineHelper.prototype.read_bool = function (data) {
154
+ return this.read_int8(data) == 1;
155
+ }
156
156
 
157
- DivineHelper.prototype.read_short_binary = function (data) {
158
- return data.read(this.read_int8(data));
157
+ DivineHelper.prototype.read_binary = function (data) {
158
+ return data.read(this.read_dint63(data));
159
159
  };
160
160
 
161
161
  DivineHelper.prototype.read_ip_number = function (data) {
162
- var ip_array = this.read_short_binary(data);
162
+ var ip_array = data.read(this.read_int8(data));
163
163
  if(ip_array.length == 4){
164
164
  return this.read_ipv4_number(ip_array);
165
165
  }else{
@@ -194,7 +194,7 @@ DivineHelper.prototype.read_ipv6_number = function (ip_array) {
194
194
  };
195
195
 
196
196
  DivineHelper.prototype.read_string = function (data) {
197
- return this.decode_utf8(data.read(this.read_int16(data)))
197
+ return this.decode_utf8(data.read(this.read_dint63(data)))
198
198
  };
199
199
 
200
200
  DivineHelper.prototype.write_int8 = function (v, out) {
@@ -290,18 +290,18 @@ DivineHelper.prototype.write_bool = function (v, out) {
290
290
  DivineHelper.prototype.write_string = function (v, out) {
291
291
  var s = this.encode_utf8(v);
292
292
  if (s.length > 0xFFFF) this.raise_error("Too large string: " + s.length + " bytes");
293
- this.write_int16(s.length, out);
293
+ this.write_dint63(s.length, out);
294
294
  out.write(s);
295
295
  }
296
296
 
297
297
  DivineHelper.prototype.write_binary = function (v, out) {
298
298
  if ((v instanceof Array) || (v instanceof Uint8Array)) {
299
299
  if (v.length > 0xFFFFFFFF) this.raise_error("Too large binary: " + v.length + " (" + v.constructor.name + ")");
300
- this.write_int32(v.length, out)
300
+ this.write_dint63(v.length, out)
301
301
  out.write(v);
302
302
  } else if (v.constructor == String) {
303
303
  if (v.length > 0xFFFFFFFF) this.raise_error("Too large binary: " + v.length + " (" + v.constructor.name + ")");
304
- this.write_int32(v.length, out)
304
+ this.write_dint63(v.length, out)
305
305
  out.write(v);
306
306
  } else if (v == null) {
307
307
  this.raise_error("Unsupported binary 'null'");
@@ -325,22 +325,6 @@ DivineHelper.prototype.write_16_binary = function (v, out) {
325
325
  }
326
326
  }
327
327
 
328
- DivineHelper.prototype.write_short_binary = function (v, out) {
329
- if ((v instanceof Array) || (v instanceof Uint8Array)) {
330
- if (v.length > 0xFF) this.raise_error("Too large binary: " + v.length + " (" + v.constructor.name + ")");
331
- this.write_int8(v.length, out)
332
- out.write(v);
333
- } else if (v.constructor == String) {
334
- if (v.length > 0xFF) this.raise_error("Too large binary: " + v.length + " (" + v.constructor.name + ")");
335
- this.write_int8(v.length, out)
336
- out.write(v);
337
- } else if (v == null) {
338
- this.raise_error("Unsupported binary 'null'");
339
- } else {
340
- this.raise_error("Unsupported binary of type '" + v.constructor.name + "'");
341
- }
342
- }
343
-
344
328
  DivineHelper.prototype.write_ip_number = function (v, out) {
345
329
  if ((v instanceof Array) || (v instanceof Uint8Array)){
346
330
  if(v.length == 4){
@@ -362,7 +346,8 @@ DivineHelper.prototype.write_ip_number = function (v, out) {
362
346
  DivineHelper.prototype.write_ipv4_number = function (v, out) {
363
347
  if ((v instanceof Array) || (v instanceof Uint8Array)) {
364
348
  if (v.length != 4 && v.length != 0) this.raise_error("Unknown IP v4 number " + v);
365
- this.write_short_binary(v, out)
349
+ this.write_int8(v.length, out)
350
+ out.write(v);
366
351
  } else if (v.constructor == String) {
367
352
  var ss = [];
368
353
  if (v.length > 0) {
@@ -615,13 +600,12 @@ EOS
615
600
  # * string --> ""
616
601
  # * ip_number--> ""
617
602
  # * binary --> []
618
- # * short_binary --> []
619
603
  # * list --> []
620
604
  # * map --> {}
621
605
 
622
606
  def javascript_get_empty_declaration(field)
623
607
  case field.type
624
- when :list, :binary, :short_binary
608
+ when :list, :binary
625
609
  "[]"
626
610
  when :map
627
611
  "{}"
@@ -629,6 +613,8 @@ EOS
629
613
  "0"
630
614
  when :string, :ip_number
631
615
  "\"\""
616
+ when :bool
617
+ false
632
618
  else
633
619
  raise "Unkown field type #{field.type}"
634
620
  end
@@ -647,7 +633,7 @@ EOS
647
633
  nv = get_fresh_variable_name
648
634
  idx = get_fresh_variable_name
649
635
  return [
650
- "this.write_int32(#{var}.length, out);",
636
+ "this.write_dint63(#{var}.length, out);",
651
637
  "for(var #{idx}=0; #{idx}<#{var}.length; #{idx}++) {",
652
638
  :indent,
653
639
  "var #{nv} = #{var}[#{idx}];",
@@ -662,7 +648,7 @@ EOS
662
648
  key = get_fresh_variable_name
663
649
  return [
664
650
  "var #{len} = Object.keys(#{var}).length;",
665
- "this.write_int32(#{len}, out);",
651
+ "this.write_dint63(#{len}, out);",
666
652
  "for(var #{nv1} in #{var}) {",
667
653
  :indent,
668
654
  "var #{nv2} = #{var}[#{nv1}];",
@@ -702,7 +688,7 @@ EOS
702
688
  iter = get_fresh_variable_name
703
689
  return [
704
690
  "#{"var " unless var.include? "this."}#{var} = [];",
705
- "var #{count} = this.read_int32(data);",
691
+ "var #{count} = this.read_dint63(data);",
706
692
  "for(var #{iter}=0; #{iter}<#{count}; #{iter}++) {",
707
693
  :indent,
708
694
  javascript_deserialize_internal(nv, types[1]),
@@ -716,7 +702,7 @@ EOS
716
702
  nv2 = get_fresh_variable_name
717
703
  iter = get_fresh_variable_name
718
704
  return ["#{"var " unless var.include? "this."}#{var} = {};",
719
- "var #{count} = this.read_int32(data);",
705
+ "var #{count} = this.read_dint63(data);",
720
706
  "for(var #{iter}=0; #{iter}<#{count}; #{iter}++) {",
721
707
  :indent,
722
708
  javascript_deserialize_internal(nv1, types[1]),
@@ -86,19 +86,15 @@ module Divine
86
86
  end
87
87
 
88
88
  def read_string(data)
89
- data.read(read_int16(data)).force_encoding('UTF-8')
89
+ data.read(read_dint63(data)).force_encoding('UTF-8')
90
90
  end
91
91
 
92
92
  def read_binary(data)
93
- data.read(read_int32(data))
94
- end
95
-
96
- def read_short_binary(data)
97
- data.read(read_int8(data))
93
+ data.read(read_dint63(data))
98
94
  end
99
95
 
100
96
  def read_ip_number(data)
101
- ips = read_short_binary(data)
97
+ ips = data.read(read_int8(data))
102
98
  if ips.size == 4
103
99
  read_ipv4_number(ips)
104
100
  else
@@ -200,20 +196,20 @@ module Divine
200
196
  def write_string(v, out)
201
197
  s = force_to_utf8_string(v)
202
198
  raise_error "Too large string: #{s.bytesize} bytes" if s.bytesize > 0xFFFF
203
- write_int16(s.bytesize, out)
199
+ write_dint63(s.bytesize, out)
204
200
  out << s.bytes.to_a
205
201
  end
206
202
 
207
203
  def write_binary(v, out)
208
204
  if v.is_a?(Array)
209
205
  raise_error "Too large binary: #{v.size} (#{v.class.name})" unless v.size < 0xFFFFFFFF
210
- write_int32(v.size, out)
206
+ write_dint63(v.size, out)
211
207
  v.each do |x|
212
208
  write_int8(x, out)
213
209
  end
214
210
  elsif v.is_a?(String)
215
211
  raise_error "Too large binary: #{v.size} (#{v.class.name})" unless v.size < 0xFFFFFFFF
216
- write_int32(v.size, out)
212
+ write_dint63(v.size, out)
217
213
  out << v.bytes.to_a
218
214
  else
219
215
  raise_error "Unsupported binary 'nil'" if v == nil
@@ -234,23 +230,6 @@ module Divine
234
230
  end
235
231
  end
236
232
 
237
- def write_short_binary(v, out)
238
- if v.is_a?(Array)
239
- raise_error "Too large short_binary: #{v.size} (#{v.class.name})" unless v.size < 0xFF
240
- write_int8(v.size, out)
241
- v.each do |x|
242
- write_int8(x, out)
243
- end
244
- elsif v.is_a?(String)
245
- raise_error "To large short_binary: #{v.size} (#{v.class.name})" unless v.size < 0xFF
246
- write_int8(v.size, out)
247
- out << v.bytes.to_a
248
- else
249
- raise_error "Unsupported binary 'nil'" if v == nil
250
- raise_error "Unsupported binary of type '#{v.class.name}'"
251
- end
252
- end
253
-
254
233
  def write_ip_number(v, out)
255
234
  if v.is_a?(Array)
256
235
  if v.size == 4
@@ -272,7 +251,10 @@ module Divine
272
251
  def write_ipv4_number(v,out)
273
252
  if v.is_a?(Array)
274
253
  raise_error "Unknown IP v4 number #{v}" unless v.size == 0 || v.size == 4 # Only IPv4 for now
275
- write_short_binary(v, out)
254
+ write_int8(v.size, out)
255
+ v.each do |x|
256
+ write_int8(x, out)
257
+ end
276
258
  elsif v.is_a?(String)
277
259
  ss = v.split(/\./).map do |s|
278
260
  s.to_i
@@ -431,13 +413,12 @@ module Divine
431
413
  # * string --> ""
432
414
  # * ip_number--> ""
433
415
  # * binary --> []
434
- # * short_binary --> []
435
416
  # * list --> []
436
417
  # * map --> {}
437
418
 
438
419
  def ruby_get_empty_declaration(field)
439
420
  case field.type
440
- when :list, :binary, :short_binary
421
+ when :list, :binary
441
422
  "[]"
442
423
  when :map
443
424
  "{}"
@@ -445,6 +426,8 @@ module Divine
445
426
  "0"
446
427
  when :string, :ip_number
447
428
  "\"\""
429
+ when :bool
430
+ false
448
431
  else
449
432
  raise "Unkown field type #{field.type}"
450
433
  end
@@ -462,7 +445,7 @@ module Divine
462
445
  when :list
463
446
  nv = get_fresh_variable_name
464
447
  return [
465
- "write_int32(#{var}.size, out)",
448
+ "write_dint63(#{var}.size, out)",
466
449
  "#{var}.each do |#{nv}|",
467
450
  :indent,
468
451
  ruby_serialize_internal(nv, types[1]),
@@ -473,7 +456,7 @@ module Divine
473
456
  nv1 = get_fresh_variable_name
474
457
  nv2 = get_fresh_variable_name
475
458
  return [
476
- "write_int32(#{var}.size, out)",
459
+ "write_dint63(#{var}.size, out)",
477
460
  "#{var}.each_pair do |#{nv1}, #{nv2}|",
478
461
  :indent,
479
462
  ruby_serialize_internal(nv1, types[1]),
@@ -511,7 +494,7 @@ module Divine
511
494
  nv = get_fresh_variable_name
512
495
  return [
513
496
  "#{var} = []",
514
- "#{count} = read_int32(data)",
497
+ "#{count} = read_dint63(data)",
515
498
  "(1..#{count}).each do",
516
499
  :indent,
517
500
  ruby_deserialize_internal(nv, types[1]),
@@ -524,7 +507,7 @@ module Divine
524
507
  nv1 = get_fresh_variable_name
525
508
  nv2 = get_fresh_variable_name
526
509
  return ["#{var} = {}",
527
- "#{count} = read_int32(data)",
510
+ "#{count} = read_dint63(data)",
528
511
  "(1..#{count}).each do",
529
512
  :indent,
530
513
  ruby_deserialize_internal(nv1, types[1]),