divine 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -14
- data/README.md +25 -0
- data/Rakefile +34 -19
- data/divine.gemspec +1 -0
- data/lib/divine.rb +3 -1
- data/lib/divine/code_generators/code_generator.rb +51 -1
- data/lib/divine/code_generators/csharp.rb +898 -0
- data/lib/divine/code_generators/java.rb +125 -13
- data/lib/divine/code_generators/javascript.rb +111 -4
- data/lib/divine/code_generators/ruby.rb +103 -9
- data/lib/divine/dsl.rb +95 -6
- data/lib/divine/graph_generator/graph_generator.rb +81 -0
- data/lib/divine/version.rb +2 -1
- data/test/basic_complex_test/basic_complex_test.rb +5 -0
- data/test/basic_complex_test/graph.jpg +0 -0
- data/test/basic_complex_test/java_test/JavaTest.java +1 -1
- data/test/basic_complex_test/ruby_test/ruby_test.rb +17 -4
- data/test/binaryTree_test/binaryTree_test.rb +5 -0
- data/test/binaryTree_test/csharp_test/csharp_test.cs +99 -0
- data/test/binaryTree_test/graph.png +0 -0
- data/test/binaryTree_test/java_test/JavaTest.java +1 -1
- data/test/binaryTree_test/ruby_test/ruby_test.rb +26 -3
- data/test/complex_test/complex_test.rb +5 -0
- data/test/complex_test/csharp_test/csharp_test.cs +109 -0
- data/test/complex_test/graph.png +0 -0
- data/test/complex_test/java_test/JavaTest.java +1 -1
- data/test/complex_test/ruby_test/ruby_test.rb +24 -1
- data/test/dynamic_int_test/csharp_test/csharp_test.cs +76 -0
- data/test/dynamic_int_test/dynamic_int_test.rb +20 -0
- data/test/dynamic_int_test/graph.jpg +0 -0
- data/test/dynamic_int_test/java_test/JavaTest.java +72 -0
- data/test/dynamic_int_test/js_test/js_test.js +54 -0
- data/test/dynamic_int_test/ruby_test/ruby_test.rb +55 -0
- data/test/ipv6_test/csharp_test/csharp_test.cs +73 -0
- data/test/ipv6_test/graph.jpg +0 -0
- data/test/ipv6_test/ipv6_test.rb +5 -0
- data/test/ipv6_test/java_test/JavaTest.java +1 -1
- data/test/ipv6_test/ruby_test/ruby_test.rb +24 -4
- data/test/lib/csharp/nunit.framework.dll +0 -0
- data/test/{java_lib → lib/java}/junit.jar +0 -0
- data/test/signed_int_test/csharp_test/csharp_test.cs +86 -0
- data/test/signed_int_test/graph.jpg +0 -0
- data/test/signed_int_test/java_test/JavaTest.java +1 -1
- data/test/signed_int_test/ruby_test/ruby_test.rb +21 -1
- data/test/signed_int_test/signed_int_test.rb +6 -0
- data/test/unify_test/unify_test.rb +17 -4
- metadata +54 -8
- data/test/signed_float_test/ruby_test/ruby_test.rb +0 -36
- data/test/signed_float_test/signed_float_test.rb +0 -14
data/lib/divine/dsl.rb
CHANGED
@@ -1,39 +1,73 @@
|
|
1
1
|
module Divine
|
2
|
+
# Contains all defined structs
|
2
3
|
$all_structs = {}
|
3
4
|
|
5
|
+
#
|
6
|
+
# Encapsulation basic struct information
|
7
|
+
#
|
4
8
|
class StructDefinition
|
9
|
+
|
5
10
|
def initialize(owner, type, args)
|
6
11
|
@owner = owner
|
7
12
|
@type = type
|
8
13
|
@args = args
|
9
14
|
end
|
10
15
|
|
16
|
+
#
|
17
|
+
# Get struct's name
|
18
|
+
#
|
11
19
|
def name
|
12
20
|
@args.first
|
13
21
|
end
|
14
|
-
|
22
|
+
|
15
23
|
def type
|
16
24
|
@type
|
17
25
|
end
|
18
|
-
|
26
|
+
|
27
|
+
#
|
28
|
+
# Get struct's version
|
29
|
+
#
|
19
30
|
def version
|
20
31
|
@owner.version
|
21
32
|
end
|
22
|
-
|
33
|
+
|
34
|
+
#
|
35
|
+
# Represents strut as string
|
36
|
+
#
|
23
37
|
def to_s
|
24
38
|
"#{@owner.name}: #{self.type} #{self.name} (#{self.class.name}, #{@args.inspect})"
|
25
39
|
end
|
26
40
|
end
|
27
41
|
|
42
|
+
#
|
43
|
+
# Encapsulation simple struct information
|
44
|
+
#
|
28
45
|
class SimpleDefinition < StructDefinition
|
46
|
+
#
|
47
|
+
# Ask if the struct is simple.
|
48
|
+
# * +Return+ : True
|
29
49
|
def simple?; true; end
|
50
|
+
|
51
|
+
#
|
52
|
+
# Get types used in the struct
|
53
|
+
#
|
30
54
|
def referenced_types
|
31
55
|
[@type]
|
32
56
|
end
|
33
57
|
end
|
34
58
|
|
59
|
+
#
|
60
|
+
# Encapsulation complex struct information
|
61
|
+
#
|
35
62
|
class ComplexDefinition < StructDefinition
|
63
|
+
#
|
64
|
+
# Ask if the struct is simple.
|
65
|
+
# * *Return* : False
|
36
66
|
def simple?; false; end
|
67
|
+
|
68
|
+
#
|
69
|
+
# Get types used in the struct
|
70
|
+
#
|
37
71
|
def referenced_types
|
38
72
|
fs = referenced_types_internal.map do |t|
|
39
73
|
if t.is_a? StructBuilder
|
@@ -48,48 +82,100 @@ module Divine
|
|
48
82
|
end
|
49
83
|
end
|
50
84
|
|
85
|
+
#
|
86
|
+
# Encapsulation for dynamic integer date type
|
87
|
+
#
|
88
|
+
class DynamicInteger63Definition < SimpleDefinition
|
89
|
+
end
|
90
|
+
|
91
|
+
#
|
92
|
+
# Encapsulation for signed integer 64-bit date type
|
93
|
+
#
|
51
94
|
class SInteger64Definition < SimpleDefinition
|
52
95
|
end
|
53
96
|
|
97
|
+
#
|
98
|
+
# Encapsulation for signed integer 32-bit date type
|
99
|
+
#
|
54
100
|
class SInteger32Definition < SimpleDefinition
|
55
101
|
end
|
56
102
|
|
103
|
+
#
|
104
|
+
# Encapsulation for unsigned integer 32-bit date type
|
105
|
+
#
|
57
106
|
class Integer32Definition < SimpleDefinition
|
58
107
|
end
|
59
108
|
|
109
|
+
#
|
110
|
+
# Encapsulation for unsigned integer 24-bit
|
111
|
+
#
|
60
112
|
class Integer24Definition < SimpleDefinition
|
61
113
|
end
|
62
114
|
|
115
|
+
#
|
116
|
+
# Encapsulation for unsigned integer 16-bit data type
|
117
|
+
#
|
63
118
|
class Integer16Definition < SimpleDefinition
|
64
119
|
end
|
65
120
|
|
121
|
+
#
|
122
|
+
# Encapsulation for unsigned integer 8-bit data type
|
123
|
+
#
|
66
124
|
class Integer8Definition < SimpleDefinition
|
67
125
|
end
|
68
126
|
|
127
|
+
#
|
128
|
+
# Encapsulation for binary data type
|
129
|
+
#
|
69
130
|
class BinaryDefinition < SimpleDefinition
|
70
131
|
end
|
71
132
|
|
133
|
+
#
|
134
|
+
# Encapsulation for short binary data type
|
135
|
+
#
|
72
136
|
class ShortBinaryDefinition < SimpleDefinition # Shorted than 256 bytes
|
73
137
|
end
|
74
138
|
|
139
|
+
#
|
140
|
+
# Encapsulation for string data type
|
141
|
+
#
|
75
142
|
class StringDefinition < SimpleDefinition
|
76
143
|
end
|
77
144
|
|
145
|
+
#
|
146
|
+
# Encapsulation for boolean data type
|
147
|
+
#
|
78
148
|
class BooleanDefinition < SimpleDefinition
|
79
149
|
end
|
80
150
|
|
151
|
+
#
|
152
|
+
# Encapsulation for IP(v4 & v6) data type
|
153
|
+
#
|
81
154
|
class IpNumberDefinition < SimpleDefinition
|
82
155
|
end
|
83
156
|
|
84
|
-
|
157
|
+
#
|
158
|
+
# Encapsulation for list data type
|
159
|
+
#
|
85
160
|
class ListDefinition < ComplexDefinition
|
161
|
+
|
162
|
+
#
|
163
|
+
# Return internal types contained in current list
|
164
|
+
#
|
86
165
|
protected
|
87
166
|
def referenced_types_internal
|
88
167
|
[@args[1]]
|
89
168
|
end
|
90
169
|
end
|
91
170
|
|
171
|
+
#
|
172
|
+
# Encapsulation for map[dictionary] data type
|
173
|
+
#
|
92
174
|
class MapDefinition < ComplexDefinition
|
175
|
+
|
176
|
+
#
|
177
|
+
# Return internal types contained in current map
|
178
|
+
#
|
93
179
|
protected
|
94
180
|
def referenced_types_internal
|
95
181
|
[@args[1], @args[2]]
|
@@ -97,8 +183,9 @@ module Divine
|
|
97
183
|
end
|
98
184
|
|
99
185
|
|
100
|
-
|
186
|
+
# Contains all supported data type
|
101
187
|
$available_types = {
|
188
|
+
dint63: DynamicInteger63Definition,
|
102
189
|
sint64: SInteger64Definition,
|
103
190
|
sint32: SInteger32Definition,
|
104
191
|
int32: Integer32Definition,
|
@@ -114,7 +201,9 @@ module Divine
|
|
114
201
|
ip_number: IpNumberDefinition
|
115
202
|
}
|
116
203
|
|
117
|
-
|
204
|
+
#
|
205
|
+
# Responsible for building structs
|
206
|
+
#
|
118
207
|
class StructBuilder
|
119
208
|
# Name = name of the struct
|
120
209
|
# Version = struct version (not currently used)
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'graphviz'
|
2
|
+
|
3
|
+
module Divine
|
4
|
+
|
5
|
+
#
|
6
|
+
# Responsible for drawing ERD diagram corresponding to structs
|
7
|
+
#
|
8
|
+
class GraphGenerator
|
9
|
+
|
10
|
+
#
|
11
|
+
# Draw Graph for current structs on $all_structs
|
12
|
+
# * *Args* :
|
13
|
+
# -path- -> target path
|
14
|
+
def draw(path = "", file_name = "graph", format = "jpg")
|
15
|
+
@relations = {}
|
16
|
+
@nodes_map = {}
|
17
|
+
@graph = GraphViz.new( :G, :type => :digraph )
|
18
|
+
$all_structs.keys.each do |k|
|
19
|
+
name = "Struct: #{k}"
|
20
|
+
content = "Temp Contents"
|
21
|
+
simple_fields = ""
|
22
|
+
complex_fields = ""
|
23
|
+
$all_structs[k][0].simple_fields.each { |f|
|
24
|
+
simple_fields << "#{f.name}: #{f.type}\n"
|
25
|
+
}
|
26
|
+
$all_structs[k][0].complex_fields.each { |f|
|
27
|
+
type = f.referenced_types.to_s.gsub(':','').gsub("[list,", "list[").gsub("[map,", "map[").gsub(/[\s]*/, "").gsub("[", "<").gsub("]", ">")
|
28
|
+
$all_structs.keys.each do |l|
|
29
|
+
if type.include?(l.to_s)
|
30
|
+
addRelation(l, k)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
complex_fields << "#{f.name}: #{type}\n"
|
34
|
+
}
|
35
|
+
content = simple_fields + complex_fields
|
36
|
+
@nodes_map[k] = addNode(name, content)
|
37
|
+
end
|
38
|
+
|
39
|
+
addLinks()
|
40
|
+
|
41
|
+
# Generate output image
|
42
|
+
@graph.output( format.to_sym => File.join(path, "#{file_name}.#{format}") )
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
#
|
47
|
+
# Add node to the graph
|
48
|
+
# * *Args* :
|
49
|
+
# -struct_name- -> struct name
|
50
|
+
# -struct_content- -> struct contents "Fields"
|
51
|
+
def addNode(struct_name, struct_content)
|
52
|
+
@graph.add_nodes( "{ #{struct_name} | #{struct_content} }", "shape" => "record", "style" => "rounded")
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
#
|
57
|
+
# Build links from relation map
|
58
|
+
#
|
59
|
+
def addLinks()
|
60
|
+
@relations.each_pair do |src, trgs|
|
61
|
+
trgs.each { |trg|
|
62
|
+
@graph.add_edges( @nodes_map[trg], @nodes_map[src] )
|
63
|
+
}
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
#
|
68
|
+
# Add relation between nodes
|
69
|
+
# * *Args* :
|
70
|
+
# -src- -> the source struct
|
71
|
+
# -trg- -> the target struct
|
72
|
+
def addRelation(src, trg)
|
73
|
+
if @relations.keys.include?(src)
|
74
|
+
@relations[src].push(trg)
|
75
|
+
else
|
76
|
+
@relations[src] = [trg]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
data/lib/divine/version.rb
CHANGED
@@ -24,11 +24,16 @@ struct(:TestComplex) {
|
|
24
24
|
}
|
25
25
|
}
|
26
26
|
|
27
|
+
# Draw ERD for prev. structs
|
28
|
+
Divine::GraphGenerator.new.draw("test/basic_complex_test/")
|
29
|
+
|
27
30
|
if ARGV[0] == "ruby"
|
28
31
|
Divine::CodeGenerator.new.generate(:ruby, file: 'test_babel.rb', module: 'BabelTest', parent_class: "Object", target_dir: 'test/basic_complex_test/ruby_test')
|
29
32
|
elsif ARGV[0] == "js"
|
30
33
|
Divine::CodeGenerator.new.generate(:javascript, file: 'test_babel.js', target_dir: 'test/basic_complex_test/js_test')
|
31
34
|
elsif ARGV[0] == "java"
|
32
35
|
Divine::CodeGenerator.new.generate(:java, file: 'test_babel.java', target_dir: 'test/basic_complex_test/java_test')
|
36
|
+
elsif ARGV[0] == "csharp"
|
37
|
+
#Divine::CodeGenerator.new.generate(:csharp, file: 'test_babel.cs', target_dir: "test/basic_complex_test/csharp_test")
|
33
38
|
end
|
34
39
|
|
Binary file
|
@@ -72,7 +72,7 @@ public class JavaTest {
|
|
72
72
|
|
73
73
|
}
|
74
74
|
|
75
|
-
public void serialize(
|
75
|
+
public void serialize(Divine obj) throws IOException {
|
76
76
|
byte[] data = obj.serialize();
|
77
77
|
File file = new File("test/basic_complex_test/java_test/bin.babel");
|
78
78
|
try {
|
@@ -1,12 +1,14 @@
|
|
1
1
|
require_relative 'test_babel.rb'
|
2
2
|
require 'minitest/autorun'
|
3
3
|
|
4
|
+
#
|
5
|
+
# Responsible for testing basic and complex structure
|
6
|
+
#
|
4
7
|
class TestBabelTestBasic < MiniTest::Unit::TestCase
|
5
8
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
9
|
+
#
|
10
|
+
# Compare objects after serialize and deserialize operations "simple structure"
|
11
|
+
#
|
10
12
|
def test_basic
|
11
13
|
puts "Basic Test"
|
12
14
|
testbasic_ser = BabelTest::TestBasic.new
|
@@ -32,6 +34,9 @@ class TestBabelTestBasic < MiniTest::Unit::TestCase
|
|
32
34
|
assert_equal testbasic_ser.guid , testbasic_deser.guid
|
33
35
|
end
|
34
36
|
|
37
|
+
#
|
38
|
+
# Compare objects after serialize and deserialize operations "complex structure"
|
39
|
+
#
|
35
40
|
def test_complex
|
36
41
|
testcomplex_ser = BabelTest::TestComplex.new
|
37
42
|
testcomplex_ser.list1 = [0, 1, 255, 0x7FFFFFFF, 0x7FFFFFFF+1, 0xFFFFFFFE, 0xFFFFFFFF]
|
@@ -56,12 +61,20 @@ class TestBabelTestBasic < MiniTest::Unit::TestCase
|
|
56
61
|
end
|
57
62
|
end
|
58
63
|
|
64
|
+
#
|
65
|
+
# Write binary data to file
|
66
|
+
# * *Args* :
|
67
|
+
# -data- --> bytes to be written
|
68
|
+
#
|
59
69
|
def serialize(data)
|
60
70
|
File.open("test/basic_complex_test/ruby_test/bin.babel.rb", "w+b") do |f|
|
61
71
|
f.write(data)
|
62
72
|
end
|
63
73
|
end
|
64
74
|
|
75
|
+
#
|
76
|
+
# Read file in binary mode and return its bytes content
|
77
|
+
#
|
65
78
|
def deserialize()
|
66
79
|
mem_buf = File.new('test/basic_complex_test/ruby_test/bin.babel.rb').binmode
|
67
80
|
end
|
@@ -10,10 +10,15 @@ struct 'BinaryTree' do
|
|
10
10
|
list :root_node, :Node # List of root node of size equals to 1.
|
11
11
|
end
|
12
12
|
|
13
|
+
# Draw ERD for prev. structs
|
14
|
+
Divine::GraphGenerator.new.draw("test/binaryTree_test/", "graph", "png")
|
15
|
+
|
13
16
|
if ARGV[0] == "ruby"
|
14
17
|
Divine::CodeGenerator.new.generate(:ruby, file: 'test_binaryTree.rb', module: 'BabelTest', parent_class: "Object", target_dir: 'test/binaryTree_test/ruby_test')
|
15
18
|
elsif ARGV[0] == "js"
|
16
19
|
Divine::CodeGenerator.new.generate(:javascript, file: 'test_binaryTree.js', target_dir: 'test/binaryTree_test/js_test')
|
17
20
|
elsif ARGV[0] == "java"
|
18
21
|
Divine::CodeGenerator.new.generate(:java, file: 'test_binaryTree.java', target_dir: 'test/binaryTree_test/java_test')
|
22
|
+
elsif ARGV[0] == "csharp"
|
23
|
+
Divine::CodeGenerator.new.generate(:csharp, file: 'test_binaryTree.cs', target_dir: "test/binaryTree_test/csharp_test")
|
19
24
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
using System;
|
2
|
+
using System.Collections.Generic;
|
3
|
+
using System.Text;
|
4
|
+
using System.IO;
|
5
|
+
using divine;
|
6
|
+
using NUnit.Framework;
|
7
|
+
|
8
|
+
namespace test_signed_int
|
9
|
+
{
|
10
|
+
[TestFixture]
|
11
|
+
class divine
|
12
|
+
{
|
13
|
+
[Test]
|
14
|
+
public static void Main(String[] args)
|
15
|
+
{
|
16
|
+
System.Console.Write("Test Binary Tree \n");
|
17
|
+
BinaryTree ser = buildObj();
|
18
|
+
serialize(ser);
|
19
|
+
byte[] res = deserialize();
|
20
|
+
|
21
|
+
BinaryTree deser = new BinaryTree();
|
22
|
+
deser.deserialize(new MemoryStream(res));
|
23
|
+
|
24
|
+
compare(ser, deser);
|
25
|
+
}
|
26
|
+
|
27
|
+
public static BinaryTree buildObj() {
|
28
|
+
Node root = new Node();
|
29
|
+
root.i32 = 0;
|
30
|
+
|
31
|
+
Node n1_L = new Node();
|
32
|
+
n1_L.i32 = 1;
|
33
|
+
|
34
|
+
Node n1_R = new Node();
|
35
|
+
n1_R.i32 = 2;
|
36
|
+
|
37
|
+
Node n2_L_L = new Node();
|
38
|
+
n2_L_L.i32 = 3;
|
39
|
+
|
40
|
+
Node n2_L_R = new Node();
|
41
|
+
n2_L_R.i32 = 4;
|
42
|
+
|
43
|
+
Node n2_R_L = new Node();
|
44
|
+
n2_R_L.i32 = 5;
|
45
|
+
|
46
|
+
Node n2_R_R = new Node();
|
47
|
+
n2_R_R.i32 = 6;
|
48
|
+
|
49
|
+
root.next_node.Add(n1_L);
|
50
|
+
root.next_node.Add(n1_R);
|
51
|
+
|
52
|
+
n1_L.next_node.Add(n2_L_L);
|
53
|
+
n1_L.next_node.Add(n2_L_R);
|
54
|
+
|
55
|
+
n1_R.next_node.Add(n2_R_L);
|
56
|
+
n1_R.next_node.Add(n2_R_R);
|
57
|
+
|
58
|
+
BinaryTree bt = new BinaryTree();
|
59
|
+
bt.root_node.Add(root);
|
60
|
+
|
61
|
+
return bt;
|
62
|
+
}
|
63
|
+
|
64
|
+
public static void compare(BinaryTree bt1, BinaryTree bt2)
|
65
|
+
{
|
66
|
+
Assert.AreEqual(bt1.root_node.Count, bt2.root_node.Count);
|
67
|
+
Assert.AreEqual(bt1.root_node[0].i32, bt2.root_node[0].i32);
|
68
|
+
Assert.AreEqual(bt1.root_node[0].next_node.Count, bt2.root_node[0].next_node.Count);
|
69
|
+
Assert.AreEqual(bt1.root_node[0].next_node[0].next_node[0].i32,
|
70
|
+
bt2.root_node[0].next_node[0].next_node[0].i32);
|
71
|
+
}
|
72
|
+
|
73
|
+
public static void serialize(Divine obj)
|
74
|
+
{
|
75
|
+
try
|
76
|
+
{
|
77
|
+
byte[] data = obj.serialize();
|
78
|
+
File.WriteAllBytes("test/binaryTree_test/csharp_test/bin.babel.csharp", data);
|
79
|
+
}
|
80
|
+
catch (System.IO.IOException ex)
|
81
|
+
{
|
82
|
+
throw ex;
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
public static byte[] deserialize(){
|
87
|
+
try
|
88
|
+
{
|
89
|
+
byte[] data = File.ReadAllBytes("test/binaryTree_test/csharp_test/bin.babel.csharp");
|
90
|
+
return data;
|
91
|
+
}
|
92
|
+
catch (System.IO.IOException ex)
|
93
|
+
{
|
94
|
+
throw ex;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
}
|
99
|
+
}
|